[
https://issues.apache.org/jira/browse/WEEX-564?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16579603#comment-16579603
]
ASF GitHub Bot commented on WEEX-564:
-------------------------------------
YorkShen closed pull request #1435: [WEEX-564][Android] fix check screen empty
logic
URL: https://github.com/apache/incubator-weex/pull/1435
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/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
index cdb3aebb15..b98c17daa6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -98,6 +98,8 @@
* */
public static long sComponentsAndModulesReadyTime = 0;
+ public static boolean sInAliWeex = false;
+
public static LogLevel sLogLevel = LogLevel.DEBUG;
private static boolean isApkDebug = true;
public static boolean isPerf = false;
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 abfd1547dc..dd213d5d0a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -67,6 +67,7 @@
import com.taobao.weex.layout.ContentBoxMeasurement;
import com.taobao.weex.performance.WXAnalyzerDataTransfer;
import com.taobao.weex.performance.WXInstanceApm;
+import com.taobao.weex.performance.WXInstanceExceptionRecord;
import com.taobao.weex.tracing.WXTracing;
import com.taobao.weex.ui.action.GraphicActionAddElement;
import com.taobao.weex.ui.component.NestedContainer;
@@ -140,6 +141,8 @@
private Map<String,String> mContainerInfo;
+ private WXInstanceExceptionRecord mExceptionRecorder;
+
/**
* bundle type
*/
@@ -406,6 +409,7 @@ public void init(Context context) {
mWXPerformance = new WXPerformance(mInstanceId);
mApmForInstance = new WXInstanceApm(mInstanceId);
+ mExceptionRecorder = new WXInstanceExceptionRecord(mInstanceId);
mWXPerformance.WXSDKVersion = WXEnvironment.WXSDK_VERSION;
mWXPerformance.JSLibInitTime = WXEnvironment.sJSLibInitTime;
@@ -1398,6 +1402,7 @@ private void destroyView(View rootView) {
public synchronized void destroy() {
if(!isDestroy()) {
mApmForInstance.onEnd();
+ getExceptionRecorder().checkEmptyScreenAndReport();
if(mRendered) {
WXSDKManager.getInstance().destroyInstance(mInstanceId);
}
@@ -1710,6 +1715,10 @@ public WXInstanceApm getApmForInstance() {
return mApmForInstance;
}
+ public WXInstanceExceptionRecord getExceptionRecorder() {
+ return mExceptionRecorder;
+ }
+
public Map<String, Serializable> getUserTrackParams() {
return mUserTrackParams;
}
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 b52fe1fda1..c88b324382 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
@@ -2016,8 +2016,9 @@ public void reportJSException(String instanceId, String
function,
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
errorMsg
);
- //doReportJSException(instanceId,function,exception);
-
WXExceptionUtils.commitCriticalExceptionRT(instanceId,WXErrorCode.WX_RENDER_ERR_JS_CREATE_INSTANCE,function,exception,null);
+ if (!WXEnvironment.sInAliWeex){
+
WXExceptionUtils.commitCriticalExceptionRT(instanceId,WXErrorCode.WX_RENDER_ERR_JS_CREATE_INSTANCE,function,exception,null);
+ }
return;
}
} catch (Exception e) {
@@ -2035,7 +2036,7 @@ private void doReportJSException(String instanceId,
String function, String exce
if (adapter != null) {
String exceptionId = instanceId;
- if (instanceId == "" || instanceId == null) {
+ if (TextUtils.isEmpty(instanceId)) {
exceptionId = "instanceIdisNull";
}
@@ -2077,27 +2078,15 @@ private void doReportJSException(String instanceId,
String function, String exce
}
}
- Map<String,String> extInfo = null;
- if (METHOD_CREATE_INSTANCE.equals(function) ||
METHOD_CREATE_INSTANCE_CONTEXT.equals(function)){
- extInfo = new HashMap<>();
- extInfo.put("extInitTime",(System.currentTimeMillis() -
WXBridgeManager.sInitFrameWorkTimeOrigin)+"ms");
-
extInfo.put("extInitErrorMsg",WXBridgeManager.sInitFrameWorkMsg.toString());
- }
- if (checkEmptyScreen(instance)){
- if (WXEnvironment.isApkDebugable()){
- WXLogUtils.e("render error 4 js error !");
- }
- WXExceptionUtils.commitCriticalExceptionRT(exceptionId,
WXErrorCode.WX_RENDER_ERR_JS_RUNTIME,
- function,
- WXErrorCode.WX_RENDER_ERR_JS_RUNTIME.getErrorMsg() + exception,
- extInfo);
- } else {
- WXExceptionUtils.commitCriticalExceptionRT(exceptionId,
WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE,
- function,
- WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE.getErrorMsg() +
exception,
- extInfo);
- }
+ WXErrorCode errorCode = (METHOD_CREATE_INSTANCE.equals(function) ||
METHOD_CREATE_INSTANCE_CONTEXT.equals(function))
+ ?WXErrorCode.WX_RENDER_ERR_JS_CREATE_INSTANCE
+ :WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE;
+ WXExceptionUtils.commitCriticalExceptionRT(exceptionId, errorCode,
+ function,
+ errorCode.getErrorMsg() + exception,
+ null);
+
}
}
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
index d945684809..bf5e8204bc 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
@@ -225,15 +225,17 @@
* WX Key Exception Commit RT JsBridge eg. js excute runtime error
*/
WX_KEY_EXCEPTION_WXBRIDGE("-9400", "[js excute runtime error] detail js
stack -> ",ErrorType.JS_ERROR,ErrorGroup.JS),
- WX_KEY_EXCEPTION_WXBRIDGE_EXCEPTION("-9401", "[js excute runtime error]
detail js stack \n",ErrorType.JS_ERROR,ErrorGroup.JS),
+ WX_KEY_EXCEPTION_WXBRIDGE_EXCEPTION("-9401", "[js excute runtime error]
detail js stack -> ",ErrorType.JS_ERROR,ErrorGroup.JS),
/**
* renderErrorCode
*/
WX_RENDER_ERR_JS_CREATE_INSTANCE("-9600",
"WX_RENDER_ERR_JS_CREATE_INSTANCE",ErrorType.RENDER_ERROR,ErrorGroup.JS),
WX_RENDER_ERR_JS_RUNTIME("-9601", "WX_RENDER_ERR for js
error",ErrorType.RENDER_ERROR, ErrorGroup.JS),
+ WX_RENDER_ERR_NATIVE_RUNTIME("-9604", "WX_RENDER_ERR for js
error",ErrorType.RENDER_ERROR, ErrorGroup.NATIVE),
WX_RENDER_ERR_LAYER_OVERFLOW("-9602", "WX_RENDER_ERR_LAYER_OVERFLOW",
ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
WX_RENDER_ERR_NULL_KEY("-9603", "WX_RENDER_ERR_NULL_KEY",
ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
+
WX_RENDER_ERR_CONTAINER_TYPE("-9611", "WX_RENDER_ERR_CONTAINER_TYPE",
ErrorType.JS_ERROR,ErrorGroup.JS),
WX_RENDER_ERR_TRANSITION("-9616", "WX_RENDER_ERR_TRANSITION",
ErrorType.JS_ERROR, ErrorGroup.JS),
WX_RENDER_ERR_INSTANCE_ID_NULL("-9618", "WX_RENDER_ERR_INSTANCE_ID_NULL",
ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
diff --git
a/android/sdk/src/main/java/com/taobao/weex/common/WXJSExceptionInfo.java
b/android/sdk/src/main/java/com/taobao/weex/common/WXJSExceptionInfo.java
index 59a47aedb8..411e72c7c2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXJSExceptionInfo.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXJSExceptionInfo.java
@@ -56,6 +56,8 @@
*/
private String mWeexVersion = WXEnvironment.WXSDK_VERSION;
+ public long time;
+
/**
* js framework verison
*/
@@ -68,6 +70,7 @@ public WXJSExceptionInfo(String instanceId, String bundleUrl,
WXErrorCode errCod
this.mFunction = function;
this.mException = exception;
this.mExtParams = extParams;
+ this.time = System.currentTimeMillis();
}
public String getInstanceId() {
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 9853869986..6f12f4a286 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
@@ -122,6 +122,10 @@ public void onEvent(String name, Object value) {
* record stage
*/
public void onStage(String name, long timestamp) {
+ WXSDKInstance instance =
WXSDKManager.getInstance().getSDKInstance(mInstanceId);
+ if (null != instance){
+ instance.getExceptionRecorder().recordStage(name,timestamp);
+ }
if (null == apmInstance) {
return;
}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceExceptionRecord.java
b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceExceptionRecord.java
new file mode 100644
index 0000000000..0b14969b97
--- /dev/null
+++
b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceExceptionRecord.java
@@ -0,0 +1,147 @@
+/**
+ * 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.performance;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import com.taobao.weex.common.WXErrorCode;
+import com.taobao.weex.common.WXErrorCode.ErrorGroup;
+import com.taobao.weex.common.WXErrorCode.ErrorType;
+import com.taobao.weex.common.WXJSExceptionInfo;
+import com.taobao.weex.utils.WXExceptionUtils;
+
+public class WXInstanceExceptionRecord {
+
+ public static int sErrorMsgSizeLimit = 5;
+ public static final String KEY_EXP_STAGE_LIST = "wxStageList";
+
+ public final List<String> stageList;
+ public final List<WXJSExceptionInfo> errorList;
+ public final String instanceId;
+ public final AtomicBoolean hasAddView;
+ public final AtomicBoolean hasDegrade;
+ private boolean mHasReportScreenEmpty = false;
+ private boolean mBeginRender = false;
+
+ public WXInstanceExceptionRecord(String instanceId) {
+ this.instanceId = instanceId;
+ this.stageList = new CopyOnWriteArrayList<>();
+ this.errorList = new CopyOnWriteArrayList<>();
+ this.hasAddView = new AtomicBoolean(false);
+ this.hasDegrade = new AtomicBoolean(false);
+ }
+
+ /**
+ * record error on instance (js、native)
+ * when checkEmptyScreen, report msg
+ */
+ public void recordErrorMsg(WXJSExceptionInfo exceptionInfo) {
+ if (null == exceptionInfo) {
+ return;
+ }
+ //FOR RENDER_ERROR , record twice
+ if (exceptionInfo.getErrCode().getErrorType() ==
ErrorType.RENDER_ERROR) {
+ mHasReportScreenEmpty = true;
+ return;
+ }
+ //screen has view, or degrade , will not be empty
+ if (hasAddView.get() || hasDegrade.get()) {
+ return;
+ }
+ if (errorList.size() > sErrorMsgSizeLimit) {
+ errorList.remove(0);
+ }
+ errorList.add(exceptionInfo);
+ }
+
+ public void recordStage(String stage, long time) {
+ if (WXInstanceApm.KEY_PAGE_STAGES_RENDER_ORGIGIN.equals(stage)
+ || WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_START.equals(stage)
+ || WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_START.equals(stage)
+ ) {
+ mBeginRender = true;
+ }
+ stageList.add(stage + " :" + time);
+ }
+
+ public String convertStageToStr() {
+ if (stageList.isEmpty()) {
+ return "empty";
+ }
+ StringBuilder builder = new StringBuilder();
+ for (String value : stageList) {
+ builder.append(value).append(" -> ");
+ }
+ return builder.toString();
+ }
+
+ private String convertExceptionListToString() {
+ if (errorList.isEmpty()) {
+ return "empty";
+ }
+ StringBuilder builder = new StringBuilder();
+ builder.append("======== error stack start (top5) =====\n");
+ for (WXJSExceptionInfo info : errorList) {
+ builder.append("time :").append(info.time).append("\n")
+ .append("extErrorCode
:").append(info.getErrCode().getErrorCode()).append('\n')
+ .append("extErrorType
:").append(info.getErrCode().getErrorType()).append('\n')
+ .append("extErrorGroup
:").append(info.getErrCode().getErrorGroup()).append('\n')
+ .append("extErrorMsg
:").append(info.getErrCode().getErrorMsg()).append('\n')
+ .append("extErrorExceptionDetail
:").append(info.getException()).append('\n')
+ .append("extErrorStageList :").append(
+ info.getExtParams().containsKey(KEY_EXP_STAGE_LIST) ?
info.getExtParams().get(KEY_EXP_STAGE_LIST)
+ : "empty"
+ ).append("\n")
+ .append("============= next ==============\n");
+ }
+ builder.append("======== error stack end =====\n");
+ return builder.toString();
+ }
+
+ public void checkEmptyScreenAndReport() {
+ if (!mBeginRender || mHasReportScreenEmpty || hasAddView.get() ||
hasDegrade.get()) {
+ return;
+ }
+ boolean hasJsException = false;
+ for (WXJSExceptionInfo info : errorList) {
+ if (info.getErrCode().getErrorGroup() == ErrorGroup.JS) {
+ hasJsException = true;
+ break;
+ }
+ }
+ WXExceptionUtils.commitCriticalExceptionRT(
+ instanceId,
+ hasJsException ? WXErrorCode.WX_RENDER_ERR_JS_RUNTIME :
WXErrorCode.WX_RENDER_ERR_NATIVE_RUNTIME,
+ "checkEmptyScreenAndReport",
+ convertExceptionListToString(),
+ null
+ );
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder()
+ .append(super.toString())
+ .append("wxStageList :\n").append(convertStageToStr())
+ .append("wxErrorList :\n").append(convertExceptionListToString())
+ .toString();
+ }
+}
diff --git
a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
index c909b2b3a3..7305dc483c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java
@@ -311,6 +311,10 @@ public void addSubView(View child, int index) {
} else {
getRealView().addView(child, index);
}
+ WXSDKInstance instance = getInstance();
+ if (null != instance &&
instance.getExceptionRecorder().hasAddView.compareAndSet(false,true)){
+ instance.getExceptionRecorder().errorList.clear();
+ }
}
public void remove(WXComponent child, boolean destroy) {
diff --git
a/android/sdk/src/main/java/com/taobao/weex/utils/WXExceptionUtils.java
b/android/sdk/src/main/java/com/taobao/weex/utils/WXExceptionUtils.java
index b039c18c63..de70999b86 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXExceptionUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXExceptionUtils.java
@@ -18,23 +18,19 @@
*/
package com.taobao.weex.utils;
-import android.app.Activity;
-import android.content.Context;
+import java.util.HashMap;
+import java.util.Map;
+
import android.support.annotation.Nullable;
import android.text.TextUtils;
-
import com.taobao.weex.WXSDKInstance;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.adapter.IWXJSExceptionAdapter;
-import com.taobao.weex.performance.IWXAnalyzer;
import com.taobao.weex.common.WXErrorCode;
import com.taobao.weex.common.WXJSExceptionInfo;
import com.taobao.weex.common.WXPerformance;
import com.taobao.weex.performance.WXAnalyzerDataTransfer;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import com.taobao.weex.performance.WXInstanceExceptionRecord;
/**
* Created on 2017/10/13.
@@ -62,7 +58,7 @@ public static void commitCriticalExceptionRT(@Nullable final
String instanceId,
@Nullable final String exception,
@Nullable final Map<String,String> extParams ) {
IWXJSExceptionAdapter adapter =
WXSDKManager.getInstance().getIWXJSExceptionAdapter();
- WXSDKInstance instance;
+ WXSDKInstance instance = null;
WXJSExceptionInfo exceptionCommit;
String bundleUrlCommit = "BundleUrlDefault";
String instanceIdCommit = "InstanceIdDefalut";
@@ -89,6 +85,7 @@ public static void commitCriticalExceptionRT(@Nullable final
String instanceId,
for (Map.Entry<String,String> entry:
instance.getContainerInfo().entrySet()){
commitMap.put(entry.getKey(),entry.getValue());
}
+
commitMap.put(WXInstanceExceptionRecord.KEY_EXP_STAGE_LIST,instance.getExceptionRecorder().convertStageToStr());
}
} else {//instance is null for instance id is null
if (!TextUtils.isEmpty(WXSDKInstance.requestUrl)) {
@@ -105,6 +102,10 @@ public static void commitCriticalExceptionRT(@Nullable
final String instanceId,
adapter.onJSException(exceptionCommit);
}
+ if (null != instance){
+
instance.getExceptionRecorder().recordErrorMsg(exceptionCommit);
+ }
+
WXAnalyzerDataTransfer.transferError(exceptionCommit,
instanceId);
}
----------------------------------------------------------------
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:
[email protected]
> [Android] fix check screen empty logic
> --------------------------------------
>
> Key: WEEX-564
> URL: https://issues.apache.org/jira/browse/WEEX-564
> Project: Weex
> Issue Type: Bug
> Components: Android
> Reporter: peihan
> Assignee: YorkShen
> Priority: Major
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)