You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by GitBox <gi...@apache.org> on 2018/11/28 09:14:09 UTC

[GitHub] YorkShen closed pull request #1836: *[Android] update for weex dev-tool

YorkShen closed pull request #1836: *[Android] update for weex dev-tool
URL: https://github.com/apache/incubator-weex/pull/1836
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
index 15ae440ed0..99a883fe89 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/WXApplication.java
@@ -29,6 +29,7 @@
 import com.alibaba.weex.extend.adapter.ApmGenerator;
 import com.alibaba.weex.extend.adapter.DefaultAccessibilityRoleAdapter;
 import com.alibaba.weex.extend.adapter.InterceptWXHttpAdapter;
+import com.alibaba.weex.extend.adapter.WXAnalyzerDemoListener;
 import com.alibaba.weex.extend.component.RichText;
 import com.alibaba.weex.extend.component.WXComponentSyncTest;
 import com.alibaba.weex.extend.component.WXMask;
@@ -47,6 +48,7 @@
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.bridge.WXBridgeManager;
 import com.taobao.weex.common.WXException;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
 
 public class WXApplication extends Application {
 
@@ -80,6 +82,8 @@ public void onCreate() {
                                .setApmGenerater(new ApmGenerator())
                                .build()
                           );
+    WXSDKManager.getInstance().addWXAnalyzer(new WXAnalyzerDemoListener());
+    WXAnalyzerDataTransfer.isOpenPerformance = false;
 
     WXSDKManager.getInstance().setAccessibilityRoleAdapter(new DefaultAccessibilityRoleAdapter());
 
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/WXAnalyzerDemoListener.java b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/WXAnalyzerDemoListener.java
new file mode 100644
index 0000000000..ec8e1ea9e3
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/extend/adapter/WXAnalyzerDemoListener.java
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.alibaba.weex.extend.adapter;
+
+import android.util.Log;
+import com.taobao.weex.BuildConfig;
+import com.taobao.weex.performance.IWXAnalyzer;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
+
+/**
+ * @author zhongcang
+ * @date 2018/9/17
+ */
+public class WXAnalyzerDemoListener implements IWXAnalyzer {
+    @Override
+    public void transfer(String group, String module, String type, String data) {
+        //WXAnalyzerDataTransfer.switchInteractionLog(true);
+        if (BuildConfig.DEBUG){
+           // Log.d("WXAnalyzerDemoListener", "transfer: ");
+        }
+    }
+}
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 6b91c07f56..9bfc0fe7a6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -763,6 +763,8 @@ private void renderByUrlInternal(String pageName,
       renderOptions.put(BUNDLE_URL, url);
     }
 
+    getWXPerformance().pageName = pageName;
+
     mApmForInstance.doInit();
     mApmForInstance.setPageName(pageName);
 
@@ -1107,7 +1109,6 @@ public void onActivityPause() {
       if (mUserTrackAdapter != null) {
         mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.LOAD, mWXPerformance, getUserTrackParams());
       }
-      WXAnalyzerDataTransfer.transferPerformance(mWXPerformance, getInstanceId());
       isCommit=true;
     }
     // module listen Activity onActivityPause
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java b/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
index 6941d37ba0..ded55d4d73 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
@@ -18,10 +18,13 @@
  */
 package com.taobao.weex.bridge;
 
+import android.util.Log;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
 import com.taobao.weex.utils.WXReflectionUtils;
 
 import java.lang.reflect.Type;
@@ -41,6 +44,23 @@ public Object invoke(final Object target,final Invoker invoker,JSONArray args) t
     final Object[] params = prepareArguments(
             invoker.getParameterTypes(),
             args);
