* [android] Report layer overflow limit error on android 4.x.
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/52e84f2d Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/52e84f2d Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/52e84f2d Branch: refs/heads/master Commit: 52e84f2d8ae3bd7a82bf9c884bf2c41afb0a6a57 Parents: 46ce1c5 Author: miomin <[email protected]> Authored: Fri May 4 11:39:07 2018 +0800 Committer: YorkShen <[email protected]> Committed: Mon May 7 15:52:09 2018 +0800 ---------------------------------------------------------------------- .../java/com/taobao/weex/WXSDKInstance.java | 10 ++++++ .../java/com/taobao/weex/common/Constants.java | 1 + .../com/taobao/weex/common/WXErrorCode.java | 5 ++- .../taobao/weex/ui/component/WXComponent.java | 10 ------ .../com/taobao/weex/ui/component/WXDiv.java | 31 ++++++----------- .../com/taobao/weex/ui/component/WXEmbed.java | 10 ++++-- .../taobao/weex/ui/component/WXVContainer.java | 3 -- .../com/taobao/weex/ui/view/WXFrameLayout.java | 36 ++++++++++++++++++-- 8 files changed, 63 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java ---------------------------------------------------------------------- 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 3904f78..9354949 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java @@ -171,6 +171,16 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan private ComponentObserver mComponentObserver; private Map<String, GraphicActionAddElement> inactiveAddElementAction = new ArrayMap<>(); + private boolean hasLayerLimit = false; + + public void setLayerLimit(boolean hasLayerLimit) { + this.hasLayerLimit = hasLayerLimit; + } + + public boolean isLayerLimit() { + return hasLayerLimit; + } + /** * set open SandBox * @param flag http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/common/Constants.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java index c423ad1..d5e4ee1 100644 --- a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java +++ b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java @@ -189,6 +189,7 @@ public class Constants { String ARIA_HIDDEN = "ariaHidden"; String ROLE = "role"; + String LAYERLIMIT = "layerLimit"; String LAYER_LIMIT = "layer-limit"; String DIRECTION = "direction"; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java ---------------------------------------------------------------------- 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 0f77ec9..838b42f 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 @@ -201,7 +201,6 @@ public enum WXErrorCode { WX_KEY_EXCEPTION_DOM_MODULEINVO("-9317", "[WX_KEY_EXCEPTION_DOM_MODULEINVO] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE), - /** * WX Key Exception Commit RT JsBridge eg. js excute runtime error */ @@ -212,8 +211,8 @@ public enum WXErrorCode { * 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_JS_RUNTIME("-9601", "WX_RENDER_ERR for js error",ErrorType.RENDER_ERROR, ErrorGroup.JS), + WX_RENDER_ERR_LAYER_OVERFLOW("-9602", "WX_RENDER_ERR_LAYER_OVERFLOW", ErrorType.RENDER_ERROR, ErrorGroup.JS), /** http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java index add5921..86f6347 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java @@ -171,16 +171,6 @@ public abstract class WXComponent<T extends View> extends WXBasicComponent imple private boolean waste = false; - private boolean hasLayerLimit = false; - - protected void setLayerLimit(boolean hasLayerLimit) { - this.hasLayerLimit = hasLayerLimit; - } - - public boolean isLayerLimit() { - return hasLayerLimit; - } - private ContentBoxMeasurement contentBoxMeasurement; private WXTransition mTransition; private GraphicSize mPseudoResetGraphicSize; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java index 9ebd7d8..f7954ee 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXDiv.java @@ -32,6 +32,8 @@ import com.taobao.weex.ui.flat.FlatComponent; import com.taobao.weex.ui.flat.WidgetContainer; import com.taobao.weex.ui.flat.widget.WidgetGroup; import com.taobao.weex.ui.view.WXFrameLayout; +import com.taobao.weex.utils.WXUtils; + import java.lang.reflect.InvocationTargetException; import java.util.LinkedList; @@ -119,27 +121,14 @@ public class WXDiv extends WidgetContainer<WXFrameLayout> implements FlatCompone return !promoteToView(true); } - @WXComponentProp(name = Constants.Name.LAYER_LIMIT) - public void setLayerLimitModle(String layerLimit) { - setLayerLimit(getLayerLimit(layerLimit)); - } - - private boolean getLayerLimit(String layerLimit) { - boolean ret = false; - if (TextUtils.isEmpty(layerLimit)) { - return ret; - } - - switch (layerLimit) { - case "true": - ret = true; - break; - case "false": - ret = false; - break; - default: - break; + @Override + protected boolean setProperty(String key, Object param) { + switch (key) { + case Constants.Name.LAYERLIMIT: + case Constants.Name.LAYER_LIMIT: + getInstance().setLayerLimit(WXUtils.getBoolean(param, false)); + return true; } - return ret; + return super.setProperty(key, param); } } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java index 018612b..74c483c 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXEmbed.java @@ -20,6 +20,7 @@ package com.taobao.weex.ui.component; import android.annotation.SuppressLint; import android.text.TextUtils; +import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -221,13 +222,13 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis protected boolean setProperty(String key, Object param) { switch (key) { case Constants.Name.SRC: - String src = WXUtils.getString(param,null); + String src = WXUtils.getString(param, null); if (src != null) setSrc(src); return true; case Constants.Name.PRIORITY: - String priority = WXUtils.getString(param,null); - if (priority != null){ + String priority = WXUtils.getString(param, null); + if (priority != null) { setPriority(priority); } return true; @@ -332,10 +333,13 @@ public class WXEmbed extends WXDiv implements WXSDKInstance.OnInstanceVisibleLis return sdkInstance; } + sdkInstance.setLayerLimit(getInstance().isLayerLimit()); + sdkInstance.renderByUrl(WXPerformance.DEFAULT, url, null, null, WXRenderStrategy.APPEND_ASYNC); + return sdkInstance; } http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/component/WXVContainer.java ---------------------------------------------------------------------- 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 5d18cd5..9897e26 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 @@ -269,9 +269,6 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> { } else { mChildren.add(index, child); } - - if (isLayerLimit()) - child.setLayerLimit(true); } public final int indexOf(WXComponent comp) { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/52e84f2d/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java index ea05c7e..cfb1ec6 100644 --- a/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java +++ b/android/sdk/src/main/java/com/taobao/weex/ui/view/WXFrameLayout.java @@ -23,12 +23,17 @@ import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.Log; import android.view.MotionEvent; +import android.view.View; import android.widget.FrameLayout; + +import com.taobao.weex.common.WXErrorCode; import com.taobao.weex.ui.component.WXDiv; import com.taobao.weex.ui.flat.widget.Widget; import com.taobao.weex.ui.view.gesture.WXGesture; import com.taobao.weex.ui.view.gesture.WXGestureObservable; +import com.taobao.weex.utils.WXExceptionUtils; import com.taobao.weex.utils.WXLogUtils; import com.taobao.weex.utils.WXViewUtils; import java.lang.ref.WeakReference; @@ -96,12 +101,22 @@ public class WXFrameLayout extends FrameLayout implements WXGestureObservable,IR @Override protected void dispatchDraw(Canvas canvas) { - if (getComponent() != null && getComponent().isLayerLimit()) { - dispatchDrawInterval(canvas); + if (getComponent() != null && getComponent().getInstance().isLayerLimit()) { + try { + dispatchDrawInterval(canvas); + } catch (StackOverflowError e) { + int deep = calLayerDeep(this, 0); + WXExceptionUtils.commitCriticalExceptionRT(getComponent().getInstanceId(), + WXErrorCode.WX_RENDER_ERR_LAYER_OVERFLOW, + "draw android view", + WXErrorCode.WX_RENDER_ERR_LAYER_OVERFLOW.getErrorMsg() + "Layer overflow limit error: " + deep + " layers!", + null); + throw new LayerOverFlowLimitException("Layer overflow limit error: " + deep + " layers!"); + } } else { try { dispatchDrawInterval(canvas); - }catch (Throwable e){ + } catch (StackOverflowError e){ WXLogUtils.e("FlatGUI Crashed when dispatchDraw", WXLogUtils.getStackTrace(e)); } } @@ -120,4 +135,19 @@ public class WXFrameLayout extends FrameLayout implements WXGestureObservable,IR super.dispatchDraw(canvas); } } + + static class LayerOverFlowLimitException extends RuntimeException { + + public LayerOverFlowLimitException(String message) { + super(message); + } + } + + private int calLayerDeep(View view, int deep) { + deep++; + if (view.getParent() != null && view.getParent() instanceof View) { + return calLayerDeep((View) view.getParent(), deep); + } + return deep; + } }
