You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by do...@apache.org on 2019/07/18 03:43:59 UTC

[incubator-weex] branch master updated: [Android] add jsthread watch log && more log (#2722)

This is an automated email from the ASF dual-hosted git repository.

dongyayun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git


The following commit(s) were added to refs/heads/master by this push:
     new 1ee8c74  [Android] add jsthread watch log && more log (#2722)
1ee8c74 is described below

commit 1ee8c7432a10b47df454b4db5538dabeabd6c03c
Author: chen <lu...@users.noreply.github.com>
AuthorDate: Thu Jul 18 11:43:53 2019 +0800

    [Android] add jsthread watch log && more log (#2722)
    
    [Android] fix cycle init
    
    [Android] record reInitCount when ws && instance data
---
 .../src/main/java/com/taobao/weex/WXSDKEngine.java |  2 +
 .../main/java/com/taobao/weex/WXSDKInstance.java   |  2 +
 .../main/java/com/taobao/weex/bridge/WXBridge.java | 13 +++++++
 .../com/taobao/weex/bridge/WXBridgeManager.java    | 19 ++++++++--
 .../com/taobao/weex/performance/WXInstanceApm.java |  1 +
 .../com/taobao/weex/performance/WXStateRecord.java | 43 +++++++++++++++++++---
 6 files changed, 71 insertions(+), 9 deletions(-)

diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
index aa4e01a..62e8896 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -51,6 +51,7 @@ import com.taobao.weex.common.WXException;
 import com.taobao.weex.common.WXInstanceWrap;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.http.WXStreamModule;
+import com.taobao.weex.performance.WXStateRecord;
 import com.taobao.weex.ui.ExternalLoaderComponentHolder;
 import com.taobao.weex.ui.IExternalComponentGetter;
 import com.taobao.weex.ui.IExternalModuleGetter;
@@ -243,6 +244,7 @@ public class WXSDKEngine implements Serializable {
         WXLogUtils.renderPerformanceLog("SDKInitExecuteTime", WXEnvironment.sSDKInitExecuteTime);
       }
     });
+    WXStateRecord.getInstance().startJSThreadWatchDog();
     register();
   }
 
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 d531d0f..02a17db 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -1658,6 +1658,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
   }
 
   public void onRenderError(final String errCode, final String msg) {
+    WXStateRecord.getInstance().recordException(getInstanceId(),"onRenderError,"+errCode+","+msg);
     if (mRenderListener != null && mContext != null) {
       WXLogUtils.e("onRenderError "+errCode +","+msg);
       runOnUiThread(new Runnable() {
@@ -1673,6 +1674,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
   }
 
   public void onJSException(final String errCode, final String function, final String exception) {
+    WXStateRecord.getInstance().recordException(getInstanceId(),"onJSException,"+errCode+","+function+"|"+exception);
     hasException = true;
     if (mRenderListener != null && mContext != null) {
       WXLogUtils.e("onJSException "+errCode +","+exception);
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index 2629117..d311617 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -139,6 +139,7 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public void updateInitFrameworkParams(String key, String value, String desc){
+    WXStateRecord.getInstance().recordAction("","updateInitFrameworkParams:");
      nativeUpdateInitFrameworkParams(key, value, desc);
   }
 
@@ -150,24 +151,29 @@ public class WXBridge implements IWXBridge {
   @Override
   public int initFrameworkEnv(String framework, WXParams params, String cacheDir, boolean pieSupport) {
     if (MULTIPROCESS) {
+      WXStateRecord.getInstance().recordAction("","nativeInitFrameworkEnv:");
       return nativeInitFrameworkEnv(framework, params, cacheDir, pieSupport);
     } else {
+      WXStateRecord.getInstance().recordAction("","nativeInitFramework:");
       return nativeInitFramework(framework, params);
     }
   }
 
   @Override
   public void refreshInstance(String instanceId, String namespace, String function, WXJSObject[] args) {
+    WXStateRecord.getInstance().recordAction(instanceId,"refreshInstance:"+namespace+","+function);
     nativeRefreshInstance(instanceId, namespace, function, args);
   }
 
   @Override
   public int execJS(String instanceId, String namespace, String function, WXJSObject[] args) {
+    WXStateRecord.getInstance().recordAction(instanceId,"execJS:"+namespace+","+function);
     return nativeExecJS(instanceId, namespace, function, args);
   }
 
   @Override
   public void execJSWithCallback(String instanceId, String namespace, String function, WXJSObject[] args, ResultCallback callback) {
+    WXStateRecord.getInstance().recordAction(instanceId,"execJSWithCallback:"+namespace+","+function);
     if (callback == null) {
       execJS(instanceId, namespace, function, args);
     }
@@ -178,6 +184,7 @@ public class WXBridge implements IWXBridge {
   // Result from js engine
   @CalledByNative
   public void onReceivedResult(long callbackId, byte[] result) {
+    WXStateRecord.getInstance().recordAction("onReceivedResult","callbackId"+callbackId);
     ResultCallback callback = ResultCallbackManager.removeCallbackById(callbackId);
     if (callback != null) {
        callback.onReceiveResult(result);
@@ -186,6 +193,7 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public int execJSService(String javascript) {
+    WXStateRecord.getInstance().recordAction("execJSService","execJSService:");
     return nativeExecJSService(javascript);
   }
 
@@ -197,16 +205,19 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public int createInstanceContext(String instanceId, String name, String function, WXJSObject[] args) {
+    WXStateRecord.getInstance().recordAction(instanceId,"createInstanceContext:");
     return nativeCreateInstanceContext(instanceId, name, function, args);
   }
 
   @Override
   public int destoryInstance(String instanceId, String name, String function, WXJSObject[] args) {
+    WXStateRecord.getInstance().recordAction(instanceId,"destoryInstance:");
     return nativeDestoryInstance(instanceId, name, function, args);
   }
 
   @Override
   public String execJSOnInstance(String instanceId, String script, int type) {
+    WXStateRecord.getInstance().recordAction(instanceId,"execJSOnInstance:"+type);
     return nativeExecJSOnInstance(instanceId, script, type);
   }
 
@@ -285,6 +296,7 @@ public class WXBridge implements IWXBridge {
   @CalledByNative
   public Object callNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
     try {
+      WXStateRecord.getInstance().recordAction(instanceId,"callNativeModule:"+module+"."+method);
       long start = WXUtils.getFixUnixTime();
       WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
       JSONArray argArray = null;
@@ -367,6 +379,7 @@ public class WXBridge implements IWXBridge {
   @Override
   @CalledByNative
   public void callNativeComponent(String instanceId, String ref, String method, byte[] arguments, byte[] optionsData) {
+    WXStateRecord.getInstance().recordAction(instanceId,"callNativeComponent:"+method);
     try{
       WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
       JSONArray argArray = null;
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index 2c88e88..8ee6f23 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -182,7 +182,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
   private static final int CRASHREINIT = 50;
   static volatile WXBridgeManager mBridgeManager;
   private static long LOW_MEM_VALUE = 120;
-  private volatile static int reInitCount = 1;
+  public volatile static int reInitCount = 1;
   private static String crashUrl = null;
   private static long lastCrashTime = 0;
 
@@ -357,6 +357,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
 
   private void setJSFrameworkInit(boolean init) {
     mInit = init;
+    WXStateRecord.getInstance().recoreJsfmInitHistory("setJsfmInitFlag:"+init);
     if (init == true) {
       onJsFrameWorkInitSuccees();
     }
@@ -615,8 +616,6 @@ public class WXBridgeManager implements Callback, BactchExecutor {
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
 
-    WXStateRecord.getInstance().recordAction(instanceId,"callNativeModule:"+module+"."+method);
-
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callNativeModule >>>> instanceId:").append(instanceId)
               .append(", module:").append(module).append(", method:").append(method).append(", arguments:").append(arguments);
@@ -728,11 +727,13 @@ public class WXBridgeManager implements Callback, BactchExecutor {
                 dom.callDomMethod(task, parseNanos);
               } else {
                 JSONObject optionObj = task.getJSONObject(OPTIONS);
+                WXStateRecord.getInstance().recordAction(instanceId,"callModuleMethod:"+instanceId+","+module+","+task.get(METHOD));
                 callModuleMethod(instanceId, (String) module,
                         (String) task.get(METHOD), (JSONArray) task.get(ARGS), optionObj);
               }
             } else if (task.get(COMPONENT) != null) {
               WXDomModule dom = WXModuleManager.getDomModule(instanceId);
+              WXStateRecord.getInstance().recordAction(instanceId,"callDomMethod:"+instanceId+","+task.get(METHOD));
               dom.invokeMethod((String) task.get(REF), (String) task.get(METHOD), (JSONArray) task.get(ARGS));
             } else {
               throw new IllegalArgumentException("unknown callNative");
@@ -1477,6 +1478,8 @@ public class WXBridgeManager implements Callback, BactchExecutor {
               WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() +
                       " instanceId==" + instanceId + " template ==" + template + " mJSHandler== " + mJSHandler.toString()
       );
+
+      instance.getApmForInstance().onStage("createInstance failed return; "+TextUtils.isEmpty(instanceId)+ ","+template.isEmpty()+","+(mJSHandler ==null));
       return;
     }
 
@@ -1485,6 +1488,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
               WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
               WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() +
                       " isJSFrameworkInit==" + isJSFrameworkInit() + " reInitCount == 1" );
+      instance.getApmForInstance().onStage("createInstance failed jsfm isn't init return;");
       post(new Runnable() {
         @Override
         public void run() {
@@ -1499,6 +1503,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     post(new Runnable() {
       @Override
       public void run() {
+        instance.getApmForInstance().onStage("wxLoadBundleStartOnJsThread");
         long start = System.currentTimeMillis();
         mWXBridge.setPageArgument(instanceId, "renderTimeOrigin", String.valueOf(instance.getWXPerformance().renderTimeOrigin));
         mWXBridge.setInstanceRenderType(instance.getInstanceId(), instance.getRenderType());
@@ -1527,6 +1532,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
                 WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg()
         );
         WXLogUtils.e(err);
+        instance.getApmForInstance().onStage("framework.js uninitialized and return");
         return;
       }
 
@@ -1646,6 +1652,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         // if { "framework": "Vue" } or  { "framework": "Rax" } will use invokeCreateInstanceContext
         // others will use invokeExecJS
         if (!isSandBoxContext) {
+          instance.getApmForInstance().onStage("!isSandBoxContext,and excute");
           invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
           return;
         }
@@ -1653,6 +1660,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
                 || instance.getRenderStrategy() == WXRenderStrategy.DATA_RENDER
                 || instance.getRenderStrategy() == WXRenderStrategy.DATA_RENDER_BINARY
                 || instance.getRenderStrategy() == WXRenderStrategy.JSON_RENDER) {
+          instance.getApmForInstance().onStage("wxBeforeInvokeCreateInstanceContext");
           int ret = invokeCreateInstanceContext(instance.getInstanceId(), null, "createInstanceContext", args, false);
           instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END);
           if(ret == 0) {
@@ -1672,7 +1680,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
           //      WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE.getErrorMsg(),
           //      null
           //);
-
+          instance.getApmForInstance().onStage("StartInvokeExecJSBadBundleType");
           invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
           instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END);
           return;
@@ -1680,6 +1688,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
       } catch (Throwable e) {
         String err = "[WXBridgeManager] invokeCreateInstance " + e.getCause()
                 + instance.getTemplateInfo();
+        instance.getApmForInstance().onStage("createInstance error :"+e.toString());
 
         instance.onRenderError(
                 WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
@@ -3120,6 +3129,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
       long start = System.currentTimeMillis();
       WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
       if (instance != null) {
+        instance.getApmForInstance().onStage("callCreateFinish");
         instance.firstScreenCreateInstanceTime(start);
         GraphicActionCreateFinish action = new GraphicActionCreateFinish(instance);
         WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(instanceId, action);
@@ -3157,6 +3167,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     try {
       WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
       if (instance != null) {
+        instance.getApmForInstance().onStage("callRenderSuccess");
         GraphicActionRenderSuccess action = new GraphicActionRenderSuccess(instance);
         WXSDKManager.getInstance().getWXRenderManager().postGraphicAction(instanceId, action);
       }
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 d97759a..28f5765 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
@@ -317,6 +317,7 @@ public class WXInstanceApm {
         addProperty(KEY_PAGE_PROPERTIES_JSLIB_VERSION, WXEnvironment.JS_LIB_SDK_VERSION);
         addProperty(KEY_PAGE_PROPERTIES_WEEX_VERSION, WXEnvironment.WXSDK_VERSION);
         addProperty(KEY_PAGE_PROPERTIES_WEEX_VERSION, WXEnvironment.WXSDK_VERSION);
+        addStats("wxReInitCount",WXBridgeManager.reInitCount);
         if (null != instance){
             addProperty(KEY_PAGE_PROPERTIES_UIKIT_TYPE, instance.getRenderType());
         }
diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java b/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java
index 0932508..e2e1bd6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java
@@ -23,6 +23,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
 
+import com.taobao.weex.bridge.WXBridgeManager;
+import com.taobao.weex.ui.IFComponentHolder;
 import com.taobao.weex.utils.WXUtils;
 
 /**
@@ -36,6 +38,7 @@ public class WXStateRecord {
     private RecordList<Info> mJsfmInitHistory;
     private RecordList<Info> mJscCrashHistory;
     private RecordList<Info> mJscReloadHistory;
+    private RecordList<Info> mJsThradWatchHistory;
 
     private static class SingleTonHolder {
         private static final WXStateRecord S_INSTANCE = new WXStateRecord();
@@ -46,11 +49,12 @@ public class WXStateRecord {
     }
 
     private WXStateRecord() {
-        mExceptionHistory = new RecordList<>(5);
+        mExceptionHistory = new RecordList<>(10);
         mActionHistory = new RecordList<>(20);
-        mJsfmInitHistory = new RecordList<>(3);
-        mJscCrashHistory = new RecordList<>(3);
-        mJscReloadHistory = new RecordList<>(5);
+        mJsfmInitHistory = new RecordList<>(10);
+        mJscCrashHistory = new RecordList<>(10);
+        mJscReloadHistory = new RecordList<>(10);
+        mJsThradWatchHistory = new RecordList<>(20);
     }
 
     /**
@@ -72,7 +76,15 @@ public class WXStateRecord {
      * check onJSFMInit time,and we know when jsfm is init sucess in reloadJsEngine case
      */
     public void onJSFMInit() {
-        mJsfmInitHistory.add(new Info(WXUtils.getFixUnixTime(), "JSFM", "onJsfmInit"));
+        recoreJsfmInitHistory("setJsfmVersion");
+    }
+
+    public void recoreJsfmInitHistory(String msg){
+        mJsfmInitHistory.add(new Info(WXUtils.getFixUnixTime(), "JSFM", msg));
+    }
+
+    public void recordJsThreadWatch(String msg){
+        mJsThradWatchHistory.add(new Info(WXUtils.getFixUnixTime(), "jsWatch", msg));
     }
 
     /**
@@ -96,6 +108,8 @@ public class WXStateRecord {
         stateInfo.put("jsfmInitHistory", mJsfmInitHistory.toString());
         stateInfo.put("jscCrashHistory", mJscCrashHistory.toString());
         stateInfo.put("jscReloadHistory", mJscReloadHistory.toString());
+        stateInfo.put("jsThreadWatch", mJsThradWatchHistory.toString());
+        stateInfo.put("reInitCount", String.valueOf(WXBridgeManager.reInitCount));
         return stateInfo;
     }
 
@@ -144,4 +158,23 @@ public class WXStateRecord {
                 .toString();
         }
     }
+
+    public void startJSThreadWatchDog(){
+        WXBridgeManager.getInstance().post(jsThreadWatchTask);
+    }
+
+    private  long jsThreadTime =-1;
+
+    private Runnable jsThreadWatchTask = new Runnable() {
+        @Override
+        public void run() {
+            if (jsThreadTime == -1){
+                jsThreadTime = WXUtils.getFixUnixTime();
+            }
+            long diff = WXUtils.getFixUnixTime() - jsThreadTime;
+            recordJsThreadWatch("diff:"+diff);
+            jsThreadTime = WXUtils.getFixUnixTime();
+            WXBridgeManager.getInstance().postDelay(jsThreadWatchTask,500);
+        }
+    };
 }