* [Android] merge WXPerformance code,now support more performance data

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/495c7aca
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/495c7aca
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/495c7aca

Branch: refs/heads/master
Commit: 495c7acafbe6e71ab879de02821986d08aaea0fb
Parents: a1d4ed2
Author: zhongcang <[email protected]>
Authored: Thu Mar 22 16:10:52 2018 +0800
Committer: zhongcang <[email protected]>
Committed: Thu Mar 22 16:10:52 2018 +0800

----------------------------------------------------------------------
 .../java/com/alibaba/weex/IndexActivity.java    |   4 +-
 .../java/com/taobao/weex/RenderContainer.java   |  12 +
 .../java/com/taobao/weex/WXRenderErrorCode.java |  87 ----
 .../main/java/com/taobao/weex/WXSDKEngine.java  |   9 +-
 .../java/com/taobao/weex/WXSDKInstance.java     | 133 +++--
 .../main/java/com/taobao/weex/WXSDKManager.java |  17 +
 .../com/taobao/weex/bridge/WXBridgeManager.java | 159 +++---
 .../com/taobao/weex/bridge/WXModuleManager.java |   2 +-
 .../com/taobao/weex/common/WXErrorCode.java     | 204 +++++---
 .../taobao/weex/common/WXJSExceptionInfo.java   |  11 +-
 .../com/taobao/weex/common/WXPerformance.java   | 481 +++++++++++++++----
 .../java/com/taobao/weex/dom/WXDomManager.java  |   2 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |   9 +-
 .../dom/action/AbstractAddElementAction.java    |  14 +-
 .../weex/dom/action/AddElementAction.java       |   1 +
 .../taobao/weex/dom/action/AddEventAction.java  |   2 +-
 .../taobao/weex/dom/action/AnimationAction.java |   4 +-
 .../weex/dom/action/ModuleInvocationAction.java |   2 +-
 .../weex/dom/action/MoveElementAction.java      |   2 +-
 .../weex/dom/action/RemoveElementAction.java    |   8 +-
 .../weex/dom/action/RemoveEventAction.java      |   2 +-
 .../weex/dom/action/UpdateAttributeAction.java  |   2 +-
 .../weex/dom/action/UpdateStyleAction.java      |   2 +-
 .../taobao/weex/performance/FpsCollector.java   | 113 +++++
 .../taobao/weex/performance/IWXAnalyzer.java    |  35 ++
 .../com/taobao/weex/performance/MemUtils.java   |  80 +++
 .../performance/WXAnalyzerDataTransfer.java     | 138 ++++++
 .../taobao/weex/ui/component/WXComponent.java   |   5 +
 .../com/taobao/weex/ui/component/WXEmbed.java   |  12 +-
 .../com/taobao/weex/ui/component/WXImage.java   |  23 +
 .../taobao/weex/ui/module/WXTimerModule.java    |  17 +
 .../com/taobao/weex/utils/WXExceptionUtils.java |  32 +-
 .../java/com/taobao/weex/utils/WXLogUtils.java  |  35 +-
 .../taobao/weex/utils/WXSoInstallMgrSdk.java    |  10 +-
 .../taobao/weex/utils/WXExceptionUtilsTest.java |   5 +-
 35 files changed, 1261 insertions(+), 413 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
----------------------------------------------------------------------
diff --git 
a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java 
b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
index e4bbe99..feaf5ae 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
@@ -42,9 +42,9 @@ import android.widget.Toast;
 import com.alibaba.weex.commons.AbstractWeexActivity;
 import com.alibaba.weex.update.CheckForUpdateUtil;
 import com.google.zxing.client.android.CaptureActivity;
-import com.taobao.weex.WXRenderErrorCode;
 import com.taobao.weex.WXSDKEngine;
 import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.utils.WXFileUtils;
 import com.taobao.weex.utils.WXSoInstallMgrSdk;
 