+
+    if (WXAnalyzerDataTransfer.isInteractionLogOpen() && invoker instanceof MethodInvoker) {
+      for (int i = 0; i < params.length; i++) {
+        if (params[i] instanceof SimpleJSCallback) {
+          final String callBackId = ((SimpleJSCallback)params[i]).getCallbackId();
+          Log.d(WXAnalyzerDataTransfer.INTERACTION_TAG, "[client][callNativeModuleStart]," + mInstanceId + "," + ((MethodInvoker) invoker).mMethod.getDeclaringClass() + "," + ((MethodInvoker) invoker).mMethod.getName() + "," + callBackId);
+          ((SimpleJSCallback) params[i]).setInvokerCallback(new SimpleJSCallback.InvokerCallback() {
+            @Override
+            public void onInvokeSuccess() {
+              Log.d(WXAnalyzerDataTransfer.INTERACTION_TAG, "[client][callNativeModuleEnd]," + mInstanceId + "," + ((MethodInvoker) invoker).mMethod.getDeclaringClass() + "," + ((MethodInvoker) invoker).mMethod.getName() + "," + callBackId);
+            }
+          });
+          break;
+        }
+      }
+    }
+
     if (invoker.isRunOnUIThread()) {
       WXSDKManager.getInstance().postOnUiThread(new Runnable() {
         @Override
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/SimpleJSCallback.java b/android/sdk/src/main/java/com/taobao/weex/bridge/SimpleJSCallback.java
index c4cf0518f9..8b9411ed35 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/SimpleJSCallback.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/SimpleJSCallback.java
@@ -22,9 +22,24 @@
  * Created by sospartan on 27/10/2016.
  */
 public class SimpleJSCallback implements JSCallback {
+
   String mInstanceId;
   String mCallbackId;
 
+  private InvokerCallback mInvokerCallback;
+
+  public void setInvokerCallback(InvokerCallback callback) {
+    this.mInvokerCallback = callback;
+  }
+
+  interface InvokerCallback {
+    void onInvokeSuccess();
+  }
+
+  public String getCallbackId() {
+    return mCallbackId;
+  }
+
   public SimpleJSCallback(String instanceId, String callbackId) {
     this.mCallbackId = callbackId;
     this.mInstanceId = instanceId;
@@ -34,6 +49,9 @@ public SimpleJSCallback(String instanceId, String callbackId) {
   @Override
   public void invoke(Object data) {
     WXBridgeManager.getInstance().callbackJavascript(mInstanceId, mCallbackId, data, false);
+    if (mInvokerCallback != null) {
+      mInvokerCallback.onInvokeSuccess();
+    }
   }
 
   @Override
diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WXAnalyzerDataTransfer.java b/android/sdk/src/main/java/com/taobao/weex/performance/WXAnalyzerDataTransfer.java
index 27c75f84f7..dc53c134e4 100644
--- a/android/sdk/src/main/java/com/taobao/weex/performance/WXAnalyzerDataTransfer.java
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXAnalyzerDataTransfer.java
@@ -16,18 +16,20 @@
  */
 package com.taobao.weex.performance;
 
+import java.util.List;
+
+import android.util.Log;
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.bridge.WXBridgeManager;
+import com.taobao.weex.bridge.WXJSObject;
 import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXJSExceptionInfo;
-import com.taobao.weex.common.WXPerformance;
-
+import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.utils.WXUtils;
 import org.json.JSONObject;
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * @author zhongcang
  * @date 2018/2/28
@@ -36,51 +38,73 @@
 public class WXAnalyzerDataTransfer {
 
   private static final String GROUP = "WXAnalyzer";
-  private static final String MODULE_PERFORMANCE = "WXPerformance";
   private static final String MODULE_ERROR = "WXError";
+  private static final String MODULE_WX_APM = "wxapm";
+  public static boolean isOpenPerformance = false;
+  public static final String INTERACTION_TAG = "wxInteractionAnalyzer";
+  private static boolean sOpenInteractionLog;
 
 
-  public static void transferPerformance(WXPerformance performance, String instanceId) {
-    if (!WXEnvironment.isApkDebugable()) {
+  public static void transferPerformance(String instanceId,String type,String key,Object value)
+  {
+      if (!isOpenPerformance){
+          return;
+      }
+      if (sOpenInteractionLog && "stage".equals(type)){
+          Log.d(INTERACTION_TAG, "[client][stage]"+instanceId+","+key+","+value);
+      }
+      List<IWXAnalyzer> transferList = WXSDKManager.getInstance().getWXAnalyzerList();
+      if (null == transferList || transferList.size() == 0) {
+          return;
+      }
+
+      WXSDKInstance instance = WXSDKManager.getInstance().getAllInstanceMap().get(instanceId);
+      if (null == instance){
+          return;
+      }
+
+      String data;
+      try {
+        data = new JSONObject().put(key,value).toString();
+      }catch (Exception e){
+        e.printStackTrace();
+        return;
+      }
+
+      for (IWXAnalyzer transfer : transferList) {
+          transfer.transfer(MODULE_WX_APM, instance.getInstanceId(), type, data);
+      }
+  }
+
+  public static void transferInteractionInfo(WXComponent targetComponent){
+    if (!isOpenPerformance){
       return;
     }
+
     List<IWXAnalyzer> transferList = WXSDKManager.getInstance().getWXAnalyzerList();
     if (null == transferList || transferList.size() == 0) {
       return;
     }
-
-
-    WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
-    if (null == instance) {
-      return;
-    }
-    String data = "";
-    try {
-      JSONObject dimensionMap = new JSONObject();
-      JSONObject measureMap = new JSONObject();
-
-      for (Map.Entry<String, String> entry : performance.getDimensionMap().entrySet()) {
-        dimensionMap.put(entry.getKey(), entry.getValue());
-      }
-      for (Map.Entry<String, Double> entry : performance.getMeasureMap().entrySet()) {
-        measureMap.put(entry.getKey(), entry.getValue());
-      }
-
+    long renderOriginDiffTime = WXUtils.getFixUnixTime() - targetComponent.getInstance().getWXPerformance().renderUnixTimeOrigin;
+    String data;
+    try{
       data = new JSONObject()
-              .put("instanceId", instanceId)
-              .put("url", instance.getBundleUrl())
-              .put("dimensionMap", dimensionMap)
-              .put("measureMap", measureMap)
-              .toString();
-
-    } catch (Exception e) {
+          .put("renderOriginDiffTime",renderOriginDiffTime)
+          .put("type",targetComponent.getComponentType())
+          .put("ref",targetComponent.getRef())
+          .put("style",targetComponent.getStyles())
+          .put("attrs",targetComponent.getAttrs())
+          .toString();
+    }catch (Exception e){
       e.printStackTrace();
+      return;
     }
     for (IWXAnalyzer transfer : transferList) {
-      transfer.transfer(GROUP, MODULE_PERFORMANCE, "instance", data);
+      transfer.transfer(MODULE_WX_APM, targetComponent.getInstanceId(), "wxinteraction", data);
     }
   }
 
+
   public static void transferError(WXJSExceptionInfo exceptionInfo, String instanceId) {
     if (!WXEnvironment.isApkDebugable()) {
       return;
@@ -112,27 +136,29 @@ public static void transferError(WXJSExceptionInfo exceptionInfo, String instanc
     }
   }
 
-  public static void transferFps(long fps) {
-    if (!WXEnvironment.isApkDebugable()) {
-      return;
-    }
-    List<IWXAnalyzer> transferList = WXSDKManager.getInstance().getWXAnalyzerList();
-    if (null == transferList || transferList.size() == 0) {
-      return;
-    }
-    String data = "";
-    try {
-      data = new JSONObject().put("fps", fps).toString();
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
-    for (IWXAnalyzer transfer : transferList) {
-      transfer.transfer(GROUP, MODULE_PERFORMANCE, "fps", data);
-    }
+  public static void switchInteractionLog(final boolean isOpen){
+      if ( sOpenInteractionLog == isOpen || !WXEnvironment.JsFrameworkInit){
+          return;
+      }
+      sOpenInteractionLog = isOpen;
+      //for jsfm && jsengin
+      WXBridgeManager.getInstance().post(new Runnable() {
+          @Override
+          public void run() {
+              WXJSObject[] args = {new WXJSObject(isOpen?1:0)};
+              WXBridgeManager.getInstance().invokeExecJS(
+                  "",
+                  null,
+                  "switchInteractionLog",
+                  args,
+                  false);
+          }
+      });
+      //for weex_core
+      WXBridgeManager.getInstance().registerCoreEnv("switchInteractionLog",String.valueOf(isOpen));
   }
 
-//  @Override
-//  public void transfer2(String tag, String module, String type, String data) {
-//    WXLogUtils.d(tag, module + ":" + type + ":" + data);
-//  }
+  public static boolean isInteractionLogOpen(){
+     return sOpenInteractionLog;
+  }
 }
\ No newline at end of file
diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
index 88dfbd8256..a73b222686 100644
--- a/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
@@ -155,9 +155,17 @@ public void onStageWithTime(String name,long time){
         if (null != instance){
             instance.getExceptionRecorder().recordStage(name, time);
         }
-        if (null == apmInstance || mEnd) {
+        if (mEnd){
+            return;
+        }
+        if(WXAnalyzerDataTransfer.isOpenPerformance){
+            WXAnalyzerDataTransfer.transferPerformance(mInstanceId,"stage",name,time);
+        }
+
+        if (null == apmInstance) {
             return;
         }
+
         apmInstance.onStage(name, time);
     }
 
@@ -166,7 +174,15 @@ public void onStageWithTime(String name,long time){
      * record property
      */
     public void addProperty(String key, Object value) {
-        if (null == apmInstance || mEnd) {
+        if (mEnd){
+            return;
+        }
+
+        if(WXAnalyzerDataTransfer.isOpenPerformance){
+            WXAnalyzerDataTransfer.transferPerformance(mInstanceId,"properties",key,value);
+        }
+
+        if (null == apmInstance) {
             return;
         }
         apmInstance.addProperty(key, value);
@@ -176,7 +192,14 @@ public void addProperty(String key, Object value) {
      * record statistic
      */
     public void addStats(String key, double value) {
-        if (null == apmInstance || mEnd) {
+        if (mEnd){
+            return;
+        }
+        if(WXAnalyzerDataTransfer.isOpenPerformance){
+            WXAnalyzerDataTransfer.transferPerformance(mInstanceId,"stats",key,value);
+        }
+
+        if (null == apmInstance) {
             return;
         }
         apmInstance.addStats(key, value);
@@ -272,25 +295,38 @@ public void arriveInteraction(WXComponent targetComponent) {
         if (null == apmInstance || null == targetComponent || targetComponent.getInstance() == null ) {
             return;
         }
+
+        if (WXAnalyzerDataTransfer.isOpenPerformance){
+            WXAnalyzerDataTransfer.transferInteractionInfo(targetComponent);
+        }
+
+
+        if (null == apmInstance){
+            return;
+        }
+
         WXPerformance performanceRecord = targetComponent.getInstance().getWXPerformance();
         if (null == performanceRecord){
             return;
         }
 
+        long curTime = WXUtils.getFixUnixTime();
+
+        if (WXAnalyzerDataTransfer.isInteractionLogOpen()){
+            Log.d(WXAnalyzerDataTransfer.INTERACTION_TAG, "[client][wxinteraction]"
+                + targetComponent.getInstance().getInstanceId()
+                +","+targetComponent.getComponentType()
+                +","+targetComponent.getRef()
+                +","+targetComponent.getStyles()
+                +","+targetComponent.getAttrs()
+            );
+        }
+
         if (!hasRecordFistInteractionView){
             onStage(KEY_PAGE_STAGES_FIRST_INTERACTION_VIEW);
             hasRecordFistInteractionView = true;
         }
 
-        long curTime = WXUtils.getFixUnixTime();
-
-        if (BuildConfig.DEBUG){
-            Log.d("wxapm", "screenComponent ["+targetComponent.getComponentType()+","+targetComponent.getRef()
-                +"], renderTime:"+ (curTime -performanceRecord.renderUnixTimeOrigin)
-                +",style:"+targetComponent.getStyles()
-                +",attrs:"+targetComponent.getAttrs());
-        }
-
         performanceRecord.interactionTime = curTime - performanceRecord.renderUnixTimeOrigin;
         onStageWithTime(KEY_PAGE_STAGES_INTERACTION,curTime);
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
index 3295d8f777..1eaae47407 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
@@ -24,10 +24,13 @@
 import android.support.annotation.WorkerThread;
 import android.support.v4.util.ArrayMap;
 import android.text.TextUtils;
+import android.util.Log;
+import com.taobao.weex.BuildConfig;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.dom.transition.WXTransition;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXVContainer;
 import com.taobao.weex.utils.WXExceptionUtils;
@@ -67,7 +70,9 @@ public GraphicActionAddElement(@NonNull WXSDKInstance instance, String ref,
     if (instance.getContext() == null) {
       return;
     }
-
+      if (WXAnalyzerDataTransfer.isInteractionLogOpen()){
+        Log.d(WXAnalyzerDataTransfer.INTERACTION_TAG, "[client][addelementStart]"+instance.getInstanceId()+","+componentType+","+ref);
+      }
     try {
       parent = (WXVContainer) WXSDKManager.getInstance().getWXRenderManager()
           .getWXComponent(getPageId(), mParentRef);
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
index a0a5c1dc49..11a79c1ae2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
@@ -56,6 +56,7 @@
 import com.taobao.weex.common.WXImageSharpen;
 import com.taobao.weex.common.WXImageStrategy;
 import com.taobao.weex.common.WXRuntimeException;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
 import com.taobao.weex.performance.WXInstanceApm;
 import com.taobao.weex.ui.ComponentCreator;
 import com.taobao.weex.ui.action.BasicComponentData;
@@ -464,6 +465,11 @@ private void monitorImgSize(ImageView imageView,String currentImgUrlStr){
       preImgUrlStr = currentImgUrlStr;
       if (imgHeight > 1081 && imgWidth > 721){
         instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_LARGE_IMG_COUNT,1);
+        if (WXAnalyzerDataTransfer.isOpenPerformance){
+          WXAnalyzerDataTransfer.transferPerformance(getInstanceId(),"details",WXInstanceApm.KEY_PAGE_STATS_LARGE_IMG_COUNT,
+              imgWidth+"*"+imgHeight+","+currentImgUrlStr
+              );
+        }
       }
       long imgSize = imgHeight * imgWidth;
       long viewSize = imageView.getMeasuredHeight() * imageView.getMeasuredWidth();
@@ -475,6 +481,13 @@ private void monitorImgSize(ImageView imageView,String currentImgUrlStr){
       if (scaleSize >1.2 && imgSize-viewSize > 1600){
         instance.getWXPerformance().wrongImgSizeCount++;
         instance.getApmForInstance().updateDiffStats(WXInstanceApm.KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT,1);
+
+        if (WXAnalyzerDataTransfer.isOpenPerformance){
+          WXAnalyzerDataTransfer.transferPerformance(getInstanceId(),"details",WXInstanceApm.KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT,
+              String.format("imgSize:[%d,%d],viewSize:[%d,%d],urL:%s",imgWidth,imgHeight,imageView.getMeasuredWidth(),imageView.getMeasuredHeight()
+              ,currentImgUrlStr)
+          );
+        }
       }
     }
 
diff --git a/weex_core/Source/core/config/core_environment.cpp b/weex_core/Source/core/config/core_environment.cpp
index 63eea5f41e..9c51c78997 100644
--- a/weex_core/Source/core/config/core_environment.cpp
+++ b/weex_core/Source/core/config/core_environment.cpp
@@ -82,5 +82,9 @@ namespace WeexCore {
 
   void WXCoreEnvironment::AddOption(std::string key, std::string value) {
     mOptions.insert(std::pair<std::string, std::string>(key, value));
+    if (key == "switchInteractionLog"){
+      mInteractionLogSwitch = "true" == value;
+    }
+
   }
 }
diff --git a/weex_core/Source/core/config/core_environment.h b/weex_core/Source/core/config/core_environment.h
index ae41ec2482..70c10dece5 100644
--- a/weex_core/Source/core/config/core_environment.h
+++ b/weex_core/Source/core/config/core_environment.h
@@ -54,6 +54,8 @@ namespace WeexCore {
 
     std::map<std::string, std::string> mOptions;
 
+    bool mInteractionLogSwitch;
+
   public:
 
     bool SetPlatform(std::string platformName);
@@ -78,6 +80,10 @@ namespace WeexCore {
         mDeviceWidth = width;
     }
 
+    inline bool isInteractionLogOpen(){
+        return mInteractionLogSwitch;
+    }
+
     const float DeviceWidth();
 
     const float DeviceHeight();
diff --git a/weex_core/Source/core/render/page/render_page.cpp b/weex_core/Source/core/render/page/render_page.cpp
index 875cd3de09..543e9a5576 100644
--- a/weex_core/Source/core/render/page/render_page.cpp
+++ b/weex_core/Source/core/render/page/render_page.cpp
@@ -157,6 +157,10 @@ bool RenderPage::AddRenderObject(const std::string &parent_ref,
   if (parent == nullptr || child == nullptr) {
     return false;
   }
+    
+  if (WeexCore::WXCoreEnvironment::getInstance()->isInteractionLogOpen()){
+    LOGD("wxInteractionAnalyzer: [weexcore][addElementStart],%s,%s,%s",this->page_id().c_str(),child->type().c_str(),child->ref().c_str());
+  }
 
   // add child to Render Tree
   insert_posiotn = parent->AddRenderObject(insert_posiotn, child);
@@ -168,6 +172,9 @@ bool RenderPage::AddRenderObject(const std::string &parent_ref,
   SendAddElementAction(child, parent, insert_posiotn, false);
 
   Batch();
+  if (WeexCore::WXCoreEnvironment::getInstance()->isInteractionLogOpen()){
+    LOGD("wxInteractionAnalyzer: [weexcore][addElementEnd],%s,%s,%s",this->page_id().c_str(),child->type().c_str(),child->ref().c_str());
+  }
   return true;
 }
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services