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);
+ }
+ };
}