From 4eef29d6b01db7e50239894d8d2ec697945dd7ef Mon Sep 17 00:00:00 2001 From: darin Date: Wed, 28 Nov 2018 17:51:35 +0800 Subject: [PATCH] *[Android] add jsc adapter to control jsc process reboot --- .../main/java/com/taobao/weex/InitConfig.java | 17 ++++++++++++ .../java/com/taobao/weex/WXSDKInstance.java | 22 +++++++-------- .../java/com/taobao/weex/WXSDKManager.java | 7 ++++- .../weex/adapter/IWXJscProcessManager.java | 27 +++++++++++++++++++ .../taobao/weex/bridge/WXBridgeManager.java | 20 ++------------ 5 files changed, 63 insertions(+), 30 deletions(-) create mode 100644 android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java diff --git a/android/sdk/src/main/java/com/taobao/weex/InitConfig.java b/android/sdk/src/main/java/com/taobao/weex/InitConfig.java index 219cc02409..d87c28f4c2 100644 --- a/android/sdk/src/main/java/com/taobao/weex/InitConfig.java +++ b/android/sdk/src/main/java/com/taobao/weex/InitConfig.java @@ -20,6 +20,7 @@ import com.taobao.weex.adapter.ClassLoaderAdapter; import com.taobao.weex.adapter.IDrawableLoader; +import com.taobao.weex.adapter.IWXJscProcessManager; import com.taobao.weex.adapter.IWXHttpAdapter; import com.taobao.weex.adapter.IWXImgLoaderAdapter; import com.taobao.weex.adapter.IWXJSExceptionAdapter; @@ -48,6 +49,7 @@ public class InitConfig { private ClassLoaderAdapter classLoaderAdapter; private IApmGenerator apmGenerater; private IWXJsFileLoaderAdapter jsFileLoaderAdapter; + private IWXJscProcessManager jscProcessManager; public IWXHttpAdapter getHttpAdapter() { return httpAdapter; @@ -105,6 +107,9 @@ public InitConfig setClassLoaderAdapter(ClassLoaderAdapter classLoaderAdapter) { public IWXJSExceptionAdapter getJSExceptionAdapter() { return mJSExceptionAdapter; } + public IWXJscProcessManager getJscProcessManager() { + return jscProcessManager; + } private InitConfig() { } @@ -124,6 +129,17 @@ public static class Builder{ IApmGenerator apmGenerater; private IWXJsFileLoaderAdapter jsFileLoaderAdapter; + public IWXJscProcessManager getJscProcessManager() { + return jscProcessManager; + } + + public Builder setJscProcessManager(IWXJscProcessManager jscProcessManager) { + this.jscProcessManager = jscProcessManager; + return this; + } + + IWXJscProcessManager jscProcessManager; + public Builder(){ } @@ -208,6 +224,7 @@ public InitConfig build(){ config.classLoaderAdapter = this.classLoaderAdapter; config.apmGenerater = this.apmGenerater; config.jsFileLoaderAdapter = this.jsFileLoaderAdapter; + config.jscProcessManager = this.jscProcessManager; return config; } } 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 c158e8f144..32c3dd9c28 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java @@ -40,6 +40,7 @@ import com.alibaba.fastjson.JSONObject; import com.taobao.weex.adapter.IDrawableLoader; +import com.taobao.weex.adapter.IWXJscProcessManager; import com.taobao.weex.adapter.IWXHttpAdapter; import com.taobao.weex.adapter.IWXImgLoaderAdapter; import com.taobao.weex.adapter.IWXUserTrackAdapter; @@ -447,7 +448,13 @@ public final WXSDKInstance createNestedInstance(NestedContainer container){ protected WXSDKInstance newNestedInstance() { return new WXSDKInstance(mContext); } + public boolean isHasException() { + return hasException; + } + public void setHasException(boolean hasException) { + this.hasException = hasException; + } public void addOnInstanceVisibleListener(OnInstanceVisibleListener l){ mVisibleListeners.add(l); } @@ -710,8 +717,9 @@ private void renderInternal(String pageName, WXSDKManager.getInstance().createInstance(this, template, renderOptions, jsonInitData); mRendered = true; + final IWXJscProcessManager wxJscProcessManager = WXSDKManager.getInstance().getWXJscProcessManager(); - if(WXBridgeManager.getInstance().isIsRebootJscWhenWhiteScreen()) { + if(wxJscProcessManager != null && wxJscProcessManager.shouldReboot()) { WXSDKManager.getInstance().postOnUiThread(new Runnable() { @Override public void run() { @@ -722,22 +730,14 @@ public void run() { View containerView = getContainerView(); if(containerView instanceof ViewGroup) { if(0 == ((ViewGroup) containerView).getChildCount()) { - boolean isWxActivity = false; - if(mContext != null && mContext.getClass() != null) { - String name = mContext.getClass().getName(); - if(!TextUtils.isEmpty(name)) { - isWxActivity = name.contains("WXActivity"); - } - } - - if(!isWxActivity) { + if(wxJscProcessManager.withException(WXSDKInstance.this)) { onJSException(String.valueOf(WX_ERR_RELOAD_PAGE),"jsc reboot","jsc reboot"); } WXBridgeManager.getInstance().callReportCrashReloadPage(mInstanceId, null); } } } - }, WXBridgeManager.getInstance().getRebootJscTimeout()); + }, wxJscProcessManager.rebootTimeout()); } } diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java index d530bd443b..afd2a4cb99 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java @@ -28,6 +28,7 @@ import com.taobao.weex.adapter.DefaultWXHttpAdapter; import com.taobao.weex.adapter.ICrashInfoReporter; import com.taobao.weex.adapter.IDrawableLoader; +import com.taobao.weex.adapter.IWXJscProcessManager; import com.taobao.weex.adapter.ITracingAdapter; import com.taobao.weex.adapter.IWXAccessibilityRoleAdapter; import com.taobao.weex.adapter.IWXHttpAdapter; @@ -96,6 +97,7 @@ public class WXSDKManager { private IWebSocketAdapterFactory mIWebSocketAdapterFactory; private ITracingAdapter mTracingAdapter; private WXValidateProcessor mWXValidateProcessor; + private IWXJscProcessManager mWXJscProcessManager; // Tell weexv8 to initialize v8, default is true. private boolean mNeedInitV8 = true; @@ -209,7 +211,9 @@ public WXBridgeManager getWXBridgeManager() { public WXRenderManager getWXRenderManager() { return mWXRenderManager; } - + public IWXJscProcessManager getWXJscProcessManager() { + return mWXJscProcessManager; + } public WXWorkThreadManager getWXWorkThreadManager() { return mWXWorkThreadManager; } @@ -399,6 +403,7 @@ void setInitConfig(InitConfig config){ this.mClassLoaderAdapter = config.getClassLoaderAdapter(); this.mApmGenerater = config.getApmGenerater(); this.mWXJsFileLoaderAdapter = config.getJsFileLoaderAdapter(); + this.mWXJscProcessManager = config.getJscProcessManager(); } public IWXStorageAdapter getIWXStorageAdapter(){ diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java new file mode 100644 index 0000000000..59524f15be --- /dev/null +++ b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java @@ -0,0 +1,27 @@ +/** + * 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.taobao.weex.adapter; + +import com.taobao.weex.WXSDKInstance; + +public interface IWXJscProcessManager { + boolean shouldReboot(); + long rebootTimeout(); + boolean withException(WXSDKInstance instance); +} 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 f77d2d28de..00bb1b8dc4 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 @@ -162,9 +162,6 @@ public class WXBridgeManager implements Callback, BactchExecutor { // add for cloud setting, default value is false. // weexcore use single process or not private static boolean isUseSingleProcess = false; - private static boolean isRebootJscWhenWhiteScreen = false; - public final static long DEFAULT_REBOOT_JSC_TIMEOUT = 5000; - private static long rebootJscTimeout = DEFAULT_REBOOT_JSC_TIMEOUT; public enum BundType { Vue, @@ -225,21 +222,7 @@ public static WXBridgeManager getInstance() { } return mBridgeManager; } - public boolean isIsRebootJscWhenWhiteScreen() { - return isRebootJscWhenWhiteScreen; - } - - public void setIsRebootJscWhenWhiteScreen(boolean _isRebootJscWhenWhiteScreen) { - isRebootJscWhenWhiteScreen = _isRebootJscWhenWhiteScreen; - } - public long getRebootJscTimeout() { - return rebootJscTimeout; - } - - public void setRebootJscTimeout(long timeout) { - rebootJscTimeout = timeout; - } public void setUseSingleProcess(final boolean flag) { if (flag != isUseSingleProcess) { isUseSingleProcess = flag; @@ -2230,10 +2213,11 @@ public void reportJSException(String instanceId, String function, WXSDKInstance instance = null; WXErrorCode reportErrorCode = WXErrorCode.WX_ERR_JS_EXECUTE; if (instanceId != null && (instance = WXSDKManager.getInstance().getSDKInstance(instanceId)) != null) { + instance.setHasException(true); exception += "\n getTemplateInfo==" +instance.getTemplateInfo();//add network header info if (METHOD_CREATE_INSTANCE.equals(function) || !instance.isContentMd5Match()) { try { - if (isJSFrameworkInit() && reInitCount > 1 && !instance.isNeedReLoad()) { + if (isJSFrameworkInit() && (reInitCount > 1 && reInitCount < 10) && !instance.isNeedReLoad()) { new ActionReloadPage(instanceId, true).executeAction(); instance.setNeedLoad(true); return;