@@ -169,7 +169,7 @@ public class IndexActivity extends AbstractWeexActivity {
     super.onException(wxsdkInstance,s,s1);
     mProgressBar.setVisibility(View.GONE);
     mTipView.setVisibility(View.VISIBLE);
-    if (TextUtils.equals(s, 
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getDegradErrorCode()))
 {
+    if (TextUtils.equals(s, 
WXErrorCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode())) {
       mTipView.setText(R.string.index_tip);
     } else {
       mTipView.setText("network render error:" + s1);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java 
b/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
index 2bcf330..a37a47e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
+++ b/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
@@ -22,6 +22,7 @@ import android.annotation.TargetApi;
 import android.content.Context;
 import android.os.Build;
 import android.util.AttributeSet;
+import android.view.MotionEvent;
 import android.widget.FrameLayout;
 
 
@@ -33,6 +34,7 @@ import java.lang.ref.WeakReference;
 
 public class RenderContainer extends FrameLayout {
   private WeakReference<WXSDKInstance> mSDKInstance;
+  private boolean mPageHasEvent = false;
 
   public RenderContainer(Context context) {
     super(context);
@@ -64,4 +66,14 @@ public class RenderContainer extends FrameLayout {
       instance.setSize(w, h);
     }
   }
+
+  @Override
+  public boolean dispatchTouchEvent(MotionEvent ev) {
+    mPageHasEvent = true;
+    return super.dispatchTouchEvent(ev);
+  }
+
+  public boolean isPageHasEvent(){
+    return mPageHasEvent;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/WXRenderErrorCode.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXRenderErrorCode.java 
b/android/sdk/src/main/java/com/taobao/weex/WXRenderErrorCode.java
deleted file mode 100644
index 3c92bf5..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/WXRenderErrorCode.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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;
-
-public class WXRenderErrorCode {
-
-//  public static final String WX_CREATE_INSTANCE_ERROR = 
"wx_create_instance_error";
-//
-//  public static final String WX_NETWORK_ERROR = "wx_network_error";
-//
-//  public static final String WX_USER_INTERCEPT_ERROR = 
"wx_user_intercept_error";
-
-  public enum DegradPassivityCode{
-
-       /**
-        * degrade code.
-        */
-       WX_DEGRAD_ERR("-1000", "degradeToH5|Weex DegradPassivity \n"),
-
-       /**
-        * degrade for instance create failed, once this case occured,detail js 
stack and other specific
-        * cause need track into errmsg.
-        */
-       WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED("-1001", 
"degradeToH5|createInstance fail|wx_create_instance_error"),
-
-       /**
-        * degrade for network failed download js bundle.once this case 
occured,network requist response header
-        * and statuscode need track into errmsg.
-        */
-       WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED("-1002", 
"|wx_network_error|js bundle download failed"),
-
-       /**
-        * degrade for network failed for bundlejs is unbroken , once this case 
occured,network requist response header
-        * and statuscode need track into errmsg.
-        */
-       WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED("-1003", 
"degradeToH5|wx_network_error|js bundle content-length check failed"),
-
-       /**
-        * degrade for Response header Content-Type is null or not 
"application/javascript".
-        * once this case occured,network requist response header and 
statuscode need track into errmsg.
-        */
-       WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR("-1004", 
"degradeToH5|wx_user_intercept_error |Content-Type is not 
application/javascript, " +
-                       "Weex render template must be javascript, please check 
your request!"),
-
-       /**
-        * degrade for other reason. such as white screen which block error for 
some unknown reason.
-        * once this case occured,detail msg need track.
-        */
-       WX_DEGRAD_ERR_OTHER_CAUSE_DEGRADTOH5("-1005", "degradeToH5|for other 
reason|");
-
-       private String degradCode;
-       private String degradMsg;
-       private String appendMsg = "";
-       private String args;
-
-       DegradPassivityCode(String degradCode, String degradMsg){
-         this.degradCode = degradCode;
-         this.degradMsg = degradMsg;
-       }
-
-       public String getDegradErrorCode() {
-         return degradCode;
-       }
-
-       public String getDegradErrorMsg() {
-         StringBuilder builder=new StringBuilder(degradMsg);
-         builder.append(appendMsg);
-         return builder.toString();
-       }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
----------------------------------------------------------------------
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 4ecb966..618502d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -21,6 +21,7 @@ package com.taobao.weex;
 import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
+import android.os.Looper;
 import android.support.v4.content.LocalBroadcastManager;
 import android.text.TextUtils;
 
@@ -46,6 +47,7 @@ import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXException;
 import com.taobao.weex.common.WXInstanceWrap;
 import com.taobao.weex.common.WXModule;
+import com.taobao.weex.common.WXPerformance;
 import com.taobao.weex.dom.BasicEditTextDomObject;
 import com.taobao.weex.dom.TextAreaEditTextDomObject;
 import com.taobao.weex.dom.WXCellDomObject;
@@ -57,6 +59,7 @@ import com.taobao.weex.dom.WXScrollerDomObject;
 import com.taobao.weex.dom.WXSwitchDomObject;
 import com.taobao.weex.dom.WXTextDomObject;
 import com.taobao.weex.http.WXStreamModule;
+import com.taobao.weex.performance.FpsCollector;
 import com.taobao.weex.ui.ExternalLoaderComponentHolder;
 import com.taobao.weex.ui.IExternalComponentGetter;
 import com.taobao.weex.ui.IExternalModuleGetter;
@@ -173,6 +176,8 @@ public class WXSDKEngine {
       doInitInternal(application,config);
       WXEnvironment.sSDKInitInvokeTime = System.currentTimeMillis()-start;
       WXLogUtils.renderPerformanceLog("SDKInitInvokeTime", 
WXEnvironment.sSDKInitInvokeTime);
+      WXPerformance.init();
+
       mIsInit = true;
     }
   }
@@ -182,7 +187,7 @@ public class WXSDKEngine {
        if(application == null){
          WXLogUtils.e(TAG, " doInitInternal application is null");
          WXExceptionUtils.commitCriticalExceptionRT(null,
-                         WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorCode(),
+                         WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
                          "doInitInternal",
                          WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + 
"WXEnvironment sApplication is null",
                          null);
@@ -204,7 +209,7 @@ public class WXSDKEngine {
         boolean isSoInitSuccess = WXSoInstallMgrSdk.initSo(V8_SO_NAME, 1, 
config!=null?config.getUtAdapter():null);
         if (!isSoInitSuccess) {
                  WXExceptionUtils.commitCriticalExceptionRT(null,
-                                 
WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorCode(),
+                                 WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
                                  "doInitInternal",
                                  
WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "isSoInit false",
                                  null);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/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 475991e..8e6534e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -18,6 +18,8 @@
  */
 package com.taobao.weex;
 
+import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
+
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.Intent;
@@ -31,18 +33,17 @@ import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.RestrictTo.Scope;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.Menu;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ScrollView;
-
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.adapter.IDrawableLoader;
 import com.taobao.weex.adapter.IWXHttpAdapter;
 import com.taobao.weex.adapter.IWXImgLoaderAdapter;
 import com.taobao.weex.adapter.IWXUserTrackAdapter;
 import com.taobao.weex.adapter.URIAdapter;
+import com.taobao.weex.performance.IWXAnalyzer;
 import com.taobao.weex.appfram.websocket.IWebSocketAdapter;
 import com.taobao.weex.bridge.EventResult;
 import com.taobao.weex.bridge.NativeInvokeHelper;
@@ -56,6 +57,7 @@ import com.taobao.weex.common.OnWXScrollListener;
 import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.common.WXPerformance;
+import com.taobao.weex.common.WXPerformance.Dimension;
 import com.taobao.weex.common.WXRefreshData;
 import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.common.WXRequest;
@@ -66,6 +68,7 @@ import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.dom.WXDomTask;
 import com.taobao.weex.dom.WXEvent;
 import com.taobao.weex.http.WXHttpUtil;
+import com.taobao.weex.performance.WXAnalyzerDataTransfer;
 import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.component.NestedContainer;
 import com.taobao.weex.ui.component.WXBasicComponentType;
@@ -82,7 +85,6 @@ import com.taobao.weex.utils.WXJsonUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXReflectionUtils;
 import com.taobao.weex.utils.WXViewUtils;
-
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.lang.ref.WeakReference;
@@ -94,8 +96,6 @@ import java.util.PriorityQueue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
-
 /**
  * Each instance of WXSDKInstance represents an running weex instance.
  * It can be a pure weex view, or mixed with native view
@@ -212,6 +212,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
 
 
   private int mMaxDeepLayer;
+  private int mMaxVDomDeepLayer;
 
   public boolean isTrackComponent() {
     return trackComponent;
@@ -366,6 +367,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
     return mNativeInvokeHelper;
   }
 
+  @Deprecated
   public void setBizType(String bizType) {
     if (!TextUtils.isEmpty(bizType)) {
       mWXPerformance.bizType = bizType;
@@ -459,6 +461,8 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
    * @param flag     RenderStrategy {@link WXRenderStrategy}
    */
   public void render(String pageName, String template, Map<String, Object> 
options, String jsonInitData, WXRenderStrategy flag) {
+    mWXPerformance.beforeInstanceRender(mInstanceId);
+
     if(WXEnvironment.isApkDebugable() && 
WXPerformance.DEFAULT.equals(pageName)){
       WXLogUtils.e("WXSDKInstance", "Please set your pageName or your js 
bundle url !!!!!!!");
 
@@ -833,6 +837,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
    *  begin hook Activity life cycle callback
    ********************************************************/
 
+
   @Override
   public void onActivityCreate() {
 
@@ -883,11 +888,12 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
         mWXPerformance.useScroller=1;
       }
       mWXPerformance.maxDeepViewLayer=getMaxDeepLayer();
-         mWXPerformance.wxDims = mwxDims;
-         mWXPerformance.measureTimes = measureTimes;
+      mWXPerformance.wxDims = mwxDims;
+      mWXPerformance.measureTimes = measureTimes;
       if (mUserTrackAdapter != null) {
         mUserTrackAdapter.commit(mContext, null, IWXUserTrackAdapter.LOAD, 
mWXPerformance, getUserTrackParams());
       }
+      WXAnalyzerDataTransfer.transferPerformance(mWXPerformance, 
getInstanceId());
       isCommit=true;
     }
     // module listen Activity onActivityPause
@@ -904,7 +910,12 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, 
Constants.Event.PAUSE_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, 
getInstanceId());
-      mContext.sendBroadcast(intent);
+      //todo tmp solution for gray version
+      if (null != mContext){
+        mContext.sendBroadcast(intent);
+      }else {
+        WXEnvironment.getApplication().sendBroadcast(intent);
+      }
       this.mCurrentGround = true;
     }
   }
@@ -1040,6 +1051,10 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
 
 
   public void onCreateFinish() {
+    if (null != mWXPerformance){
+      
mWXPerformance.callCreateFinishTime=System.currentTimeMillis()-mWXPerformance
+          .renderTimeOrigin;
+    }
     if (mContext != null) {
       runOnUiThread(new Runnable() {
 
@@ -1133,6 +1148,23 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
     }
   }
 
+  /**
+   * when add/rm element
+   */
+  public void onElementChange(){
+    if (isDestroy() || !mEnd ||null == mRenderContainer || 
mRenderContainer.isPageHasEvent() ||
+        mWXPerformance == null){
+      return;
+    }
+    long lazyLoadTime = System.currentTimeMillis()- 
mWXPerformance.renderTimeOrigin - mWXPerformance
+        .callCreateFinishTime;
+    if (lazyLoadTime > 8000){
+      //bad case
+      return;
+    }
+    getWXPerformance().interactionTime = mWXPerformance.callCreateFinishTime + 
lazyLoadTime;
+  }
+
   public void onRenderError(final String errCode, final String msg) {
     if (mRenderListener != null && mContext != null) {
       runOnUiThread(new Runnable() {
@@ -1189,8 +1221,18 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
     }
   }
 
-  public void callNativeTime(long time) {
-    mWXPerformance.callNativeTime += time;
+  public void callNativeTime(final long time) {
+    if (!mEnd){
+      mWXPerformance.fsCallNativeTotalTime += time;
+      mWXPerformance.fsCallNativeTotalNum++;
+    }
+  }
+
+  public void callJsTime(final long time){
+    if (!mEnd){
+      mWXPerformance.fsCallJsTotalTime+=time;
+      mWXPerformance.fsCallJsTotalNum++;
+    }
   }
 
   public void jsonParseTime(long time) {
@@ -1198,7 +1240,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
   }
 
   public void firstScreenRenderFinished() {
-    if(mEnd == true)
+    if(mEnd)
        return;
 
     mEnd = true;
@@ -1217,6 +1259,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
     }
 
     mWXPerformance.screenRenderTime = System.currentTimeMillis() - 
mRenderStartTime;
+    mWXPerformance.fsRenderTime = System.currentTimeMillis();
     WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", 
mWXPerformance.screenRenderTime);
     WXLogUtils.renderPerformanceLog("   firstScreenJSFExecuteTime", 
mWXPerformance.firstScreenJSFExecuteTime);
     WXLogUtils.renderPerformanceLog("   firstScreenCallNativeTime", 
mWXPerformance.callNativeTime);
@@ -1347,6 +1390,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
       if(templateRef != null){
         templateRef = null;
       }
+      mWXPerformance.afterInstanceDestroy(mInstanceId);
     }
   }
 
@@ -1486,6 +1530,9 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
   }
 
   public void fireEvent(String elementRef,final String type, final Map<String, 
Object> data,final Map<String, Object> domChanges, List<Object> eventArgs, 
EventResult callback) {
+    if (null != mWXPerformance && 
mWXPerformance.fsCallEventTotalNum<Integer.MAX_VALUE){
+      mWXPerformance.fsCallEventTotalNum++;
+    }
     
WXBridgeManager.getInstance().fireEventOnNode(getInstanceId(),elementRef,type,data,domChanges,
 eventArgs, callback);
   }
   /**
@@ -1615,6 +1662,21 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
     mMaxDeepLayer = maxDeepLayer;
   }
 
+  public int getMaxDomDeep() {
+    return mMaxVDomDeepLayer;
+  }
+
+  public void setMaxDomDeep(int maxDomDeep){
+    mMaxVDomDeepLayer = maxDomDeep;
+    mWXPerformance.maxDeepVDomLayer = maxDomDeep;
+  }
+
+  public void onHttpStart(){
+    if (!mEnd){
+      mWXPerformance.fsRequestNum++;
+    }
+  }
+
   /**
    * load bundle js listener
    */
@@ -1645,7 +1707,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
         event.submit();
       }
     }
-    
+
     public void setSDKInstance(WXSDKInstance instance) {
       this.instance = instance;
     }
@@ -1655,6 +1717,7 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
       if (this.instance != null
           && this.instance.getWXStatisticsListener() != null) {
         this.instance.getWXStatisticsListener().onHttpStart();
+        this.instance.onHttpStart();
       }
     }
 
@@ -1720,9 +1783,17 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
         mWXPerformance.syncTaskTime=syncTaskTime instanceof Long 
?(long)syncTaskTime:0;
 
         Object requestType=response.extendParams.get("requestType");
-        mWXPerformance.requestType=requestType instanceof 
String?(String)requestType:"";
+        mWXPerformance.requestType=requestType instanceof 
String?(String)requestType:"none";
+
+        Object cacheType = 
response.extendParams.get(Dimension.cacheType.toString());
+        if(cacheType instanceof String){
+          mWXPerformance.cacheType = (String) cacheType;
+        }
 
-        if("network".equals(requestType) && mUserTrackAdapter!=null){
+        Object zCacheInfo = response.extendParams.get("zCacheInfo");
+        mWXPerformance.zCacheInfo = zCacheInfo instanceof 
String?(String)zCacheInfo:"";
+
+        if(isNet(mWXPerformance.requestType) && mUserTrackAdapter!=null){
           WXPerformance performance=new WXPerformance();
           if(!TextUtils.isEmpty(mBundleUrl)){
             try {
@@ -1737,27 +1808,10 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
             performance.appendErrMsg("|");
             performance.appendErrMsg(response.errorMsg);
 
-                       
WXExceptionUtils.commitCriticalExceptionRT(getInstanceId(),
-                                       
WXErrorCode.WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED.getErrorCode(),
-                                       "WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED", 
WXErrorCode.WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED.getErrorMsg() +
-                                       "\n response.errorCode=" + 
response.errorCode +
-                                       "\n response.errorMsg=" +  
response.errorMsg +
-                                       "\n response=" + getTemplateInfo(),
-                                       null);
-
           }else if("200".equals(response.statusCode) && 
(response.originalData==null || response.originalData.length<=0)){
             
performance.errCode=WXErrorCode.WX_ERR_JSBUNDLE_DOWNLOAD.getErrorCode();
             performance.appendErrMsg(response.statusCode);
             performance.appendErrMsg("|template is null!");
-
-                       
WXExceptionUtils.commitCriticalExceptionRT(getInstanceId(),
-                                       
WXErrorCode.WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED.getErrorCode(),
-                                       
"WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED_TEMPLATE_NULL", 
WXErrorCode.WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED.getErrorMsg() +
-                                                       "\n 
response.errorCode=" + response.errorCode +
-                                                       "\n response.errorMsg=" 
+  response.errorMsg +
-                                                       "\n response=" + 
getTemplateInfo(),
-                                       null);
-
           }else {
             performance.errCode=WXErrorCode.WX_SUCCESS.getErrorCode();
                  }
@@ -1773,10 +1827,10 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
         render(pageName, template, options, jsonInitData, flag);
 
                // check content-type
-      } else if 
(TextUtils.equals(WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getDegradErrorCode(),
+      } else if 
(TextUtils.equals(WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
                          response.statusCode)) {
         WXLogUtils.e("user intercept: WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR");
-        
onRenderError(WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getDegradErrorCode(),
+        
onRenderError(WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
                                "|response.errorMsg==" + response.errorMsg +
                                "|instance.getTemplateInfo == \n" + 
instance.getTemplateInfo() +
                                "|instance bundleUrl = \n" + 
instance.getBundleUrl() +
@@ -1787,18 +1841,25 @@ public class WXSDKInstance implements 
IWXActivityStateListener,DomContext, View.
       } else if (response!=null && response.originalData!=null && 
TextUtils.equals("-206", response.statusCode)) {
                WXLogUtils.e("user intercept: 
WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED");
                onRenderError(
-                               
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getDegradErrorCode(),
-                               
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getDegradErrorMsg()
 +
+                               
WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode(),
+                
WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode() +
                                "|response.errorMsg==" + response.errorMsg +
                                "|instance.getTemplateInfo == \n" + 
instance.getTemplateInfo());
          }
       else {
-        
onRenderError(WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getDegradErrorCode(),
+        
onRenderError(WXErrorCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode(),
                                response.errorMsg);
       }
     }
   }
 
+  private boolean isNet(String requestType){
+
+    return "network".equals(requestType) || "2g".equals(requestType) || 
"3g".equals(requestType)
+           || "4g".equals(requestType) || "wifi".equals(requestType) || 
"other".equals(requestType)
+           || "unknown".equals(requestType);
+  }
+
   /**
    * return md5, and bytes length
    * */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
----------------------------------------------------------------------
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 8c61f71..b9a0913 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -49,6 +49,7 @@ import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
 import com.taobao.weex.common.WXWorkThreadManager;
 import com.taobao.weex.dom.WXDomManager;
+import com.taobao.weex.performance.IWXAnalyzer;
 import com.taobao.weex.ui.WXRenderManager;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
@@ -79,6 +80,7 @@ public class WXSDKManager {
   private IWXHttpAdapter mIWXHttpAdapter;
   private IActivityNavBarSetter mActivityNavBarSetter;
   private IWXAccessibilityRoleAdapter mRoleAdapter;
+  private List<IWXAnalyzer> mWXAnalyzerList;
 
   private ICrashInfoReporter mCrashInfo;
 
@@ -107,6 +109,7 @@ public class WXSDKManager {
     mWXDomManager = new WXDomManager(mWXRenderManager);
     mBridgeManager = WXBridgeManager.getInstance();
     mWXWorkThreadManager = new WXWorkThreadManager();
+    mWXAnalyzerList = new ArrayList<>();
   }
 
   /**
@@ -358,6 +361,20 @@ public class WXSDKManager {
     return mIWXSoLoaderAdapter;
   }
 
+  public List<IWXAnalyzer> getWXAnalyzerList(){
+    return mWXAnalyzerList;
+  }
+
+  public void addWXAnalyzer(IWXAnalyzer analyzer){
+    if (!mWXAnalyzerList.contains(analyzer)) {
+      mWXAnalyzerList.add(analyzer);
+    }
+  }
+
+  public void rmWXAnalyzer(IWXAnalyzer analyzer){
+    mWXAnalyzerList.remove(analyzer);
+  }
+
   void setInitConfig(InitConfig config){
     this.mIWXHttpAdapter = config.getHttpAdapter();
     this.mIWXImgLoaderAdapter = config.getImgAdapter();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
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 fca40d9..9e5d280 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
@@ -28,12 +28,13 @@ import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.util.ArrayMap;
 import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewGroup;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXEnvironment;
-import com.taobao.weex.WXRenderErrorCode;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.adapter.IWXJSExceptionAdapter;
@@ -45,6 +46,7 @@ import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXException;
 import com.taobao.weex.common.WXJSBridgeMsgType;
 import com.taobao.weex.common.WXJSExceptionInfo;
+import com.taobao.weex.common.WXPerformance;
 import com.taobao.weex.common.WXRefreshData;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
@@ -383,7 +385,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
          String err = "[WXBridgeManager] callNative exception: " + 
WXLogUtils.getStackTrace(e);
       WXLogUtils.e(err);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callNativeModule",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callNativeModule",
                          err, null);
     }
 
@@ -415,7 +417,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
          String err = "[WXBridgeManager] callNative exception: " + 
WXLogUtils.getStackTrace(e);
          WXLogUtils.e(err);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callNativeModule",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callNativeModule",
                          err, null);
     }
 
@@ -437,7 +439,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callNative exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callNativeComponent",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callNativeComponent",
                          WXLogUtils.getStackTrace(e), null);
     }
     return null;
@@ -455,7 +457,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
          String err = "[WXBridgeManager] callNative: call Native tasks is 
null";
       WXLogUtils.e(err);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callNative",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNative",
                          err + "| INSTANCE_RENDERING_ERROR will be set", null);
 
       return IWXBridge.INSTANCE_RENDERING_ERROR;
@@ -511,7 +513,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       } catch (Exception e) {
         WXLogUtils.e("[WXBridgeManager] callNative exception: ", e);
                WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                               
WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), "callNative",
+                               WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callNative",
                                WXLogUtils.getStackTrace(e) , null);
       }
     }
@@ -531,7 +533,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       WXLogUtils.d("[WXBridgeManager] callCreateBody: call CreateBody tasks is 
null");
       // }
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callCreateBody",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateBody",
                          "tasks is empty, INSTANCE_RENDERING_ERROR will be 
set", null);
 
          return IWXBridge.INSTANCE_RENDERING_ERROR;
@@ -569,7 +571,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callCreateBody exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callCreateBody",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateBody",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -604,7 +606,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateFinish exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callUpdateFinish",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callUpdateFinish",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -638,7 +640,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callCreateFinish exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callUpdateFinish",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callUpdateFinish",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -673,7 +675,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRefreshFinish exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callRefreshFinish",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callRefreshFinish",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -691,7 +693,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     if (TextUtils.isEmpty(task)) {
       WXLogUtils.e("[WXBridgeManager] callUpdateAttrs: call UpdateAttrs tasks 
is null");
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callUpdateAttrs",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callUpdateAttrs",
                          "call UpdateAttrs tasks is null| 
INSTANCE_RENDERING_ERROR will be set", null);
 
       return IWXBridge.INSTANCE_RENDERING_ERROR;
@@ -729,7 +731,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateAttrs exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callUpdateAttrs",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callUpdateAttrs",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -747,7 +749,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     if (TextUtils.isEmpty(task)) {
       WXLogUtils.e("[WXBridgeManager] callUpdateStyle: call UpdateStyle tasks 
is null");
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callUpdateStyle",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callUpdateStyle",
                          "task is empty", null);
          return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
@@ -784,7 +786,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateStyle exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callUpdateStyle",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callUpdateStyle",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -823,7 +825,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRemoveElement exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callRemoveElement",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callRemoveElement",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -860,7 +862,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callMoveElement exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callMoveElement",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"callMoveElement",
                          WXLogUtils.getStackTrace(e), null);
 
        }
@@ -900,7 +902,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callAddEvent exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callAddEvent",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAddEvent",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -939,7 +941,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRemoveEvent exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callAddEvent",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAddEvent",
                          WXLogUtils.getStackTrace(e), null);
     }
 
@@ -1037,7 +1039,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callReloadPage exception: ", e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"callReloadPage",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callReloadPage",
                          WXLogUtils.getStackTrace(e), null);
     }
     return IWXBridge.INSTANCE_RENDERING_ERROR;
@@ -1415,8 +1417,8 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
         WXSDKInstance instance = 
WXSDKManager.getInstance().getSDKInstance(instanceId);
         if (instance != null) {
           instance.onRenderError(
-                                 
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorCode(),
-                                 
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorMsg()
+                                
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
+                                 
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg()
                                  + "invokeRefreshInstance FAILED for 
JSFrameworkInit FAILED, intance will invoke instance.onRenderError"
                  );
         }
@@ -1443,7 +1445,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Throwable e) {
       String err = "[WXBridgeManager] invokeRefreshInstance " + 
WXLogUtils.getStackTrace(e);
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"invokeRefreshInstance",
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"invokeRefreshInstance",
                          err, null);
       WXLogUtils.e(err);
     }
@@ -1509,7 +1511,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     extParams.put("jscCrashStack", errMsg);
     IWXJSExceptionAdapter adapter = 
WXSDKManager.getInstance().getIWXJSExceptionAdapter();
     if (adapter != null) {
-      WXJSExceptionInfo jsException = new WXJSExceptionInfo(instanceId, url, 
errorCode.getErrorCode(), method, exception, extParams);
+      WXJSExceptionInfo jsException = new WXJSExceptionInfo(instanceId, url, 
errorCode, method, exception, extParams);
       adapter.onJSException(jsException);
       // if (WXEnvironment.isApkDebugable()) {
       WXLogUtils.e(jsException.toString());
@@ -1529,8 +1531,8 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     }
     if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(template) || 
mJSHandler == null) {
       instance.onRenderError(
-                         
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorCode(),
-                         
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorMsg()
 +
+                         
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
+                         
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() +
          " instanceId==" + instanceId + " template ==" + template + " 
mJSHandler== " + mJSHandler.toString()
          );
       return;
@@ -1538,8 +1540,8 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
 
     if (!isJSFrameworkInit() && reInitCount == 1 && 
!WXEnvironment.sDebugServerConnectable) {
       instance.onRenderError(
-                         
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorCode(),
-                         
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorMsg()
 +
+                         
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
+              WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() +
          " isJSFrameworkInit==" + isJSFrameworkInit() + " reInitCount == 1" );
       post(new Runnable() {
         @Override
@@ -1556,11 +1558,13 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       public void run() {
         long start = System.currentTimeMillis();
         invokeCreateInstance(instance, template, options, data);
-        final long totalTime = System.currentTimeMillis() - start;
+        final long endTime = System.currentTimeMillis();
+        final long totalTime = endTime- start;
         WXSDKManager.getInstance().postOnUiThread(new Runnable() {
 
             @Override
             public void run() {
+              instance.getWXPerformance().callCreateInstanceTime = endTime;
             instance.createInstanceFinished(totalTime);
           }
         }, 0);
@@ -1579,8 +1583,8 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       if (!isJSFrameworkInit()) {
                String err = "[WXBridgeManager] invokeCreateInstance: 
framework.js uninitialized.";
                instance.onRenderError(
-                               
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorCode(),
-                               
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorMsg()
+                               
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
+                WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg()
                );
         WXLogUtils.e(err);
         return;
@@ -1610,8 +1614,8 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
                                + instance.getTemplateInfo();
 
         instance.onRenderError(
-                       
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorCode(),
-                               
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorMsg()
 + err);
+                       
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
+                WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() 
+ err);
                WXLogUtils.e(err);
       }
     }
@@ -1658,7 +1662,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Throwable e) {
       String err = "[WXBridgeManager] invokeDestroyInstance " + e.getCause();
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE.getErrorCode(), 
"invokeDestroyInstance", err, null);
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE, 
"invokeDestroyInstance", err, null);
       WXLogUtils.e(err);
     }
   }
@@ -1713,7 +1717,12 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       WXLogUtils.d(mLodBuilder.substring(0));
       mLodBuilder.setLength(0);
     }
+    final long start = System.currentTimeMillis();
     mWXBridge.execJS(instanceId, namespace, function, args);
+    WXSDKInstance instance = 
WXSDKManager.getInstance().getSDKInstance(instanceId);
+    if (null != instance){
+      instance.callJsTime(System.currentTimeMillis()-start);
+    }
   }
 
   private byte[] invokeExecJSWithResult(String instanceId, String namespace, 
String function,
@@ -1766,7 +1775,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       }
       if (TextUtils.isEmpty(framework)) {
         setJSFrameworkInit(false);
-               WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK.getErrorCode(),
+               WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK,
                                "initFramework", "framework is empty!! ", null);
         return;
       }
@@ -1809,23 +1818,23 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
           String reinitInfo = "";
           if (reInitCount > 1) {
             reinitInfo = "reinit Framework:";
-            WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_JS_FRAMEWORK_REINIT_SUCCESS.getErrorCode(),
+            WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_JS_FRAMEWORK_REINIT_SUCCESS,
                     "initFramework", reinitInfo + "success", null);
           } else {
-            WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_JS_FRAMEWORK_INIT_SUCCESS.getErrorCode(),
-                    "initFramework", reinitInfo + "success", null);
+//            WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_JS_FRAMEWORK_INIT_SUCCESS.getErrorCode(),
+//                    "initFramework", reinitInfo + "success", null);
           }
 
         } else {
           if (reInitCount > 1) {
             WXLogUtils.e("[WXBridgeManager] invokeReInitFramework  
ExecuteJavaScript fail");
             String err = "[WXBridgeManager] invokeReInitFramework  
ExecuteJavaScript fail reinit FrameWork";
-                       WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_REINIT_FRAMEWORK.getErrorCode(),
+                       WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_REINIT_FRAMEWORK,
                                        "initFramework", "reInitCount = " + 
reInitCount + err, null);
           } else {
             WXLogUtils.e("[WXBridgeManager] invokeInitFramework  
ExecuteJavaScript fail");
             String err = "[WXBridgeManager] invokeInitFramework  
ExecuteJavaScript fail";
-                       WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK.getErrorCode(),
+                       WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK,
                                        "initFramework", err, null);
           }
         }
@@ -1833,12 +1842,12 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
         if (reInitCount > 1) {
           WXLogUtils.e("[WXBridgeManager] invokeInitFramework ", e);
           String err = "[WXBridgeManager] invokeInitFramework reinit FrameWork 
exception!#" + e.toString();
-                 WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_REINIT_FRAMEWORK.getErrorCode(),
+                 WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_REINIT_FRAMEWORK,
                                  "initFramework", "reInitCount ==" + 
reInitCount + err, null);
         } else {
           WXLogUtils.e("[WXBridgeManager] invokeInitFramework ", e);
           String err = "[WXBridgeManager] invokeInitFramework exception!#" + 
e.toString();
-                 WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK.getErrorCode(),
+                 WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK,
                                  "initFramework", err, null);
         }
       }
@@ -1883,7 +1892,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Throwable e) {
       WXLogUtils.e("WXBridgeManager", e);
       String err = "invokeCallJSBatch#" + WXLogUtils.getStackTrace(e);
-         WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK.getErrorCode(),
+         WXExceptionUtils.commitCriticalExceptionRT(null, 
WXErrorCode.WX_ERR_JS_FRAMEWORK,
                          "invokeCallJSBatch", err, null);
     }
 
@@ -2016,7 +2025,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
          data.put("inputParams",service + "||" + receiver.toString());
 
          WXExceptionUtils.commitCriticalExceptionRT("invokeExecJSService",
-                         
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE.getErrorCode(),
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE,
                          "invokeExecJSService",
                          
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE.getErrorMsg()
                                          + "[WXBridgeManager] 
invokeRegisterService:"
@@ -2044,7 +2053,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       mWXBridge.execJS("", null, METHOD_REGISTER_MODULES, args);
     } catch (Throwable e) {
          WXExceptionUtils.commitCriticalExceptionRT(null,
-                         
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES.getErrorCode(),
+                         WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES,
                          "invokeRegisterModules", 
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES.getErrorMsg() +
                          " \n " + e.getMessage() + 
modules.entrySet().toString(),
                          null );
@@ -2076,7 +2085,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
     } catch (Throwable e) {
       WXLogUtils.e("[WXBridgeManager] invokeRegisterComponents ", e);
          WXExceptionUtils.commitCriticalExceptionRT(null,
-                         
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED.getErrorCode(),
+                         
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED,
                          METHOD_REGISTER_COMPONENTS,
                          
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED.getErrorMsg()
                                          + args.toString()
@@ -2118,12 +2127,14 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
             return;
           } else {
             instance.onRenderError(//DegradPassivity to H5
-                       
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorCode(),
-                                       
WXRenderErrorCode.DegradPassivityCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getDegradErrorMsg()
 +
+                       
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
+                    
WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() +
                                                        "reportJSException >>>> 
instanceId:" + instanceId
                                                        + ", exception 
function:" + function + ", exception:"
                                                        + exception
                        );
+            //doReportJSException(instanceId,function,exception);
+            
WXExceptionUtils.commitCriticalExceptionRT(instanceId,WXErrorCode.WX_RENDER_ERR_JS_CREATE_INSTANCE,function,exception,null);
             return;
           }
         } catch (Exception e) {
@@ -2132,10 +2143,13 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
       }
       instance.onJSException(WXErrorCode.WX_ERR_JS_EXECUTE.getErrorCode(), 
function, exception);
        }
+       doReportJSException(instanceId,function,exception);
+  }
 
+  private void doReportJSException(String instanceId, String function, String 
exception){
+    WXSDKInstance instance = 
WXSDKManager.getInstance().getSDKInstance(instanceId);
     IWXJSExceptionAdapter adapter = 
WXSDKManager.getInstance().getIWXJSExceptionAdapter();
     if (adapter != null) {
-      String bundleUrl;
       String exceptionId = instanceId;
 
       if (instanceId == "" || instanceId == null) {
@@ -2144,7 +2158,6 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
 
       if (instance == null) {
         if (("initFramework").equals(function)) {
-          bundleUrl = "jsExceptionBeforeRenderInstanceNull";
           String exceptionExt = null;
           try {
             if (WXEnvironment.getApplication() != null) {
@@ -2170,7 +2183,7 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
                   file.delete();
                 }
               } catch (Throwable throwable) {
-
+                throwable.printStackTrace();
               }
             }
           } catch (Throwable e) {
@@ -2179,25 +2192,45 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
           exception += "\n" + exceptionExt;
           WXLogUtils.e("reportJSException:" + exception);
 
-        } else if (function == null) {
-          bundleUrl = "jsExceptionInstanceAndFunctionNull";
-        } else {
-          bundleUrl = "jsExceptionInstanceNull" + function;
         }
-      } else {
-        bundleUrl = instance.getBundleUrl();
       }
 
-//      WXJSExceptionInfo jsException = new WXJSExceptionInfo(exceptionId, 
bundleUrl, WXErrorCode.WX_ERR_JS_EXECUTE.getErrorCode(), function, exception, 
null);
-//      adapter.onJSException(jsException);
+     if (checkEmptyScreen(instance)){
+        if (WXEnvironment.isApkDebugable()){
+          WXLogUtils.d("render error 4 js error !");
+        }
+       WXExceptionUtils.commitCriticalExceptionRT(exceptionId, 
WXErrorCode.WX_RENDER_ERR_JS_RUNTIME,
+                                                  function,
+                                                  
WXErrorCode.WX_RENDER_ERR_JS_RUNTIME.getErrorMsg() + exception,
+                                                  null);
+     } else {
+       WXExceptionUtils.commitCriticalExceptionRT(exceptionId, 
WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE,
+                                                  function,
+                                                  
WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE.getErrorMsg() + exception,
+                                                  null);
+     }
+    }
+  }
+
+  private boolean checkEmptyScreen(WXSDKInstance instance){
+    if (null == instance || instance.isDestroy()){
+      return false;
+    }
 
-         WXExceptionUtils.commitCriticalExceptionRT(exceptionId, 
WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE.getErrorCode(),
-                         function,
-                         WXErrorCode.WX_KEY_EXCEPTION_WXBRIDGE.getErrorMsg() + 
exception,
-                         null);
+    View rootView = instance.getRootView();
+    if (null == rootView){
+      return true;
+    }
+
+    if (rootView instanceof ViewGroup){
+      return ((ViewGroup) rootView).getChildCount() > 0;
+    }else {
+      return false;
     }
   }
 
+
+
   private void registerDomModule() throws WXException {
     /** Tell Javascript Framework what methods you have. This is Required.**/
     Map<String, Object> domMap = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
----------------------------------------------------------------------
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java 
b/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
index 9e87e6a..9c6273d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
@@ -171,7 +171,7 @@ public class WXModuleManager {
       }
     } catch (Exception e) {
          WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                         
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED.getErrorCode(),
+                         
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED,
                          "callModuleMethod",
                          
WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED.getErrorMsg()
                          + "callModuleMethod >>> invoke module:" + moduleStr + 
", method:" + methodStr + " failed. "

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/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 36a03db..2bd2d16 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
@@ -18,29 +18,32 @@
  */
 package com.taobao.weex.common;
 
+
 public enum WXErrorCode {
+
+
     /*
      * environment
      **/
   /**
    * Failure for load so library
    */
-  WX_ERR_LOAD_SO("-2001", "load so error"),
+  WX_ERR_LOAD_SO("-2001", "load so 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * Failure for load JSLib
    */
-  WX_ERR_LOAD_JSLIB("-2002", "unzip JSLib error!"),
+  WX_ERR_LOAD_JSLIB("-2002", "unzip JSLib 
error!",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * So library corrupted
    */
-  WX_ERR_BAD_SO("-2003", "so size error, to reload apk so"),
+  WX_ERR_BAD_SO("-2003", "so size error, to reload apk 
so",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * Failure for extract and copy so from apk
    */
-  WX_ERR_COPY_FROM_APK("-2007", "system load so error,copy from APK also 
error!"),
+  WX_ERR_COPY_FROM_APK("-2007", "system load so error,copy from APK also 
error!",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * jsBridge
@@ -48,171 +51,230 @@ public enum WXErrorCode {
   /**
    * Error for JavaScript function parameter
    */
-  WX_ERR_JSFUNC_PARAM("-2009", "JS params error!"),
+  WX_ERR_JSFUNC_PARAM("-2009", "JS params 
error!",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * Error for parsing JSON object
    */
-  WX_ERR_JSON_OBJECT("-2008", "transform JSON->OBJ  error!"),
+  WX_ERR_JSON_OBJECT("-2008", "transform JSON->OBJ  
error!",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * Failure for invoking JavaScript function
    */
-  WX_ERR_INVOKE_NATIVE("-2012", "Native-> Call ->JS  error!"),
+  WX_ERR_INVOKE_NATIVE("-2012", "Native-> Call ->JS  
error!",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * Failure for executing JavaScript function.
    */
-  WX_ERR_JS_EXECUTE("-2013", "JavaScript execute error!"),
+  WX_ERR_JS_EXECUTE("-2013", "JavaScript execute 
error!",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
 
   /*
    * domModule
    **/
-  WX_SUCCESS("0", "successful"),
+  WX_SUCCESS("0", "successful",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for createBody
    */
-  WX_ERR_DOM_CREATEBODY("-2100", "createBody error"),
+  WX_ERR_DOM_CREATEBODY("-2100", "createBody 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for updateAttrs
    */
-  WX_ERR_DOM_UPDATEATTRS("-2101", "updateAttrs error"),
+  WX_ERR_DOM_UPDATEATTRS("-2101", "updateAttrs 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for updateAttr
    */
-  WX_ERR_DOM_UPDATESTYLE("-2102", "updateStyle error"),
+  WX_ERR_DOM_UPDATESTYLE("-2102", "updateStyle 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for addElement
    */
-  WX_ERR_DOM_ADDELEMENT("-2103", "addElement error"),
+  WX_ERR_DOM_ADDELEMENT("-2103", "addElement 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for removeElement
    */
-  WX_ERR_DOM_REMOVEELEMENT("-2104", "removeElement error"),
+  WX_ERR_DOM_REMOVEELEMENT("-2104", "removeElement 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for moveElement
    */
-  WX_ERR_DOM_MOVEELEMENT("-2105", "moveElement error"),
+  WX_ERR_DOM_MOVEELEMENT("-2105", "moveElement 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for addEvent
    */
-  WX_ERR_DOM_ADDEVENT("-2106", "addEvent error"),
+  WX_ERR_DOM_ADDEVENT("-2106", "addEvent 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for removeEvent
    */
-  WX_ERR_DOM_REMOVEEVENT("-2107", "removeEvent error"),
+  WX_ERR_DOM_REMOVEEVENT("-2107", "removeEvent 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for invoking createFinish
    */
-  WX_ERROR_DOM_CREATEFINISH("-2108", "createFinish error"),
+  WX_ERROR_DOM_CREATEFINISH("-2108", "createFinish 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for invoking refreshFinish
    */
-  WX_ERROR_DOM_REFRESHFINISH("-2109", "refreshFinish error"),
+  WX_ERROR_DOM_REFRESHFINISH("-2109", "refreshFinish 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * Failure for scrollToElement
    */
-  WX_ERR_DOM_SCROLLTO("-2110", "scrollToElement"),
+  WX_ERR_DOM_SCROLLTO("-2110", 
"scrollToElement",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    *
    */
-  WX_ERR_RELOAD_PAGE("-2111", "reloadPage"),
+  WX_ERR_RELOAD_PAGE("-2111", 
"reloadPage",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    *
    */
-  WX_ERR_JSC_CRASH("-2112", "weexjscCrash"),
+  WX_ERR_JSC_CRASH("-2112", 
"weexjscCrash",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    *dom actions invalid for native
    */
-  WX_ERR_FIRST_DOM_ACTION_EXCEPTION("-2113", "dom action is invalid "),
+  WX_ERR_FIRST_DOM_ACTION_EXCEPTION("-2113", "dom action is invalid 
",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * JS Bundle download error
    */
 
-  WX_ERR_JSDOWNLOAD_START("-2201", "js bundle download start"),
+  WX_ERR_JSDOWNLOAD_START("-2201", "js bundle download 
start",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
-  WX_ERR_JSBUNDLE_DOWNLOAD("-2299", "js bundle download err"),
+  WX_ERR_JSBUNDLE_DOWNLOAD("-2299", "js bundle download 
err",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
-  WX_ERR_JSBUNDLE_EMPTY("-2203", "js bundle empty"),
+  WX_ERR_JSBUNDLE_EMPTY("-2203", "js bundle 
empty",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
-  WX_ERR_JSDOWNLOAD_END("-2299", "js bundle download end"),
+  WX_ERR_JSDOWNLOAD_END("-2299", "js bundle download 
end",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   // for js framework
-  WX_JS_FRAMEWORK_INIT_SUCCESS("-1000", "js framework success"),
+  WX_JS_FRAMEWORK_INIT_SUCCESS("-1000", "js framework 
success",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
-  WX_JS_FRAMEWORK_REINIT_SUCCESS("-1001", "js framework reinit success"),
+  WX_JS_FRAMEWORK_REINIT_SUCCESS("-1001", "js framework reinit 
success",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   /**
    * JS Framework run error
    */
-  WX_ERR_JS_FRAMEWORK("-1002", "js framework error"),
+  WX_ERR_JS_FRAMEWORK("-1002", "js framework 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
-  WX_ERR_JS_REINIT_FRAMEWORK("-1003", "js reinit framework error"),
+  WX_ERR_JS_REINIT_FRAMEWORK("-1003", "js reinit framework 
error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
 
   /**
    * WX Key Exception Commit RT SDK Init
    */
-  WX_KEY_EXCEPTION_SDK_INIT("-9000", "[WX_KEY_EXCEPTION_SDK_INIT]"),
-  WX_KEY_EXCEPTION_SDK_INIT_CPU_NOT_SUPPORT("-9001", 
"[WX_KEY_EXCEPTION_SDK_INIT_CPU_NOT_SUPPORT] for android cpu is x86"),
-  WX_KEY_EXCEPTION_SDK_INIT_TABLE_NOT_SUPPORT("-9002", 
"[WX_KEY_EXCEPTION_SDK_INIT_TABLE_NOT_SUPPORT] for device isTabletDevice"),
-  WX_KEY_EXCEPTION_SDK_INIT_JSFM_INIT_FAILED("-9003", 
"[WX_KEY_EXCEPTION_SDK_INIT_JSFM_INIT_FAILED] for jsfm init failed|detail error 
is:"),
+  WX_KEY_EXCEPTION_SDK_INIT("-9000", 
"[WX_KEY_EXCEPTION_SDK_INIT]",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_SDK_INIT_CPU_NOT_SUPPORT("-9001", 
"[WX_KEY_EXCEPTION_SDK_INIT_CPU_NOT_SUPPORT] for android cpu is 
x86",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_SDK_INIT_TABLE_NOT_SUPPORT("-9002", 
"[WX_KEY_EXCEPTION_SDK_INIT_TABLE_NOT_SUPPORT] for device 
isTabletDevice",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_SDK_INIT_JSFM_INIT_FAILED("-9003", 
"[WX_KEY_EXCEPTION_SDK_INIT_JSFM_INIT_FAILED] for jsfm init failed|detail error 
is:",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * WX Key Exception Commit RT Register
    */
-  WX_KEY_EXCEPTION_INVOKE("-9100", "[WX_KEY_EXCEPTION_INVOKE]"),
-  WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED("-9101", 
"[WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED] details"),
-  WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE("-9102", 
"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] details"),
-  WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES("-9103", 
"[WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES] details"),
+  WX_KEY_EXCEPTION_INVOKE("-9100", 
"[WX_KEY_EXCEPTION_INVOKE]",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED("-9101", 
"[WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE("-9102", 
"[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES("-9103", 
"[WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   /**
    * WX Key Exception Commit Bundle Js Download
    */
-  WX_KEY_EXCEPTION_JS_DOWNLOAD("-9200", "[WX_KEY_EXCEPTION_JS_DOWNLOAD]|"),
-  WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED("-9201", 
"[WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED] | details"),
+  WX_KEY_EXCEPTION_JS_DOWNLOAD("-9200", 
"[WX_KEY_EXCEPTION_JS_DOWNLOAD]|",ErrorType.NATIVE_ERROR,ErrorGroup.NET),
+  WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED("-9201", 
"[WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED] | 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NET),
 
   /**
    * WX Key Exception Commit RT DomAction Excute
    */
-  WX_KEY_EXCEPTION_DOM("-9300", "[WX_KEY_EXCEPTION_DOM]"),
-  WX_KEY_EXCEPTION_DOM_ACTION_FIRST_ACTION("-9301", "[WX_KEY_EXCEPTION dom 
action exception] details: ACTION_FIRST_ACTION"),
-  WX_KEY_EXCEPTION_DOM_CREATE_BODY("-9302", "[WX_KEY_EXCEPTION dom action 
exception] details:CREATE_BODY"),
-  WX_KEY_EXCEPTION_DOM_UPDATE_ATTRS("-9303", "[WX_KEY_EXCEPTION dom action 
exception] details:UPDATE_ATTRS"),
-  WX_KEY_EXCEPTION_DOM_UPDATE_STYLE("-9304", "[WX_KEY_EXCEPTION dom action 
exception] details:UPDATE_STYLE"),
-  WX_KEY_EXCEPTION_DOM_REMOVE_ELEMENT("-9305", "[WX_KEY_EXCEPTION dom action 
exception] details:REMOVE_ELEMENT"),
-  WX_KEY_EXCEPTION_DOM_ADD_ELEMENT("-9306", "[WX_KEY_EXCEPTION dom action 
exception] details:ADD_ELEMENT"),
-  WX_KEY_EXCEPTION_DOM_MOVE_ELEMENT("-9307", "[WX_KEY_EXCEPTION dom action 
exception] details:MOVE_ELEMENT"),
-  WX_KEY_EXCEPTION_DOM_ADD_EVENT("-9308", "[WX_KEY_EXCEPTION dom action 
exception] details:DOM_ADD_EVENT"),
-  WX_KEY_EXCEPTION_DOM_REMOVE_EVENT("-9309", "[WX_KEY_EXCEPTION dom action 
exception] details:DOM_REMOVE_EVENT"),
-  WX_KEY_EXCEPTION_DOM_CREATE_FINISH("-9310", "[WX_KEY_EXCEPTION dom action 
exception] details:CREATE_FINISH"),
-  WX_KEY_EXCEPTION_DOM_REFRESH_FINISH("-9311", "[WX_KEY_EXCEPTION dom action 
exception] details:REFRESH_FINISH"),
-  WX_KEY_EXCEPTION_DOM_ADD_RULE("-9313", "[WX_KEY_EXCEPTION_DOM_ADD_RULE] 
details"),
-  WX_KEY_EXCEPTION_DOM_GET_COMPONENT_RECT("-9314", 
"[WX_KEY_EXCEPTION_DOM_GET_COMPONENT_RECT] details"),
-  WX_KEY_EXCEPTION_DOM_INVOKE_METHOD("-9315", 
"[WX_KEY_EXCEPTION_DOM_INVOKE_METHOD] details"),
-  WX_KEY_EXCEPTION_DOM_ANIMATION("-9316", "[WX_KEY_EXCEPTION_DOM_ANIMATION] 
details"),
-  WX_KEY_EXCEPTION_DOM_MODULEINVO("-9317", "[WX_KEY_EXCEPTION_DOM_MODULEINVO] 
details"),
+  WX_KEY_EXCEPTION_DOM("-9300", 
"[WX_KEY_EXCEPTION_DOM]",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_ACTION_FIRST_ACTION("-9301", "[WX_KEY_EXCEPTION dom 
action exception] details: 
ACTION_FIRST_ACTION",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_CREATE_BODY("-9302", "[WX_KEY_EXCEPTION dom action 
exception] details:CREATE_BODY",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_UPDATE_ATTRS("-9303", "[WX_KEY_EXCEPTION dom action 
exception] details:UPDATE_ATTRS",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_UPDATE_STYLE("-9304", "[WX_KEY_EXCEPTION dom action 
exception] details:UPDATE_STYLE",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_REMOVE_ELEMENT("-9305", "[WX_KEY_EXCEPTION dom action 
exception] details:REMOVE_ELEMENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_ADD_ELEMENT("-9306", "[WX_KEY_EXCEPTION dom action 
exception] details:ADD_ELEMENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_MOVE_ELEMENT("-9307", "[WX_KEY_EXCEPTION dom action 
exception] details:MOVE_ELEMENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_ADD_EVENT("-9308", "[WX_KEY_EXCEPTION dom action 
exception] details:DOM_ADD_EVENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_REMOVE_EVENT("-9309", "[WX_KEY_EXCEPTION dom action 
exception] details:DOM_REMOVE_EVENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_CREATE_FINISH("-9310", "[WX_KEY_EXCEPTION dom action 
exception] details:CREATE_FINISH",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_REFRESH_FINISH("-9311", "[WX_KEY_EXCEPTION dom action 
exception] details:REFRESH_FINISH",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_ADD_RULE("-9313", "[WX_KEY_EXCEPTION_DOM_ADD_RULE] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_GET_COMPONENT_RECT("-9314", 
"[WX_KEY_EXCEPTION_DOM_GET_COMPONENT_RECT] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_INVOKE_METHOD("-9315", 
"[WX_KEY_EXCEPTION_DOM_INVOKE_METHOD] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_DOM_ANIMATION("-9316", "[WX_KEY_EXCEPTION_DOM_ANIMATION] 
details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  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
    */
-  WX_KEY_EXCEPTION_WXBRIDGE("-9400", "[js excute runtime error] detail js 
stack \n"),
-  WX_KEY_EXCEPTION_WXBRIDGE_EXCEPTION("-9401", "[js excute runtime error] 
detail js stack \n");
+  WX_KEY_EXCEPTION_WXBRIDGE("-9400", "[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 \n",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),
+
+
+  /**
+   * degrade code.
+   */
+  WX_DEGRAD_ERR("-1000", "degradeToH5|Weex DegradPassivity 
\n",ErrorType.DEGRAD_ERROR,ErrorGroup.JS),
+
+  /**
+   * degrade for instance create failed, once this case occured,detail js 
stack and other specific
+   * cause need track into errmsg.
+   */
+  WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED("-1001", "degradeToH5|createInstance 
fail|wx_create_instance_error",ErrorType.DEGRAD_ERROR,ErrorGroup.NATIVE),
+
+  /**
+   * degrade for network failed download js bundle.once this case 
occured,network requist response header
+   * and statuscode need track into errmsg.
+   */
+  WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED("-1002", "|wx_network_error|js 
bundle download failed",ErrorType.DEGRAD_ERROR,ErrorGroup.NET),
+
+  /**
+   * degrade for network failed for bundlejs is unbroken , once this case 
occured,network requist response header
+   * and statuscode need track into errmsg.
+   */
+  WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED("-1003", 
"degradeToH5|wx_network_error|js bundle content-length check 
failed",ErrorType.DEGRAD_ERROR,ErrorGroup.NET),
+
+  /**
+   * degrade for Response header Content-Type is null or not 
"application/javascript".
+   * once this case occured,network requist response header and statuscode 
need track into errmsg.
+   */
+  WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR("-1004", 
"degradeToH5|wx_user_intercept_error |Content-Type is not 
application/javascript, " +
+                                                 "Weex render template must be 
javascript, please check your request!",ErrorType.DEGRAD_ERROR,ErrorGroup.NET),
+
+  /**
+   * degrade for other reason. such as white screen which block error for some 
unknown reason.
+   * once this case occured,detail msg need track.
+   */
+  WX_DEGRAD_ERR_OTHER_CAUSE_DEGRADTOH5("-1005", "degradeToH5|for other 
reason|",ErrorType.DEGRAD_ERROR,ErrorGroup.NATIVE),
+
+
+  WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED_JS("-1006", "degradeToH5|createInstance 
fail|wx_create_instance_error",ErrorType.DEGRAD_ERROR,ErrorGroup.JS),
+
+
+
+  /**
+   * TEST
+   */
+
+  WX_ERR_TEST("test", "test",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE);
 
   private String errorCode;
   private String errorMsg;
   private String appendMsg="";
   private String args;
+  private ErrorType mErrorType;
+  private ErrorGroup mErrorGroup;
 
-  WXErrorCode(String errorCode, String errorMsg) {
+  WXErrorCode(String errorCode, String errorMsg,ErrorType errorType,ErrorGroup 
errorGroup) {
     this.errorCode = errorCode;
     this.errorMsg = errorMsg;
+    this.mErrorType = errorType;
+    this.mErrorGroup = errorGroup;
   }
 
   public void appendErrMsg(String err) {
@@ -229,6 +291,14 @@ public enum WXErrorCode {
     return builder.toString();
   }
 
+  public ErrorType getErrorType() {
+    return mErrorType;
+  }
+
+  public ErrorGroup getErrorGroup() {
+    return mErrorGroup;
+  }
+
   public String getArgs() {
     return args;
   }
@@ -237,4 +307,16 @@ public enum WXErrorCode {
     this.args = args;
   }
 
+  public enum ErrorType{
+    JS_ERROR,
+    NATIVE_ERROR,
+    RENDER_ERROR,
+    DEGRAD_ERROR
+  }
+
+  public enum ErrorGroup{
+    JS,
+    NATIVE,
+    NET
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/495c7aca/android/sdk/src/main/java/com/taobao/weex/common/WXJSExceptionInfo.java
----------------------------------------------------------------------
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 723394c..6fd207e 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
@@ -36,7 +36,7 @@ public class WXJSExceptionInfo {
   /**
    * error code
    */
-  private String mErrCode;
+  private WXErrorCode mErrCode;
   /**
    * The function name of the exception
    */
@@ -61,8 +61,7 @@ public class WXJSExceptionInfo {
    */
   private String mJsFrameworkVersion = WXEnvironment.JS_LIB_SDK_VERSION;
 
-
-  public WXJSExceptionInfo(String instanceId, String bundleUrl, String 
errCode, String function, String exception, Map<String,String> extParams) {
+  public WXJSExceptionInfo(String instanceId, String bundleUrl, WXErrorCode 
errCode, String function, String exception, Map<String,String> extParams) {
     this.mInstanceId = instanceId;
     this.mBundleUrl = bundleUrl;
     this.mErrCode = errCode;
@@ -87,11 +86,11 @@ public class WXJSExceptionInfo {
     mBundleUrl = bundleUrl;
   }
 
-  public String getErrCode() {
+  public WXErrorCode getErrCode() {
     return mErrCode;
   }
 
-  public void setErrCode(String errCode) {
+  public void setErrCode(WXErrorCode errCode) {
     mErrCode = errCode;
   }
 
@@ -136,7 +135,7 @@ public class WXJSExceptionInfo {
         .append(" JSFrameworkVersion:").append(mJsFrameworkVersion)
         .append(" instanceId:").append(mInstanceId)
         .append(" bundleUrl:").append(mBundleUrl)
-        .append(" errCode:").append(mErrCode)
+        .append(" errCode:").append(mErrCode.getErrorCode())
         .append(" function:").append(mFunction)
         .append(" exception:").append(mException)
         .append(" extParams:").append(mExtParams);

Reply via email to