You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by mi...@apache.org on 2017/08/15 09:51:26 UTC

[01/16] incubator-weex git commit: + [android] tracing

Repository: incubator-weex
Updated Branches:
  refs/heads/0.16-dev 57802c0ae -> 207415679


+ [android] tracing


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

Branch: refs/heads/0.16-dev
Commit: 6ae8f8d1541c706e5be5be4f08710d1225229702
Parents: d3a1e1d
Author: moxun.ljf <fu...@foxmail.com>
Authored: Wed Jun 7 11:23:08 2017 +0800
Committer: moxun.ljf <fu...@foxmail.com>
Committed: Wed Jun 7 11:23:08 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/common/WXTracing.java  | 43 ++++++++++++++++++++
 1 file changed, 43 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/6ae8f8d1/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
new file mode 100644
index 0000000..49fbe4b
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
@@ -0,0 +1,43 @@
+package com.taobao.weex.common;
+
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by moxun on 2017/6/6.
+ */
+
+public class WXTracing {
+    private static final AtomicInteger sIdGenerator = new AtomicInteger(0);
+
+    public static int nextId() {
+        return sIdGenerator.getAndIncrement();
+    }
+
+    public static void submit(TraceEvent event) {
+        WXLogUtils.d("WXTracing", event.toString());
+    }
+
+    public static class TraceEvent {
+        public String name;
+        public String phase;
+        public String threadName;
+        public long timestamp;
+        public long nanoTime;
+        public long duration;
+
+        @Override
+        public String toString() {
+            final StringBuffer sb = new StringBuffer("TraceEvent{");
+            sb.append("name='").append(name).append('\'');
+            sb.append(", threadName='").append(threadName).append('\'');
+            sb.append(", phase='").append(phase).append('\'');
+            sb.append(", timestamp=").append(timestamp);
+            sb.append(", nanoTime=").append(nanoTime);
+            sb.append(", duration=").append(duration);
+            sb.append('}');
+            return sb.toString();
+        }
+    }
+}


[09/16] incubator-weex git commit: Merge remote-tracking branch 'remotes/upstream/0.16-dev' into android-feature-tracing

Posted by mi...@apache.org.
Merge remote-tracking branch 'remotes/upstream/0.16-dev' into android-feature-tracing

# Conflicts:
#	android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
#	android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java


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

Branch: refs/heads/0.16-dev
Commit: 288d8b5b1b22539c3b72098a1096e59df948074f
Parents: 4fa0a2c 8b9845e
Author: misakuo <mi...@apache.org>
Authored: Thu Aug 10 14:50:43 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Thu Aug 10 14:50:43 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/bridge/WXBridge.java   |   8 +-
 .../com/taobao/weex/bridge/WXBridgeManager.java |  36 ++++-
 .../taobao/weex/bridge/WXValidateProcessor.java |   7 +-
 .../java/com/taobao/weex/dom/WXDomObject.java   |  16 +-
 .../dom/action/AbstractAddElementAction.java    |   2 +-
 html5/render/vue/README.md                      |  15 ++
 html5/render/vue/components/image.js            |  58 ++++++-
 html5/render/vue/config.js                      |  10 +-
 html5/render/vue/core/node.js                   |  27 ++--
 html5/render/vue/lib/gesture.js                 |   6 +
 html5/render/vue/modules/modal/toast.js         |  23 +--
 html5/test/render/vue/core/node.js              |   2 +
 ios/.gitignore                                  |   1 +
 .../WeexDemo.xcodeproj/project.pbxproj          |  24 ++-
 ios/playground/WeexDemo/AppDelegate.m           |   8 +-
 ios/playground/WeexDemo/WXDemoViewController.m  |   2 -
 ios/playground/WeexDemo/WXExtModule.h           |  26 +++
 ios/playground/WeexDemo/WXExtModule.m           |  43 +++++
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |   8 +
 .../Sources/Component/WXImageComponent.m        | 150 +++++++++--------
 ios/sdk/WeexSDK/Sources/WeexSDK.h               |   1 +
 package.json                                    |   9 +-
 packages/weex-vue-render/README.md              |  15 ++
 packages/weex-vue-render/package.json           |   2 +-
 test/pages/components/iconfont.vue              |  71 ++++++++
 test/pages/components/input-event.vue           |  65 ++++++++
 test/pages/components/refresh-loading.vue       | 115 +++++++++++++
 test/pages/components/switch-event.vue          |  60 +++++++
 test/pages/components/web-event.vue             |  56 +++++++
 test/pages/include/button.vue                   | 162 +++++++++++++++++++
 test/pages/include/h1.vue                       |  13 ++
 test/pages/include/h2.vue                       |  13 ++
 test/pages/include/h3.vue                       |  13 ++
 test/pages/include/hn.vue                       |  47 ++++++
 test/pages/include/panel.vue                    | 141 ++++++++++++++++
 test/pages/include/wxc-desc.vue                 |  66 ++++++++
 test/pages/modules/animation-translate.vue      | 129 +++++++++++++++
 test/pages/modules/clipboard-event.vue          |  57 +++++++
 test/pages/modules/cover-generate.vue           |  53 ++++++
 test/pages/modules/downgrade-event.vue          |  74 +++++++++
 test/pages/modules/gesture-longpress.vue        |  75 +++++++++
 test/pages/modules/modal-event.vue              |  61 +++++++
 test/pages/modules/picker-event.vue             |  63 ++++++++
 test/pages/modules/storage-event.vue            |  59 +++++++
 test/pages/modules/stream-result.vue            |  85 ++++++++++
 test/run.sh                                     |  30 +++-
 test/screenshot/border-android.png              | Bin 156247 -> 158634 bytes
 test/scripts/components/iconfont.test.js        |  34 ++++
 test/scripts/components/input-event.test.js     |  36 +++++
 test/scripts/components/refresh-loading.test.js |  38 +++++
 test/scripts/components/switch-event.test.js    |  38 +++++
 test/scripts/components/web-event.test.js       |  30 ++++
 .../scripts/modules/animation-translate.test.js |  40 +++++
 test/scripts/modules/clipboard-event.test.js    |  35 ++++
 test/scripts/modules/downgrade-event.test.js    |  30 ++++
 test/scripts/modules/gesture-longpress.test.js  |  37 +++++
 test/scripts/modules/modal-event.test.js        |  35 ++++
 test/scripts/modules/picker-event.test.js       |  41 +++++
 test/scripts/modules/storage-event.test.js      |  36 +++++
 test/scripts/modules/stream-result.test.js      |  34 ++++
 test/scripts/util.js                            |  41 +++++
 test/scripts/zcover-generate.js                 |  32 ++++
 test/serve.sh                                   |   2 +-
 63 files changed, 2405 insertions(+), 141 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/288d8b5b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
diff --cc android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index 8a2882c,5475e0d..0b3f8e4
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@@ -417,10 -442,11 +448,11 @@@ public class WXBridgeManager implement
              if(target != null){
                if(WXDomModule.WXDOM.equals(target)){
                  WXDomModule dom = getDomModule(instanceId);
 -                dom.callDomMethod(task);
 +                dom.callDomMethod(task,parseNanos);
                }else {
+                 JSONObject optionObj = task.getJSONObject(OPTIONS);
                  callModuleMethod(instanceId, (String) target,
-                     (String) task.get(METHOD), (JSONArray) task.get(ARGS));
+                         (String) task.get(METHOD), (JSONArray) task.get(ARGS), optionObj);
                }
              }else if(task.get(COMPONENT) != null){
                //call component

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/288d8b5b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
----------------------------------------------------------------------
diff --cc android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
index 258df2b,9643abd..77969ee
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
@@@ -632,9 -627,11 +632,14 @@@ public class WXDomObject extends CSSNod
     * @param json the original JSONObject
     * @return Dom Object corresponding to the JSONObject.
     */
+   public static  @Nullable WXDomObject parse(JSONObject json, WXSDKInstance wxsdkInstance) {
+       return parse(json, wxsdkInstance, null);
+   }
+ 
+   public static  @Nullable WXDomObject parse(JSONObject json, WXSDKInstance wxsdkInstance, WXDomObject parentDomObject){
 +  public static  @Nullable WXDomObject parse(JSONObject json, WXSDKInstance wxsdkInstance){
 +      long startNanos = System.nanoTime();
 +      long timestamp = System.currentTimeMillis();
        if (json == null || json.size() <= 0) {
          return null;
        }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/288d8b5b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
----------------------------------------------------------------------
diff --cc android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
index 3b2d964,eafa552..3d026ee
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
@@@ -87,9 -80,7 +87,9 @@@ public abstract class AbstractAddElemen
      }
  
      //only non-root has parent.
 +    Stopwatch.tick();
-     WXDomObject domObject = WXDomObject.parse(dom, instance);
+     WXDomObject domObject = WXDomObject.parse(dom, instance, null);
 +    Stopwatch.split("parseDomObject");
  
      if (domObject == null || context.getDomByRef(domObject.getRef()) != null) {
        if (WXEnvironment.isApkDebugable()) {


[02/16] incubator-weex git commit: + [android] tracing

Posted by mi...@apache.org.
+ [android] tracing


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

Branch: refs/heads/0.16-dev
Commit: 38bffdf3654859ab5687e5db866d5962be1c5929
Parents: 6ae8f8d
Author: moxun.ljf <fu...@foxmail.com>
Authored: Mon Jun 12 15:35:50 2017 +0800
Committer: moxun.ljf <fu...@foxmail.com>
Committed: Mon Jun 12 15:35:50 2017 +0800

----------------------------------------------------------------------
 .../java/com/taobao/weex/common/WXTracing.java  | 33 ++++++++++++++++++++
 .../taobao/weex/dom/DOMActionContextImpl.java   | 10 +++++-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |  9 ++++++
 .../java/com/taobao/weex/dom/WXDomModule.java   |  2 --
 .../java/com/taobao/weex/dom/WXDomTask.java     |  1 +
 .../dom/action/AbstractAddElementAction.java    |  8 +++++
 .../weex/dom/action/AddElementAction.java       |  6 +++-
 .../taobao/weex/dom/action/AddEventAction.java  |  5 +++
 .../com/taobao/weex/ui/WXRenderManager.java     |  8 ++++-
 9 files changed, 77 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
index 49fbe4b..bc37386 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
@@ -1,5 +1,10 @@
 package com.taobao.weex.common;
 
+import android.os.Message;
+
+import com.taobao.weex.dom.WXDomHandler;
+import com.taobao.weex.dom.WXDomTask;
+import com.taobao.weex.dom.action.Action;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.util.concurrent.atomic.AtomicInteger;
@@ -40,4 +45,32 @@ public class WXTracing {
             return sb.toString();
         }
     }
+
+    public static String getFunctionName(Message msg) {
+        Object obj = msg.obj;
+        if (obj != null && obj instanceof WXDomTask) {
+            Object action = ((WXDomTask) obj).args.get(0);
+            if (action instanceof Action) {
+                return getFunctionName(action.getClass());
+            }
+        }
+
+        String actionName = "unknown";
+        int what = msg.what;
+        if (what == WXDomHandler.MsgType.WX_DOM_BATCH) {
+            actionName = "domBatch";
+        } else if (what == WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE) {
+            actionName = "updateStyle";
+        } else if (what == WXDomHandler.MsgType.WX_CONSUME_RENDER_TASKS) {
+            actionName = "consumeRenderTasks";
+        }
+        return actionName;
+    }
+
+    public static String getFunctionName(Class clazz) {
+        String simpleName = clazz.getSimpleName();
+        char[] chars = simpleName.replace("Action", "").toCharArray();
+        chars[0] = Character.toLowerCase(chars[0]);
+        return new String(chars);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
index c30ba13..6e1e385 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
@@ -31,6 +31,7 @@ import com.taobao.weex.ui.WXRenderManager;
 import com.taobao.weex.ui.animation.WXAnimationBean;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.utils.Stopwatch;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.util.ArrayList;
@@ -181,8 +182,9 @@ class DOMActionContextImpl implements DOMActionContext {
       return;
     }
     long start0 = System.currentTimeMillis();
-
+    Stopwatch.tick();
     rebuildingFixedDomTree(rootDom);
+    WXLogUtils.e("Tracing", "rebuildingFixedDomTree " + Stopwatch.tackAndTick() + " ms");
 
     rootDom.traverseTree( new WXDomObject.Consumer() {
       @Override
@@ -193,10 +195,13 @@ class DOMActionContextImpl implements DOMActionContext {
         dom.layoutBefore();
       }
     });
+    WXLogUtils.e("Tracing", "layoutBefore " + Stopwatch.tackAndTick() + " ms");
     long start = System.currentTimeMillis();
 
 
+    long s = System.nanoTime();
     rootDom.calculateLayout(mLayoutContext);
+    WXLogUtils.e("Tracing", "layout " + Stopwatch.tackAndTick() + " ms");
 
     WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId);
     if (instance != null) {
@@ -212,9 +217,11 @@ class DOMActionContextImpl implements DOMActionContext {
         dom.layoutAfter();
       }
     });
+    WXLogUtils.e("Tracing", "layoutAfter " + Stopwatch.tackAndTick() + " ms");
 
     start = System.currentTimeMillis();
     rootDom.traverseTree(new ApplyUpdateConsumer());
+    WXLogUtils.e("Tracing", "applyUpdateConsumer " + Stopwatch.tackAndTick() + " ms");
 
     if (instance != null) {
       instance.applyUpdateTime(System.currentTimeMillis() - start);
@@ -225,6 +232,7 @@ class DOMActionContextImpl implements DOMActionContext {
     if (instance != null) {
       instance.updateDomObjTime(System.currentTimeMillis() - start);
     }
+    WXLogUtils.e("Tracing", "updateDomObj " + Stopwatch.tack() + " ms");
     parseAnimation();
 
     boolean isPreRenderMode = instance != null && instance.isPreRenderMode();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
index eec3d0b..03f6940 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
@@ -20,9 +20,12 @@ package com.taobao.weex.dom;
 
 import android.os.Handler;
 import android.os.Message;
+import android.os.SystemClock;
 
 import com.alibaba.fastjson.JSONObject;
+import com.taobao.weex.common.WXTracing;
 import com.taobao.weex.dom.action.Actions;
+import com.taobao.weex.utils.WXLogUtils;
 
 /**
  * Handler for dom operations.
@@ -42,6 +45,8 @@ public class WXDomHandler implements Handler.Callback {
 
   @Override
   public boolean handleMessage(Message msg) {
+    long s = System.nanoTime();
+    String actionName = WXTracing.getFunctionName(msg);
     if (msg == null) {
       return false;
     }
@@ -51,6 +56,9 @@ public class WXDomHandler implements Handler.Callback {
 
     if (obj instanceof WXDomTask) {
       task = (WXDomTask) obj;
+      WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + ((s - task.startTime) / 1000000.0) + " ms");
+    } else {
+      WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + (SystemClock.uptimeMillis() - msg.getWhen()) + " ms");
     }
 
     if (!mHasBatch) {
@@ -78,6 +86,7 @@ public class WXDomHandler implements Handler.Callback {
       default:
         break;
     }
+    WXLogUtils.e("Tracing", "Method " + actionName + ", Dom execute time " + ((System.nanoTime() - s) / 1000000.0) + " ms");
     return true;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
index 192481f..7d63c39 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
@@ -18,8 +18,6 @@
  */
 package com.taobao.weex.dom;
 
-import android.os.Message;
-
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXSDKInstance;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java
index df5943b..140b668 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomTask.java
@@ -30,4 +30,5 @@ public class WXDomTask implements IWXTask {
 
   public String instanceId;
   public List<Object> args;
+  public long startTime = System.nanoTime();
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
index fa017cb..b3b27a6 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
@@ -31,6 +31,7 @@ import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXComponentFactory;
 import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.utils.Stopwatch;
 import com.taobao.weex.utils.WXLogUtils;
 
 /**
@@ -80,7 +81,9 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
     }
 
     //only non-root has parent.
+    Stopwatch.tick();
     WXDomObject domObject = WXDomObject.parse(dom, instance);
+    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " parseDomObject " + Stopwatch.tackAndTick() + " ms");
 
     if (domObject == null || context.getDomByRef(domObject.getRef()) != null) {
       if (WXEnvironment.isApkDebugable()) {
@@ -90,11 +93,14 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
       return;
     }
     appendDomToTree(context, domObject);
+    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " appendDomToTree " + Stopwatch.tackAndTick() + " ms");
 
     domObject.traverseTree(
         context.getAddDOMConsumer(),
         context.getApplyStyleConsumer()
     );
+    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " traverseTree " + Stopwatch.tackAndTick() + " ms");
+
 
     //Create component in dom thread
     WXComponent component = createComponent(context, domObject);
@@ -103,6 +109,8 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
       //stop redner, some fatal happened.
       return;
     }
+    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " createComponent " + Stopwatch.tackAndTick() + " ms");
+
     context.addDomInfo(domObject.getRef(), component);
     context.postRenderTask(this);
     addAnimationForDomTree(context, domObject);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
index a5e1254..a4b3adf 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
@@ -27,6 +27,7 @@ import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.utils.Stopwatch;
 import com.taobao.weex.utils.WXLogUtils;
 
 /**
@@ -97,11 +98,14 @@ final class AddElementAction extends AbstractAddElementAction {
       if (parent == null || component == null) {
         return;
       }
-
+      Stopwatch.tick();
       parent.addChild(component, mAddIndex);
       parent.createChildViewAt(mAddIndex);
+      WXLogUtils.e("Tracing", "Component " + mRef + " createViewTree " + Stopwatch.tackAndTick() + " ms");
       component.applyLayoutAndEvent(component);
+      WXLogUtils.e("Tracing", "Component " + mRef + " applyLayoutAndEvent " + Stopwatch.tackAndTick() + " ms");
       component.bindData(component);
+      WXLogUtils.e("Tracing", "Component " + mRef + " bindData " + Stopwatch.tackAndTick() + " ms");
     } catch (Exception e) {
       WXLogUtils.e("add component failed.", e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
index 13dac2f..e051917 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
@@ -27,6 +27,8 @@ import com.taobao.weex.dom.RenderAction;
 import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.utils.Stopwatch;
+import com.taobao.weex.utils.WXLogUtils;
 
 /**
  * Created by sospartan on 01/03/2017.
@@ -69,8 +71,11 @@ class AddEventAction implements DOMAction, RenderAction {
     WXComponent comp = context.getComponent(mRef);
     if(comp != null){
       //sync dom change to component
+      Stopwatch.tick();
       comp.updateDom(mUpdatedDom);
+      WXLogUtils.e("Tracing", "updateDom " + Stopwatch.tackAndTick() + " ms");
       comp.addEvent(mEvent);
+      WXLogUtils.e("Tracing", "addEvent " + Stopwatch.tackAndTick() + " ms");
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/38bffdf3/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
index 9c74b36..77e1b1b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
@@ -24,10 +24,12 @@ import android.text.TextUtils;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
+import com.taobao.weex.common.WXTracing;
 import com.taobao.weex.dom.RenderAction;
 import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
 import com.taobao.weex.ui.component.WXComponent;
+import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 
 import java.util.ArrayList;
@@ -102,14 +104,18 @@ public class WXRenderManager {
   }
 
   public void runOnThread(final String instanceId, final RenderAction action) {
+    final long start = System.nanoTime();
+    final String actionName = WXTracing.getFunctionName(action.getClass());
     mWXRenderHandler.post(WXThread.secure(new Runnable() {
-
       @Override
       public void run() {
+        long s = System.nanoTime();
+        WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + (s - start) + " ns");
         if (mRegistries.get(instanceId) == null) {
           return;
         }
         action.executeRender(getRenderContext(instanceId));
+        WXLogUtils.e("Tracing", "Method " + actionName + ", Render time " + (System.nanoTime() - s) + " ns");
       }
     }));
   }


[07/16] incubator-weex git commit: Merge remote-tracking branch 'remotes/upstream/0.15-dev' into android-feature-tracing

Posted by mi...@apache.org.
Merge remote-tracking branch 'remotes/upstream/0.15-dev' into android-feature-tracing


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

Branch: refs/heads/0.16-dev
Commit: 2e44c5f5f68ea7825cc5f6a3ca23485c1e4bfb5e
Parents: 102f2ed 43c5fdf
Author: misakuo <mi...@apache.org>
Authored: Thu Aug 10 14:36:58 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Thu Aug 10 14:36:58 2017 +0800

----------------------------------------------------------------------
 README.md                                       |  51 +-
 .../weex/extend/component/WXParallax.java       |   4 +-
 android/sdk/libs/armeabi/libweexjsc.so          | Bin 7570504 -> 7570392 bytes
 android/sdk/libs/x86/libweexjsc.so              | Bin 12121924 -> 7570392 bytes
 .../java/com/taobao/weex/WXEnvironment.java     |   4 +
 .../java/com/taobao/weex/WXSDKInstance.java     |  11 +-
 .../com/taobao/weex/bridge/WXBridgeManager.java |  12 +-
 .../java/com/taobao/weex/common/WXConfig.java   |   1 +
 .../java/com/taobao/weex/dom/WXDomModule.java   |   1 -
 .../taobao/weex/dom/WXRecyclerDomObject.java    |   4 +
 .../com/taobao/weex/dom/WXTextDomObject.java    |   4 +-
 .../com/taobao/weex/dom/action/Actions.java     |   4 +-
 .../taobao/weex/ui/component/WXComponent.java   |  12 +-
 .../taobao/weex/ui/component/WXScroller.java    |  79 ++-
 .../com/taobao/weex/ui/component/WXSlider.java  |  12 +-
 .../ui/component/list/BasicListComponent.java   | 114 ++--
 .../taobao/weex/ui/component/list/WXCell.java   |   1 -
 .../weex/ui/component/list/WXListComponent.java |   9 +-
 .../weex/ui/view/WXHorizontalScrollView.java    |  27 +
 .../com/taobao/weex/ui/view/WXScrollView.java   |   1 -
 build/config.js                                 |   1 +
 build/karma.vue.conf.js                         |  16 +-
 build/webpack.examples.web.config.js            |   1 +
 build/webpack.test.web.config.js                |   1 +
 doc/source/cn/references/modules/meta.md        |  96 +++
 doc/source/cn/references/modules/timer.md       |  47 ++
 doc/source/cn/references/weex-variable.md       |   1 +
 doc/source/references/modules/meta.md           |  97 +++
 doc/source/references/modules/timer.md          |  58 ++
 doc/source/references/weex-variable.md          |   1 +
 examples/vue/components/input.vue               |  17 +
 examples/vue/hello.vue                          |   2 +-
 examples/vue/market/gcanvas.vue                 |  36 +-
 .../vue/components/scrollable/list/index.js     |   3 +-
 .../vue/components/scrollable/scroller.js       |   3 +-
 .../vue/components/scrollable/waterfall.js      |   3 +-
 .../render/vue/components/slider/slideMixin.js  |  17 +-
 html5/render/vue/core/node.js                   | 172 +++--
 html5/render/vue/core/style.js                  |  26 +-
 html5/render/vue/env/global.js                  |   2 +
 html5/render/vue/env/weex.js                    |   3 +
 html5/render/vue/env/wx-env.js                  |   2 +-
 html5/render/vue/mixins/base.js                 |  16 +-
 html5/render/vue/mixins/scrollable.js           |  18 +-
 html5/render/vue/mixins/style.js                |  58 +-
 html5/render/vue/modules/websocket/websocket.js |   2 +
 html5/render/vue/utils/event.js                 |   6 +-
 html5/render/vue/utils/func.js                  | 136 +++-
 html5/render/vue/utils/index.js                 | 104 ---
 html5/render/vue/utils/perf.js                  |   3 +-
 html5/render/vue/utils/style.js                 |  30 +-
 html5/test/render/vue/core/node.js              |  32 +-
 html5/test/render/vue/core/scope-style-map.js   |   4 +
 .../render/vue/data/dotvue/event-bubble-bar.vue |  11 -
 .../render/vue/data/dotvue/event-bubble.vue     |  11 -
 html5/test/render/vue/helper/utils.js           |  10 +-
 html5/test/render/vue/modules/modal.js          | 225 +++++++
 html5/test/render/vue/modules/websocket.js      |  83 ++-
 html5/test/render/vue/utils/component.js        |  50 +-
 html5/test/render/vue/utils/event.js            |  78 +++
 html5/test/render/vue/utils/func.js             | 278 +++++++-
 html5/test/render/vue/utils/lazyload.js         | 106 +++
 html5/test/render/vue/utils/perf.js             | 132 ++++
 html5/test/render/vue/utils/style.js            | 157 ++++-
 html5/test/render/vue/utils/type.js             |  49 ++
 html5/test/render/vue/validator/index.js        |  31 +-
 ios/playground/Podfile                          |   2 +-
 .../WeexDemo.xcodeproj/project.pbxproj          |   4 +
 ios/playground/WeexDemo/WXDemoViewController.m  |   2 +-
 ios/sdk/WeexSDK-Dynamic/Info.plist              |  24 +
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       | 642 ++++++++++++++++++-
 .../xcschemes/WeexSDK-Dynamic.xcscheme          |  80 +++
 .../WeexSDK/Sources/Bridge/WXBridgeContext.h    |   2 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |  74 ++-
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.m |  16 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m |  35 +-
 .../Component/Recycler/WXRecyclerComponent.h    |   3 +-
 .../Component/Recycler/WXRecyclerComponent.m    |   5 +-
 .../Recycler/WXSectionDataController.h          |   2 +
 .../WeexSDK/Sources/Component/WXAComponent.m    |   2 +-
 .../Sources/Component/WXCanvasComponent.h       |   2 +-
 .../Sources/Component/WXCycleSliderComponent.m  |   6 +
 .../WeexSDK/Sources/Component/WXEditComponent.m |   4 +-
 .../Sources/Component/WXFooterComponent.h       |   2 +-
 .../Sources/Component/WXHeaderComponent.h       |   3 +-
 .../Sources/Component/WXImageComponent.m        |   5 +-
 .../WeexSDK/Sources/Component/WXListComponent.m |  57 +-
 .../Sources/Component/WXScrollerComponent.m     |   1 +
 .../WeexSDK/Sources/Component/WXTextComponent.m |  61 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |  24 +-
 .../Sources/Component/WXVideoComponent.m        |   2 +-
 .../WeexSDK/Sources/Component/WXWebComponent.m  |   2 +-
 .../Sources/Controller/WXRootViewController.m   |   1 +
 .../Sources/Display/WXComponent+BoxShadow.h     |   4 -
 ios/sdk/WeexSDK/Sources/Display/WXInnerLayer.h  |   1 +
 ios/sdk/WeexSDK/Sources/Display/WXRoundedRect.h |   2 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |  10 +-
 .../Sources/Handler/WXURLRewriteDefaultImpl.m   |   2 +-
 .../WeexSDK/Sources/Layout/WXComponent+Layout.m |   3 +-
 .../Sources/Manager/WXComponentManager.h        |   3 +
 .../Sources/Manager/WXComponentManager.m        |   6 +-
 ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m |   2 +-
 .../WeexSDK/Sources/Manager/WXServiceFactory.h  |   2 +-
 .../WeexSDK/Sources/Manager/WXTracingManager.h  | 126 ++++
 .../WeexSDK/Sources/Manager/WXTracingManager.m  | 384 +++++++++++
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |   5 +-
 .../WeexSDK/Sources/Model/WXJSExceptionInfo.h   |   1 +
 .../WeexSDK/Sources/Model/WXJSExceptionInfo.m   |   1 +
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |  13 +-
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |  15 +-
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |  12 +-
 ios/sdk/WeexSDK/Sources/Module/WXPickerModule.m |  11 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m |   2 +-
 .../WeexSDK/Sources/Module/WXWebSocketModule.h  |   1 -
 .../WeexSDK/Sources/Module/WXWebSocketModule.m  |   1 +
 .../WeexSDK/Sources/Protocol/WXBridgeProtocol.h |   5 +
 .../Sources/Protocol/WXURLRewriteProtocol.h     |   2 +-
 ios/sdk/WeexSDK/Sources/Utility/WXLog.m         |   8 +
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     |   1 +
 .../View/WXComponent+PseudoClassManagement.h    |   4 +-
 .../Sources/View/WXComponent+ViewManagement.m   |   7 +-
 ios/sdk/WeexSDK/Sources/WeexSDK.h               |   1 +
 ios/sdk/WeexSDKTests/WXAnimationModuleTests.m   |  29 +
 ios/sdk/buildScripts.sh                         |   2 +
 package.json                                    |   8 +-
 packages/weex-vue-render/package.json           |   8 +-
 pre-build/native-bundle-main.js                 |  16 +-
 127 files changed, 3738 insertions(+), 609 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2e44c5f5/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2e44c5f5/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2e44c5f5/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2e44c5f5/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2e44c5f5/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------


[10/16] incubator-weex git commit: Merge remote-tracking branch 'remotes/upstream/0.16-dev' into android-feature-tracing

Posted by mi...@apache.org.
Merge remote-tracking branch 'remotes/upstream/0.16-dev' into android-feature-tracing

# Conflicts:
#	android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
#	android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java


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

Branch: refs/heads/0.16-dev
Commit: d2587364e2fa97023891aa4042608828d00ce90f
Parents: 288d8b5
Author: misakuo <mi...@apache.org>
Authored: Thu Aug 10 14:53:07 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Thu Aug 10 14:53:07 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/d2587364/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
index 77969ee..98ad680 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
@@ -637,7 +637,6 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
   }
 
   public static  @Nullable WXDomObject parse(JSONObject json, WXSDKInstance wxsdkInstance, WXDomObject parentDomObject){
-  public static  @Nullable WXDomObject parse(JSONObject json, WXSDKInstance wxsdkInstance){
       long startNanos = System.nanoTime();
       long timestamp = System.currentTimeMillis();
       if (json == null || json.size() <= 0) {


[14/16] incubator-weex git commit: * [android] disable debug server connect by default

Posted by mi...@apache.org.
* [android] disable debug server connect by default


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

Branch: refs/heads/0.16-dev
Commit: 6743256804249ef8fdb730c2f01c398790dc419c
Parents: 1f028a6
Author: misakuo <mi...@apache.org>
Authored: Mon Aug 14 16:37:46 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Mon Aug 14 16:37:46 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/67432568/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
index 2923dd8..bb19b66 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -65,7 +65,7 @@ public class WXEnvironment {
    */
   public static boolean sDebugMode = false;
   public static String sDebugWsUrl = "";
-  public static boolean sDebugServerConnectable = true;
+  public static boolean sDebugServerConnectable = false;
   public static boolean sRemoteDebugMode = false;
   public static String sRemoteDebugProxyUrl = "";
   public static long sJSLibInitTime = 0;


[03/16] incubator-weex git commit: Merge remote-tracking branch 'remotes/upstream/0.15-dev' into android-feature-tracing

Posted by mi...@apache.org.
Merge remote-tracking branch 'remotes/upstream/0.15-dev' into android-feature-tracing


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

Branch: refs/heads/0.16-dev
Commit: 4bb0f14144f849f5cdb994a5c8db4866d47415d6
Parents: 38bffdf db64076
Author: moxun.ljf <fu...@foxmail.com>
Authored: Fri Jun 30 11:28:11 2017 +0800
Committer: moxun.ljf <fu...@foxmail.com>
Committed: Fri Jun 30 11:28:11 2017 +0800

----------------------------------------------------------------------
 .travis.yml                                     |  91 ++-
 HOW-TO-BUILD.md                                 |  80 +++
 LICENSE                                         |  22 +-
 POSSIBLE-NOTICES-FOR-BIN-DIST                   |   3 +
 README.md                                       |   2 +-
 README_RELEASE.md                               |  74 ---
 RUN-RAT.md                                      |  12 +
 WeexSDK.podspec                                 |   4 +-
 .../java/com/alibaba/weex/WXApplication.java    |   2 +
 .../weex/extend/component/WXParallax.java       | 345 ++++++++++
 android/run-ci.sh                               |   7 -
 android/sdk/build.gradle                        |  21 +-
 android/sdk/libs/armeabi/libweexjsc.so          | Bin 7566292 -> 7570504 bytes
 android/sdk/libs/x86/libweexjsc.so              | Bin 4545544 -> 12121924 bytes
 .../java/com/taobao/weex/ComponentObserver.java |  50 ++
 .../com/taobao/weex/LayoutFinishListener.java   |  18 +
 .../java/com/taobao/weex/WXSDKInstance.java     |  43 +-
 .../taobao/weex/adapter/ICrashInfoReporter.java |  18 +
 .../java/com/taobao/weex/bridge/WXBridge.java   | 299 ++++++++-
 .../com/taobao/weex/bridge/WXBridgeManager.java | 364 +++++++++-
 .../java/com/taobao/weex/common/Constants.java  |   2 +
 .../weex/common/ICheckBindingScroller.java      |  27 +
 .../java/com/taobao/weex/common/IWXBridge.java  |  21 +
 .../com/taobao/weex/common/WXImageStrategy.java |   9 +-
 .../main/java/com/taobao/weex/dom/WXAttr.java   |  38 +-
 .../java/com/taobao/weex/dom/WXDomModule.java   |   3 +-
 .../com/taobao/weex/dom/WXImageQuality.java     |   4 +-
 .../com/taobao/weex/dom/action/Actions.java     |  58 +-
 .../taobao/weex/dom/action/AnimationAction.java |  37 +-
 .../weex/dom/action/ExecutableRenderAction.java |  18 +
 .../weex/dom/action/ModuleInvocationAction.java |  18 +
 .../weex/dom/action/UpdateStyleAction.java      |   4 +-
 .../ui/animation/DimensionUpdateListener.java   |  88 ---
 .../weex/ui/animation/HeightProperty.java       |  35 +
 .../weex/ui/animation/LayoutParamsProperty.java |  64 ++
 .../weex/ui/animation/WXAnimationBean.java      |  72 +-
 .../taobao/weex/ui/animation/WidthProperty.java |  35 +
 .../ui/component/AbstractEditComponent.java     |  45 +-
 .../com/taobao/weex/ui/component/Textarea.java  |   6 +
 .../taobao/weex/ui/component/WXComponent.java   |  43 +-
 .../taobao/weex/ui/component/WXScroller.java    |   9 +-
 .../com/taobao/weex/ui/component/WXSlider.java  |   4 +-
 .../taobao/weex/ui/component/WXVContainer.java  |  13 +
 .../ui/component/list/BasicListComponent.java   | 208 +++++-
 .../ui/component/list/DefaultDragHelper.java    | 173 +++++
 .../weex/ui/component/list/DragHelper.java      |  57 ++
 .../ui/component/list/DragSupportCallback.java  | 146 ++++
 .../weex/ui/component/list/EventTrigger.java    |  25 +
 .../taobao/weex/ui/module/WXTimerModule.java    |  87 +--
 .../com/taobao/weex/ui/view/WXEditText.java     |   9 +-
 .../ExtendedStaggeredGridLayoutManager.java     |  18 +
 .../taobao/weex/utils/WXDataStructureUtil.java  |  21 +-
 .../com/taobao/weex/utils/WXResourceUtils.java  |   2 +-
 .../java/com/taobao/weex/WXSDKInstanceTest.java |  26 +-
 .../weex/adapter/DefaultUriAdapterTest.java     |   4 +-
 .../clipboard/WXClipboardModuleTest.java        |   4 +-
 .../navigator/WXNavigatorModuleTest.java        |   4 +-
 .../appfram/storage/DefaultWXStorageTest.java   |  32 +-
 .../appfram/storage/WXStorageModuleTest.java    |  16 +-
 .../taobao/weex/bridge/WXBridgeManagerTest.java |  14 +-
 .../com/taobao/weex/bridge/WXBridgeTest.java    |   4 +-
 .../com/taobao/weex/bridge/WXHashMapTest.java   |   4 +-
 .../taobao/weex/bridge/WXModuleManagerTest.java |   4 +-
 .../java/com/taobao/weex/dom/WXAttrTest.java    |  23 +-
 .../com/taobao/weex/dom/WXDomModuleTest.java    |   4 +-
 .../com/taobao/weex/dom/WXDomObjectTest.java    |   4 +-
 .../com/taobao/weex/dom/WXDomStatementTest.java |   4 +-
 .../taobao/weex/dom/WXTextDomObjectTest.java    |   4 +-
 .../ui/animation/WXAnimationModuleTest.java     |   4 +-
 .../weex/ui/component/EditComponentTest.java    |   4 +-
 .../taobao/weex/ui/component/TextareaTest.java  |   4 +-
 .../weex/ui/component/WXComponentTest.java      |   4 +-
 .../com/taobao/weex/ui/component/WXDivTest.java |   4 +-
 .../taobao/weex/ui/component/WXEmbedTest.java   |   4 +-
 .../taobao/weex/ui/component/WXImageTest.java   |  14 +-
 .../taobao/weex/ui/component/WXLoadingTest.java |   4 +-
 .../taobao/weex/ui/component/WXRefreshTest.java |   4 +-
 .../weex/ui/component/WXScrollerTest.java       |   4 +-
 .../weex/ui/component/WXSliderNeighborTest.java |   4 +-
 .../taobao/weex/ui/component/WXSliderTest.java  |   4 +-
 .../taobao/weex/ui/component/WXSwitchTest.java  |   4 +-
 .../taobao/weex/ui/component/WXVideoTest.java   |   4 +-
 .../com/taobao/weex/ui/component/WXWebTest.java |   4 +-
 .../component/helper/WXTimeInputHelperTest.java |   4 +-
 .../component/list/DefaultDragHelperTest.java   | 132 ++++
 .../ui/component/list/WXListComponentTest.java  |   4 +-
 .../taobao/weex/ui/module/WXMetaModuleTest.java |   4 +-
 .../weex/ui/module/WXModalUIModuleTest.java     |   4 +-
 .../weex/ui/module/WXTimerModuleTest.java       |  48 +-
 .../weex/ui/module/WXWebViewModuleTest.java     |   4 +-
 .../weex/ui/view/WXCirclePageAdapterTest.java   |   4 +-
 .../taobao/weex/ui/view/WXScrollViewTest.java   |   4 +-
 .../com/taobao/weex/ui/view/WXWebViewTest.java  |   9 +-
 .../weex/ui/view/gesture/WXGestureTest.java     |   4 +-
 .../com/taobao/weex/utils/TypefaceUtilTest.java |   4 +-
 .../com/taobao/weex/utils/WXFileUtilsTest.java  |  17 +-
 .../com/taobao/weex/utils/WXLogUtilsTest.java   |   7 +-
 .../weex/utils/WXReflectionUtilsTest.java       |   4 +-
 .../taobao/weex/bridge/WXWebsocketBridge.java   |  88 +++
 dangerfile.js                                   | 164 +++--
 doc/_config.yml                                 |   7 +
 doc/_config_cn.yml                              | 333 ++++++++++
 doc/source/cn/references/components/input.md    | 241 +++++--
 doc/source/cn/references/components/list.md     |   2 +-
 doc/source/cn/references/components/text.md     |  64 +-
 doc/source/cn/references/modules/animation.md   |   4 +-
 doc/source/cn/references/modules/dom.md         |   2 +-
 doc/source/cn/references/modules/picker.md      |   2 +-
 doc/source/cn/references/modules/websocket.md   |   2 +-
 doc/source/cn/references/weex-variable.md       |   4 +-
 doc/source/cn/releasenote.md                    | 663 ++----------------
 .../cn/v-0.10/references/components/input.md    | 216 +++++-
 doc/source/faq.md                               |   6 +-
 doc/source/guide/index.md                       |  26 +-
 doc/source/guide/intro/using-vue.md             |   6 +-
 doc/source/references/components/input.md       | 233 +++++--
 doc/source/references/components/list.md        |   2 +-
 doc/source/references/components/text.md        |  69 +-
 doc/source/references/modules/animation.md      |  12 +-
 doc/source/references/modules/dom.md            |   2 +-
 doc/source/references/modules/websocket.md      |   2 +-
 doc/source/references/weex-variable.md          |   4 +-
 doc/source/releasenote.md                       | 663 ++----------------
 doc/themes/weex/languages/cn.yml                |  12 +
 doc/themes/weex/languages/en.yml                |  13 +-
 doc/themes/weex/layout/_partial/head.ejs        |   3 +
 doc/themes/weex/layout/index.ejs                |  28 +
 doc/themes/weex/layout/layout.ejs               |  15 +
 doc/themes/weex/layout/post.ejs                 |   7 -
 doc/themes/weex/source/css/common.scss          |  14 +-
 doc/themes/weex/source/css/docsearch.min.css    |   2 +
 doc/themes/weex/source/css/index.scss           |  19 +-
 doc/themes/weex/source/css/media-queries.scss   |   2 +-
 .../weex/source/css/partial/highlight.scss      |   7 +-
 .../weex/source/css/partial/search-form.scss    |  44 +-
 doc/themes/weex/source/css/variable.scss        |   4 +-
 doc/themes/weex/source/images/fliggy.png        | Bin 0 -> 19329 bytes
 doc/themes/weex/source/images/juhuasuan.png     | Bin 0 -> 46340 bytes
 doc/themes/weex/source/images/qianniu.png       | Bin 0 -> 19852 bytes
 doc/themes/weex/source/images/taopiaopiao.png   | Bin 0 -> 12460 bytes
 doc/themes/weex/source/js/docsearch.min.js      |   7 +
 examples/vue/components/waterfall.vue           | 165 +++--
 examples/vue/index.vue                          |   1 +
 examples/vue/modules/websocket.vue              | 116 ++++
 html5/render/vue/README.md                      |  42 +-
 html5/render/vue/components/index.js            |   7 +-
 html5/render/vue/components/input.js            |  52 +-
 .../render/vue/components/scrollable/header.js  |   2 +-
 .../vue/components/scrollable/list/index.js     |  10 -
 .../components/scrollable/loading-indicator.js  | 145 +++-
 .../render/vue/components/scrollable/loading.js |   4 +-
 .../render/vue/components/scrollable/refresh.js |   4 +-
 .../vue/components/scrollable/scroller.js       |  15 -
 .../vue/components/scrollable/waterfall.js      | 338 ++++++++++
 html5/render/vue/components/slider/index.js     | 137 +---
 html5/render/vue/components/slider/indicator.js |   8 +-
 .../render/vue/components/slider/slideMixin.js  | 666 ++++++++++++++-----
 .../vue/components/slider/slider-neighbor.css   |  19 -
 .../vue/components/slider/slider-neighbor.js    | 116 +---
 html5/render/vue/components/slider/slider.css   |  34 +
 html5/render/vue/config.js                      |  21 +
 html5/render/vue/core/style.js                  | 137 +++-
 html5/render/vue/env/viewport.js                |   6 +-
 html5/render/vue/env/weex.js                    |   3 +
 html5/render/vue/env/wx-env.js                  |  12 +-
 html5/render/vue/index.js                       |   9 +-
 html5/render/vue/mixins/base.js                 |  15 +-
 html5/render/vue/mixins/index.js                |   4 +-
 html5/render/vue/mixins/scrollable.js           | 108 ++-
 html5/render/vue/mixins/sticky.js               |  65 ++
 html5/render/vue/mixins/style.js                |  11 +-
 html5/render/vue/modules/dom.js                 |  34 +-
 html5/render/vue/modules/globalEvent.js         |  69 ++
 html5/render/vue/modules/index.js               |   4 +
 html5/render/vue/modules/websocket/index.js     |  26 +
 html5/render/vue/modules/websocket/websocket.js |  60 ++
 html5/render/vue/styles/base.css                |  86 +--
 html5/render/vue/styles/reset.css               |   5 +
 html5/render/vue/utils/component.js             | 187 ++++--
 html5/render/vue/utils/func.js                  |  30 +
 html5/render/vue/utils/style.js                 | 162 ++++-
 html5/shared/console.js                         |  10 +-
 html5/test/render/vue/modules/websocket.js      |  11 +
 ios/playground/WeexDemo/WXDemoViewController.m  |   6 -
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |   4 -
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    | 154 +++++
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m | 111 ++++
 .../Sources/Component/WXComponent_internal.h    |   1 +
 .../Sources/Component/WXCycleSliderComponent.m  |  23 +-
 .../WeexSDK/Sources/Component/WXEditComponent.m |   7 +-
 .../Sources/Component/WXImageComponent.m        |   7 +-
 .../WeexSDK/Sources/Component/WXListComponent.m |   3 +
 .../Sources/Component/WXLoadingComponent.m      |   7 -
 .../Sources/Component/WXScrollerComponent.m     |   5 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |  68 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.h |   5 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m | 109 ++-
 .../WeexSDK/Sources/Events/WXComponent+Events.m |  42 +-
 .../WeexSDK/Sources/Layout/WXComponent+Layout.m |   1 -
 .../Sources/Manager/WXComponentManager.m        |   5 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |  49 +-
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |  24 +
 ios/sdk/WeexSDK/Sources/Module/WXDomModule.m    |  16 +-
 .../WeexSDK/Sources/Module/WXNavigatorModule.m  |   7 -
 ios/sdk/WeexSDK/Sources/Module/WXTimerModule.m  |   4 +-
 .../WeexSDK/Sources/Protocol/WXBridgeProtocol.h |  38 ++
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h      |   2 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |   2 -
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     |  19 +-
 .../Sources/View/WXComponent+ViewManagement.m   |   1 -
 ios/sdk/WeexSDK/dependency/SRWebSocket.h        |  17 +-
 ios/sdk/WeexSDK/dependency/SRWebSocket.m        |  18 +-
 ios/sdk/WeexSDKTests/WXURLRewriteTests.m        |  21 -
 ios/sdk/WeexSDKTests/dependency/libOCMock.a     | Bin 2098920 -> 0 bytes
 package.json                                    |   4 +-
 packages/weex-vue-render/README.md              |  42 +-
 packages/weex-vue-render/package.json           |   2 +-
 scripts/release_files.rules                     |   3 +-
 test/ci-funcs.sh                                |  18 -
 test/pages/components/textarea-maxlength.vue    |  10 +-
 test/pages/css/border.vue                       |  16 +-
 test/run.sh                                     |   4 +-
 test/screenshot/border-android.png              | Bin 196752 -> 156247 bytes
 test/screenshot/border-ios.png                  | Bin 161202 -> 126185 bytes
 .../components/textarea-maxlength.test.js       |   6 +-
 test/scripts/util.js                            |   7 +-
 test/serve.sh                                   |   3 +-
 227 files changed, 7104 insertions(+), 3065 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4bb0f141/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
----------------------------------------------------------------------


[08/16] incubator-weex git commit: Merge remote-tracking branch 'remotes/upstream/0.16-dev' into android-feature-tracing

Posted by mi...@apache.org.
Merge remote-tracking branch 'remotes/upstream/0.16-dev' into android-feature-tracing


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

Branch: refs/heads/0.16-dev
Commit: 4fa0a2c62ab5f587a05f71ede5f857750819497a
Parents: 2e44c5f f82e311
Author: misakuo <mi...@apache.org>
Authored: Thu Aug 10 14:37:21 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Thu Aug 10 14:37:21 2017 +0800

----------------------------------------------------------------------
 .gitignore                                      |     5 +-
 WeexSDK.podspec                                 |     2 +-
 .../java/com/alibaba/weex/IndexActivity.java    |    14 +
 .../java/com/taobao/weex/WXSDKInstance.java     |     6 +-
 .../main/java/com/taobao/weex/WXSDKManager.java |    10 +
 .../taobao/weex/common/WXWorkThreadManager.java |    48 +
 .../com/taobao/weex/ui/component/WXImage.java   |    68 +
 .../taobao/weex/utils/WXViewToImageUtil.java    |   151 +
 build/build.js                                  |   106 +-
 build/config.js                                 |    54 +-
 build/karma.vue.conf.js                         |     2 +-
 dangerfile.js                                   |    87 +-
 doc/_config.yml                                 |     6 +-
 doc/_config_cn.yml                              |     6 +-
 doc/source/_posts/coreml.md                     |    79 +
 doc/source/_posts/hello_world.md                |     3 +-
 doc/source/_posts/test.md                       |    14 +
 .../cn/references/advanced/extend-to-android.md |    15 +-
 doc/source/cn/references/bubble.md              |     4 +-
 doc/source/cn/references/common-style.md        |     4 +-
 doc/source/cn/references/components/image.md    |     2 +-
 doc/source/cn/references/components/input.md    |    34 +-
 doc/source/cn/references/components/list.md     |     8 +-
 doc/source/cn/references/components/scroller.md |     2 +-
 doc/source/cn/references/weex-variable.md       |     2 +-
 doc/source/cn/v-0.10/references/bubble.md       |     6 +-
 doc/source/guide/intro/write-once.md            |    14 +-
 doc/source/guide/set-up-env.md                  |    22 +-
 .../references/advanced/extend-to-android.md    |    14 +
 doc/source/references/bubble.md                 |     4 +-
 doc/source/references/components/image.md       |     2 +-
 doc/source/references/components/input.md       |    34 +-
 doc/source/references/components/list.md        |     7 +-
 doc/source/references/components/scroller.md    |     4 +-
 doc/source/v-0.10/references/bubble.md          |     8 +-
 doc/themes/weex/languages/cn.yml                |     5 +-
 doc/themes/weex/languages/en.yml                |     3 +-
 doc/themes/weex/layout/_partial/footer.ejs      |     2 +-
 doc/themes/weex/layout/_partial/header.ejs      |    23 +-
 .../weex/layout/_partial/post/summary.ejs       |     6 +
 doc/themes/weex/layout/_partial/slider.ejs      |     2 +-
 doc/themes/weex/layout/layout.ejs               |     6 +-
 doc/themes/weex/source/css/index.scss           |     2 +
 doc/themes/weex/source/css/partial/footer.scss  |     5 +-
 doc/themes/weex/source/css/partial/summary.scss |     6 +
 doc/themes/weex/source/js/common.js             |    38 +
 entry.js                                        |    11 +
 examples/vue/components/scroller.vue            |     9 +-
 examples/vue/index.vue                          |     1 +
 examples/vue/modules/picker.vue                 |    64 +
 html5/frameworks/legacy/core/array.js           |     4 +
 html5/frameworks/legacy/core/object.js          |     6 +
 html5/frameworks/legacy/static/create.js        |     7 +-
 html5/frameworks/legacy/vm/directive.js         |     6 +
 html5/frameworks/vanilla/index.js               |    35 +-
 html5/render/vue/README.md                      |    77 +
 html5/render/vue/components/a.js                |    90 +-
 html5/render/vue/components/div.js              |    43 +-
 html5/render/vue/components/image.js            |    18 +-
 html5/render/vue/components/index.js            |    37 +-
 html5/render/vue/components/input.js            |   130 +-
 html5/render/vue/components/scrollable/cell.js  |    39 +
 .../render/vue/components/scrollable/header.js  |   102 +-
 html5/render/vue/components/scrollable/index.js |    48 +
 html5/render/vue/components/scrollable/list.js  |    82 +
 .../vue/components/scrollable/list/cell.js      |    36 -
 .../vue/components/scrollable/list/index.js     |    77 -
 .../vue/components/scrollable/list/listMixin.js |    47 -
 .../vue/components/scrollable/list/style.js     |    34 -
 .../components/scrollable/loading-indicator.js  |    17 +-
 .../render/vue/components/scrollable/loading.js |   141 +-
 .../vue/components/scrollable/mixins/index.js   |    26 +
 .../vue/components/scrollable/mixins/list.js    |    46 +
 .../components/scrollable/mixins/scrollable.js  |   267 +
 .../render/vue/components/scrollable/refresh.js |   157 +-
 .../vue/components/scrollable/scroller.js       |   143 +-
 .../render/vue/components/scrollable/style.css  |    90 +
 .../vue/components/scrollable/waterfall.js      |   573 +-
 html5/render/vue/components/slider/index.js     |    52 +-
 html5/render/vue/components/slider/indicator.js |    18 +-
 .../render/vue/components/slider/slideMixin.js  |    46 +-
 .../vue/components/slider/slider-neighbor.js    |    12 +-
 html5/render/vue/components/slider/slider.css   |    19 +
 html5/render/vue/components/slider/slider.js    |    75 +
 html5/render/vue/components/switch.js           |   114 +-
 html5/render/vue/components/text.js             |    52 +-
 html5/render/vue/components/textarea.js         |   104 +-
 html5/render/vue/components/video.js            |   107 +-
 html5/render/vue/components/web.js              |    98 +-
 html5/render/vue/core/style.js                  |    35 -
 html5/render/vue/env/global.js                  |     6 +
 html5/render/vue/env/index.js                   |     5 -
 html5/render/vue/index.js                       |    25 -
 html5/render/vue/mixins/base.js                 |    71 -
 html5/render/vue/mixins/index.js                |     2 -
 html5/render/vue/mixins/scrollable.js           |   233 -
 html5/render/vue/mixins/style.js                |     4 +-
 html5/render/vue/modules/animation.js           |    36 +-
 html5/render/vue/modules/dom.js                 |    96 +-
 html5/render/vue/modules/globalEvent.js         |     8 +-
 html5/render/vue/modules/index.js               |    36 +-
 html5/render/vue/modules/navigator.js           |    10 +-
 html5/render/vue/modules/webview.js             |    18 +-
 html5/render/vue/styles/base.css                |    86 +-
 html5/render/vue/styles/reset.css               |    19 +
 html5/render/vue/utils/lazyload.js              |    24 +-
 html5/render/vue/utils/perf.js                  |   283 +-
 html5/runtime/callback-manager.js               |    12 +-
 html5/runtime/config.js                         |     5 +-
 html5/runtime/normalize.js                      |   107 +
 html5/runtime/task-center.js                    |    61 +-
 html5/runtime/vdom/document.js                  |     2 +
 html5/runtime/vdom/element.js                   |    15 +-
 html5/test/render/vue/components/list.js        |     2 +-
 html5/test/render/vue/components/switch.js      |     5 +-
 html5/test/render/vue/core/node.js              |     5 +-
 .../render/vue/data/dotvue/event-bubble-bar.vue |     8 +-
 .../render/vue/data/dotvue/event-bubble.vue     |     4 +-
 html5/test/render/vue/examples/list-cell.js     |     2 +-
 html5/test/render/vue/helper/index.js           |     2 +-
 html5/test/render/vue/helper/main.js            |     3 +-
 html5/test/render/vue/helper/utils.js           |     4 +
 html5/test/render/vue/modules/animation.js      |    61 +
 html5/test/render/vue/modules/dom.js            |   126 +
 html5/test/render/vue/modules/globalEvent.js    |    47 +
 html5/test/render/vue/modules/navigator.js      |    46 +
 html5/test/render/vue/modules/webview.js        |    55 +
 html5/test/render/vue/utils/lazyload.js         |    59 +-
 html5/test/render/vue/utils/perf.js             |    94 +-
 html5/test/render/vue/utils/style.js            |    50 +-
 ios/playground/Podfile                          |     2 +-
 ios/playground/WeexDemo/Info.plist              |     4 +
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |     4 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |     5 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.h |     2 +
 ios/sdk/WeexSDK/Sources/Bridge/WXModuleMethod.m |    11 +-
 .../Component/Recycler/WXRecyclerComponent.m    |    58 +-
 .../Recycler/WXRecyclerDragController.h         |    52 +
 .../Recycler/WXRecyclerDragController.m         |   208 +
 .../WeexSDK/Sources/Component/WXAComponent.m    |     1 +
 .../WeexSDK/Sources/Component/WXEditComponent.m |    11 +-
 .../Sources/Component/WXImageComponent.m        |   119 +-
 .../WeexSDK/Sources/Component/WXListComponent.m |     2 +-
 .../Sources/Component/WXTextAreaComponent.m     |     2 +-
 ios/sdk/WeexSDK/Sources/Component/WXTransform.h |     1 +
 ios/sdk/WeexSDK/Sources/Component/WXTransform.m |    33 +-
 .../Sources/Component/WXVideoComponent.m        |     1 +
 .../WeexSDK/Sources/Component/WXWebComponent.m  |     1 +
 .../WeexSDK/Sources/Loader/WXResourceLoader.m   |     2 +-
 .../Sources/Manager/WXComponentManager.m        |    13 +-
 ios/sdk/WeexSDK/Sources/Manager/WXRuleManager.m |     1 +
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |     3 +
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |     5 +
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m |     1 +
 .../Sources/Network/WXResourceResponse.h        |     2 +-
 .../Sources/Protocol/WXURLRewriteProtocol.h     |     2 +-
 .../Sources/Protocol/WXValidateProtocol.h       |     4 +-
 ios/sdk/WeexSDK/Sources/Utility/WXDefine.h      |     4 +-
 package.json                                    |    30 +-
 packages/weex-js-framework/.npmignore           |     4 +
 packages/weex-js-framework/index.js             | 25150 +++++++++++++++++
 packages/weex-js-framework/index.min.js         |     1 +
 packages/weex-js-framework/package.json         |    22 +
 packages/weex-js-runtime/.npmignore             |     4 +
 packages/weex-js-runtime/index.js               |  3906 +++
 packages/weex-js-runtime/index.min.js           |     1 +
 packages/weex-js-runtime/index.min.js.gz        |   Bin 0 -> 12588 bytes
 packages/weex-js-runtime/package.json           |    22 +
 packages/weex-legacy-framework/.npmignore       |     4 +
 packages/weex-legacy-framework/index.js         |  5770 ++++
 packages/weex-legacy-framework/index.min.js     |     1 +
 packages/weex-legacy-framework/package.json     |    22 +
 packages/weex-vue-plugins/weex-vue-a/README.md  |     3 +
 .../weex-vue-plugins/weex-vue-a/package.json    |    26 +
 .../weex-vue-plugins/weex-vue-a/src/index.js    |     2 +
 .../weex-vue-animation/README.md                |     3 +
 .../weex-vue-animation/package.json             |    27 +
 .../weex-vue-animation/src/index.js             |     2 +
 .../weex-vue-clipboard/README.md                |     3 +
 .../weex-vue-clipboard/package.json             |    27 +
 .../weex-vue-clipboard/src/index.js             |     2 +
 .../weex-vue-plugins/weex-vue-dom/README.md     |     3 +
 .../weex-vue-plugins/weex-vue-dom/package.json  |    27 +
 .../weex-vue-plugins/weex-vue-dom/src/index.js  |     2 +
 .../weex-vue-plugins/weex-vue-event/README.md   |     3 +
 .../weex-vue-event/package.json                 |    27 +
 .../weex-vue-event/src/index.js                 |     2 +
 .../weex-vue-geolocation/README.md              |     3 +
 .../weex-vue-geolocation/package.json           |    27 +
 .../weex-vue-geolocation/src/index.js           |     2 +
 .../weex-vue-global-event/README.md             |     3 +
 .../weex-vue-global-event/package.json          |    27 +
 .../weex-vue-global-event/src/index.js          |     2 +
 .../weex-vue-plugins/weex-vue-input/README.md   |     3 +
 .../weex-vue-input/package.json                 |    26 +
 .../weex-vue-input/src/index.js                 |     2 +
 .../weex-vue-plugins/weex-vue-modal/README.md   |     3 +
 .../weex-vue-modal/package.json                 |    27 +
 .../weex-vue-modal/src/index.js                 |     2 +
 .../weex-vue-navigator/README.md                |     3 +
 .../weex-vue-navigator/package.json             |    27 +
 .../weex-vue-navigator/src/index.js             |     2 +
 .../weex-vue-plugins/weex-vue-slider/README.md  |     3 +
 .../weex-vue-slider/package.json                |    27 +
 .../weex-vue-slider/src/index.js                |     2 +
 .../weex-vue-plugins/weex-vue-storage/README.md |     3 +
 .../weex-vue-storage/package.json               |    27 +
 .../weex-vue-storage/src/index.js               |     2 +
 .../weex-vue-plugins/weex-vue-stream/README.md  |     3 +
 .../weex-vue-stream/package.json                |    27 +
 .../weex-vue-stream/src/index.js                |     2 +
 .../weex-vue-plugins/weex-vue-switch/README.md  |     3 +
 .../weex-vue-switch/package.json                |    26 +
 .../weex-vue-switch/src/index.js                |     2 +
 .../weex-vue-textarea/.DS_Store                 |   Bin 0 -> 6148 bytes
 .../weex-vue-textarea/README.md                 |     3 +
 .../weex-vue-textarea/package.json              |    26 +
 .../weex-vue-textarea/src/index.js              |     2 +
 .../weex-vue-plugins/weex-vue-video/README.md   |     3 +
 .../weex-vue-video/package.json                 |    26 +
 .../weex-vue-video/src/index.js                 |     2 +
 .../weex-vue-plugins/weex-vue-web/README.md     |     3 +
 .../weex-vue-plugins/weex-vue-web/package.json  |    26 +
 .../weex-vue-plugins/weex-vue-web/src/index.js  |     2 +
 .../weex-vue-websocket/README.md                |     3 +
 .../weex-vue-websocket/package.json             |    27 +
 .../weex-vue-websocket/src/index.js             |     2 +
 .../weex-vue-plugins/weex-vue-webview/README.md |     3 +
 .../weex-vue-webview/package.json               |    27 +
 .../weex-vue-webview/src/index.js               |     2 +
 packages/weex-vue-render/README.md              |    77 +
 packages/weex-vue-render/package.json           |     9 +-
 packages/weex-vue-render/src/index.core.js      |    13 +
 packages/weex-vue-render/src/index.js           |    12 +
 pre-build/native-bundle-main.js                 |    16 +-
 scripts/commit-msg.sh                           |     2 +-
 scripts/dist-vue.sh                             |     2 +-
 test/pages/components/hyperlink_target.vue      |     1 +
 test/pages/image-onload.vue                     |    14 +-
 test/scripts/components/image-onload.test.js    |    10 +
 vue.html                                        |    11 +-
 241 files changed, 39650 insertions(+), 2487 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4fa0a2c6/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4fa0a2c6/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
----------------------------------------------------------------------


[12/16] incubator-weex git commit: * [android] invoke callbacks when instance will be destroy

Posted by mi...@apache.org.
* [android] invoke callbacks when instance will be destroy


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

Branch: refs/heads/0.16-dev
Commit: b80a7b5999a5f69a1744f2d1043fbf0cdfe7f565
Parents: 4b0a600
Author: misakuo <mi...@apache.org>
Authored: Mon Aug 14 12:02:29 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Mon Aug 14 12:02:29 2017 +0800

----------------------------------------------------------------------
 .../main/java/com/taobao/weex/WXSDKManager.java  | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b80a7b59/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 fc3fe75..10b1873 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -53,6 +53,7 @@ import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 
 import java.io.File;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -91,6 +92,8 @@ public class WXSDKManager {
   // Tell weexv8 to initialize v8, default is true.
   private boolean mNeedInitV8 = true;
 
+  private List<InstanceLifeCycleCallbacks> mLifeCycleCallbacks;
+
   private static final int DEFAULT_VIEWPORT_WIDTH = 750;
 
   private WXSDKManager() {
@@ -288,6 +291,11 @@ public class WXSDKManager {
     if (!WXUtils.isUiThread()) {
       throw new WXRuntimeException("[WXSDKManager] destroyInstance error");
     }
+    if (mLifeCycleCallbacks != null) {
+      for (InstanceLifeCycleCallbacks callbacks : mLifeCycleCallbacks) {
+        callbacks.onInstanceDestroyed(instanceId);
+      }
+    }
     mWXRenderManager.removeRenderStatement(instanceId);
     mWXDomManager.removeDomStatement(instanceId);
     mBridgeManager.destroyInstance(instanceId);
@@ -429,4 +437,15 @@ public class WXSDKManager {
   public ITracingAdapter getTracingAdapter() {
     return mTracingAdapter;
   }
+
+  public void registerInstanceLifeCycleCallbacks(InstanceLifeCycleCallbacks callbacks) {
+    if (mLifeCycleCallbacks == null) {
+      mLifeCycleCallbacks = new ArrayList<>();
+    }
+    mLifeCycleCallbacks.add(callbacks);
+  }
+
+  public interface InstanceLifeCycleCallbacks {
+    void onInstanceDestroyed(String instanceId);
+  }
 }


[04/16] incubator-weex git commit: * [android] add TraceInfo on every component

Posted by mi...@apache.org.
* [android] add TraceInfo on every component


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

Branch: refs/heads/0.16-dev
Commit: afeedd922c81f16c0bc1cf8907a984efcd5da25f
Parents: 4bb0f14
Author: misakuo <mi...@apache.org>
Authored: Tue Jul 25 16:06:18 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Tue Jul 25 16:06:18 2017 +0800

----------------------------------------------------------------------
 .../taobao/weex/ui/component/WXComponent.java   | 27 +++++++++++++++++++-
 .../ui/component/list/BasicListComponent.java   |  1 +
 2 files changed, 27 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/afeedd92/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 985b616..cc44e79 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
@@ -39,6 +39,7 @@ import android.view.Menu;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
+
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.ComponentObserver;
@@ -57,6 +58,8 @@ import com.taobao.weex.dom.WXDomTask;
 import com.taobao.weex.dom.WXStyle;
 import com.taobao.weex.dom.action.Actions;
 import com.taobao.weex.dom.flex.Spacing;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.IFComponentHolder;
 import com.taobao.weex.ui.animation.WXAnimationModule;
 import com.taobao.weex.ui.component.pesudo.OnActivePseudoListner;
@@ -72,6 +75,7 @@ import com.taobao.weex.utils.WXReflectionUtils;
 import com.taobao.weex.utils.WXResourceUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
+
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -123,6 +127,8 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
   private int mType = TYPE_COMMON;
   private boolean mNeedLayoutOnAnimation = false;
 
+  public WXTracing.TraceInfo mTraceInfo = new WXTracing.TraceInfo();
+
   public static final int TYPE_COMMON = 0;
   public static final int TYPE_VIRTUAL = 1;
 
@@ -286,6 +292,7 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
   }
 
   public void applyLayoutAndEvent(WXComponent component) {
+    long startNanos = System.nanoTime();
     if(!isLazy()) {
       if (component == null) {
         component = this;
@@ -293,8 +300,8 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
       setLayout(component.getDomObject());
       setPadding(component.getDomObject().getPadding(), component.getDomObject().getBorder());
       addEvents();
-
     }
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   protected final void addFocusChangeListener(OnFocusChangeListener l){
@@ -348,6 +355,7 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
   }
 
   public void bindData(WXComponent component){
+    long startNanos = System.nanoTime();
     if(!isLazy()) {
       if (component == null) {
         component = this;
@@ -357,6 +365,7 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
       updateAttrs(component);
       updateExtra(component.getDomObject().getExtra());
     }
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   public void updateStyle(WXComponent component){
@@ -893,9 +902,12 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
    *
    */
   public final void createView() {
+    long startNanos = System.nanoTime();
     if(!isLazy()) {
       createViewImpl();
     }
+    mTraceInfo.uiThreadStart = System.currentTimeMillis();
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   protected void createViewImpl() {
@@ -1543,4 +1555,17 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
     message.what = WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE;
     WXSDKManager.getInstance().getWXDomManager().sendMessage(message);
   }
+
+  public void onRenderFinish() {
+    if (isLazy()) {
+      return;
+    }
+    double domTime = Stopwatch.nanosToMillis(((WXDomObject) mDomObj).mDomThreadNanos + mTraceInfo.domThreadNanos);
+    double uiTime = Stopwatch.nanosToMillis(mTraceInfo.uiThreadNanos);
+    WXLogUtils.e("RenderFinish", "Ref: " + getRef() + ", type: " + mDomObj.getType() + ", dom: " + mTraceInfo.domQueueTime + "/" + domTime + ", ui: " + mTraceInfo.uiQueueTime + "/" + uiTime);
+    WXTracing.TraceEvent domEvent = WXTracing.measureAndSubmit("dom " + mDomObj.getType() + "@" + getRef(), "X", mTraceInfo.rootEventId, getInstanceId(), domTime);
+    domEvent.ts = mTraceInfo.domThreadStart;
+    domEvent.tname = "DOMThread";
+    WXTracing.measureAndSubmit("ui " + mDomObj.getType() + "@" + getRef(), "X", mTraceInfo.rootEventId, getInstanceId(), uiTime).ts = mTraceInfo.uiThreadStart;
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/afeedd92/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
index 306be55..9418a1f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
@@ -850,6 +850,7 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
     if (holder.getComponent() != null && holder.getComponent() instanceof WXCell) {
       if(holder.isRecycled()) {
         holder.bindData(component);
+        component.onRenderFinish();
       }
       if (mDragHelper == null || !mDragHelper.isDraggable()) {
         return;


[06/16] incubator-weex git commit: + [android] batch modification for tracing @notdanger

Posted by mi...@apache.org.
+ [android] batch modification for tracing @notdanger


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

Branch: refs/heads/0.16-dev
Commit: 102f2ed0db66226aff309215acbd94472b77390b
Parents: e2d8a7b
Author: misakuo <mi...@apache.org>
Authored: Thu Aug 10 14:35:54 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Thu Aug 10 14:35:54 2017 +0800

----------------------------------------------------------------------
 .../com/alibaba/weex/PerformanceActivity.java   | 121 --------------
 .../java/com/taobao/weex/WXSDKInstance.java     |  37 ++++-
 .../main/java/com/taobao/weex/WXSDKManager.java |   9 ++
 .../taobao/weex/adapter/ITracingAdapter.java    |  31 ++++
 .../com/taobao/weex/bridge/WXBridgeManager.java |  66 +++++++-
 .../java/com/taobao/weex/common/WXTracing.java  |  76 ---------
 .../taobao/weex/dom/DOMActionContextImpl.java   |  23 +--
 .../com/taobao/weex/dom/RenderActionTask.java   |  26 +++-
 .../java/com/taobao/weex/dom/WXDomHandler.java  |  15 +-
 .../java/com/taobao/weex/dom/WXDomManager.java  |  16 +-
 .../java/com/taobao/weex/dom/WXDomModule.java   |  37 ++++-
 .../java/com/taobao/weex/dom/WXDomObject.java   |   9 ++
 .../dom/action/AbstractAddElementAction.java    |  28 +++-
 .../dom/action/AbstractLayoutFinishAction.java  |   3 +-
 .../weex/dom/action/AddElementAction.java       |  30 +++-
 .../taobao/weex/dom/action/AddEventAction.java  |  27 +++-
 .../weex/dom/action/CreateBodyAction.java       |  19 +++
 .../weex/dom/action/CreateFinishAction.java     |   6 +
 .../weex/dom/action/RefreshFinishAction.java    |   4 +
 .../taobao/weex/dom/action/TraceableAction.java |  82 ++++++++++
 .../weex/dom/action/UpdateAttributeAction.java  |   2 +-
 .../weex/dom/action/UpdateStyleAction.java      |   2 +-
 .../java/com/taobao/weex/tracing/Stopwatch.java | 132 ++++++++++++++++
 .../java/com/taobao/weex/tracing/WXTracing.java | 156 +++++++++++++++++++
 .../com/taobao/weex/ui/WXRenderManager.java     |  32 +++-
 .../taobao/weex/ui/component/WXComponent.java   |  58 +++++--
 .../taobao/weex/ui/component/WXVContainer.java  |  18 +++
 .../ui/component/list/BasicListComponent.java   |   2 +-
 .../java/com/taobao/weex/utils/WXLogUtils.java  |  45 +++---
 .../com/taobao/weex/utils/WXLogUtilsTest.java   |   1 -
 30 files changed, 826 insertions(+), 287 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java b/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java
deleted file mode 100644
index ad88546..0000000
--- a/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package com.alibaba.weex;
-
-
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.view.Gravity;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.alibaba.weex.performance.EnvironmentFragment;
-import com.alibaba.weex.performance.EventOverviewFragment;
-
-public class PerformanceActivity extends WXBaseActivity {
-
-  private LinearLayout segmentHost;
-
-  public static void start(Context context, int instanceId) {
-    Intent intent = new Intent(context, PerformanceActivity.class);
-    intent.putExtra("instanceId", instanceId);
-    context.startActivity(intent);
-  }
-
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    setContentView(R.layout.activity_performance);
-    segmentHost = (LinearLayout) findViewById(R.id.segment_control);
-    addTab("页面性能", true, new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        switchFragment(EventOverviewFragment.getInstance(getIntent().getIntExtra("instanceId", -1)));
-      }
-    });
-
-    addTab("DOM树", false, new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-
-      }
-    });
-
-    addTab("JS LOG", false, new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-
-      }
-    });
-
-    addTab("环境变量", false, new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        switchFragment(new EnvironmentFragment());
-      }
-    });
-  }
-
-  private void switchFragment(Fragment fragment) {
-    getSupportFragmentManager()
-        .beginTransaction()
-        .replace(R.id.fragment_container, fragment)
-        .commitAllowingStateLoss();
-  }
-
-  @Override
-  protected void onResumeFragments() {
-    super.onResumeFragments();
-    FragmentManager fragmentManager = getSupportFragmentManager();
-
-    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
-    if (fragment == null) {
-      fragmentManager
-          .beginTransaction()
-          .add(R.id.fragment_container, EventOverviewFragment.getInstance(getIntent().getIntExtra("instanceId", -1)))
-          .commitAllowingStateLoss();
-    }
-  }
-
-  private void addTab(String title, final boolean selected, final View.OnClickListener listener) {
-    final TextView textView = new TextView(this);
-    textView.setText(title);
-    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
-    lp.weight = 1;
-    lp.setMargins(1, 1, 1, 1);
-    if (selected) {
-      textView.setBackgroundColor(Color.TRANSPARENT);
-    } else {
-      textView.setBackgroundColor(Color.WHITE);
-    }
-    textView.setGravity(Gravity.CENTER);
-    textView.setLayoutParams(lp);
-    textView.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        if (!v.isSelected() && v instanceof TextView) {
-          listener.onClick(v);
-          for (int i = 0; i < segmentHost.getChildCount(); i++) {
-            segmentHost.getChildAt(i).setSelected(false);
-            segmentHost.getChildAt(i).setBackgroundColor(Color.WHITE);
-            ((TextView) segmentHost.getChildAt(i)).setTextColor(Color.parseColor("#1E90FF"));
-          }
-          v.setSelected(true);
-          v.setBackgroundColor(Color.TRANSPARENT);
-          ((TextView) v).setTextColor(Color.WHITE);
-        }
-      }
-    });
-    textView.setSelected(selected);
-    if (selected) {
-      textView.setTextColor(Color.WHITE);
-    } else {
-      textView.setTextColor(Color.parseColor("#1E90FF"));
-    }
-    segmentHost.addView(textView);
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/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 a8d8a60..d806148 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -61,6 +61,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.tracing.WXTracing;
 import com.taobao.weex.ui.component.NestedContainer;
 import com.taobao.weex.ui.component.WXBasicComponentType;
 import com.taobao.weex.ui.component.WXComponent;
@@ -116,6 +117,9 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   private static volatile int mViewPortWidth = 750;
   private int mInstanceViewPortWidth = 750;
 
+  public long mRenderStartNanos;
+  public int mExecJSTraceId = WXTracing.nextId();
+
   /**
    * Render strategy.
    */
@@ -415,6 +419,16 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       return;
     }
 
+    if (WXTracing.isAvailable()) {
+      WXTracing.TraceEvent traceEvent = WXTracing.newEvent("executeBundleJS", mInstanceId, -1);
+      traceEvent.traceId = mExecJSTraceId;
+      traceEvent.iid = mInstanceId;
+      traceEvent.tname = "JSThread";
+      traceEvent.ph = "B";
+      traceEvent.submit();
+      mRenderStartNanos = System.nanoTime();
+    }
+
     ensureRenderArchor();
 
     Map<String, Object> renderOptions = options;
@@ -429,7 +443,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
 
     mWXPerformance.pageName = pageName;
-    mWXPerformance.JSTemplateSize = template.length() / 1024;
+    mWXPerformance.JSTemplateSize = template.length() / 1024f;
 
     mRenderStartTime = System.currentTimeMillis();
     mRenderStrategy = flag;
@@ -1480,6 +1494,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     private WXRenderStrategy flag;
     private WXSDKInstance instance;
     private long startRequestTime;
+    private int traceId;
 
     private WXHttpListener(String pageName, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag, long startRequestTime) {
       this.pageName = pageName;
@@ -1487,6 +1502,16 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       this.jsonInitData = jsonInitData;
       this.flag = flag;
       this.startRequestTime = startRequestTime;
+      this.traceId = WXTracing.nextId();
+
+      if (WXTracing.isAvailable()) {
+        WXTracing.TraceEvent event = WXTracing.newEvent("downloadBundleJS", mInstanceId, -1);
+        event.iid = mInstanceId;
+        event.tname = "Network";
+        event.ph = "B";
+        event.traceId = traceId;
+        event.submit();
+      }
     }
     
     public void setSDKInstance(WXSDKInstance instance) {
@@ -1526,6 +1551,16 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
         this.instance.getWXStatisticsListener().onHttpFinish();
       }
 
+      if (WXTracing.isAvailable()) {
+        WXTracing.TraceEvent event = WXTracing.newEvent("downloadBundleJS", mInstanceId, -1);
+        event.traceId = traceId;
+        event.tname = "Network";
+        event.ph = "E";
+        event.extParams = new HashMap<>();
+        event.extParams.put("BundleSize", response.originalData.length);
+        event.submit();
+      }
+
       mWXPerformance.networkTime = System.currentTimeMillis() - startRequestTime;
       if(response.extendParams!=null){
         Object actualNetworkTime=response.extendParams.get("actualNetworkTime");

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/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 0b43fa6..84e5fa8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -27,6 +27,7 @@ import com.taobao.weex.adapter.DefaultUriAdapter;
 import com.taobao.weex.adapter.DefaultWXHttpAdapter;
 import com.taobao.weex.adapter.ICrashInfoReporter;
 import com.taobao.weex.adapter.IDrawableLoader;
+import com.taobao.weex.adapter.ITracingAdapter;
 import com.taobao.weex.adapter.IWXDebugAdapter;
 import com.taobao.weex.adapter.IWXHttpAdapter;
 import com.taobao.weex.adapter.IWXImgLoaderAdapter;
@@ -83,6 +84,7 @@ public class WXSDKManager {
   private IWXStatisticsListener mStatisticsListener;
   private URIAdapter mURIAdapter;
   private IWebSocketAdapterFactory mIWebSocketAdapterFactory;
+  private ITracingAdapter mTracingAdapter;
   private WXValidateProcessor mWXValidateProcessor;
   // Tell weexv8 to initialize v8, default is true.
   private boolean mNeedInitV8 = true;
@@ -410,4 +412,11 @@ public class WXSDKManager {
     }
   }
 
+  public void setTracingAdapter(ITracingAdapter adapter) {
+    this.mTracingAdapter = adapter;
+  }
+
+  public ITracingAdapter getTracingAdapter() {
+    return mTracingAdapter;
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/adapter/ITracingAdapter.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/ITracingAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/ITracingAdapter.java
new file mode 100644
index 0000000..4acb23d
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/adapter/ITracingAdapter.java
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.adapter;
+
+import com.taobao.weex.tracing.WXTracing;
+
+/**
+ * Created by moxun on 2017/7/6.
+ */
+
+public interface ITracingAdapter {
+  void enable();
+  void disable();
+  void submitTracingEvent(WXTracing.TraceEvent event);
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/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 2e8e928..2d533ea 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
@@ -51,6 +51,8 @@ import com.taobao.weex.dom.DOMAction;
 import com.taobao.weex.dom.WXDomModule;
 import com.taobao.weex.dom.action.Action;
 import com.taobao.weex.dom.action.Actions;
+import com.taobao.weex.dom.action.TraceableAction;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.utils.WXFileUtils;
 import com.taobao.weex.utils.WXJsonUtils;
 import com.taobao.weex.utils.WXLogUtils;
@@ -157,6 +159,8 @@ public class WXBridgeManager implements Callback,BactchExecutor {
 
   private Interceptor mInterceptor;
 
+  private WXParams mInitParams;
+
   private WXBridgeManager() {
     initWXBridge(WXEnvironment.sRemoteDebugMode);
     mJSThread = new WXThread("WeexJSBridgeThread", this);
@@ -394,7 +398,9 @@ public class WXBridgeManager implements Callback,BactchExecutor {
 
 
     long start = System.currentTimeMillis();
+    long parseNanos = System.nanoTime();
     JSONArray array = JSON.parseArray(tasks);
+    parseNanos = System.nanoTime() - parseNanos;
 
     if(WXSDKManager.getInstance().getSDKInstance(instanceId)!=null) {
       WXSDKManager.getInstance().getSDKInstance(instanceId).jsonParseTime(System.currentTimeMillis() - start);
@@ -411,7 +417,7 @@ public class WXBridgeManager implements Callback,BactchExecutor {
             if(target != null){
               if(WXDomModule.WXDOM.equals(target)){
                 WXDomModule dom = getDomModule(instanceId);
-                dom.callDomMethod(task);
+                dom.callDomMethod(task,parseNanos);
               }else {
                 callModuleMethod(instanceId, (String) target,
                     (String) task.get(METHOD), (JSONArray) task.get(ARGS));
@@ -463,10 +469,20 @@ public class WXBridgeManager implements Callback,BactchExecutor {
 
     try {
       if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
+        long start = System.currentTimeMillis();
+        long nanosTemp = System.nanoTime();
         JSONObject domObject = JSON.parseObject(tasks);
+        nanosTemp = System.nanoTime() - nanosTemp;
+
         WXDomModule domModule = getDomModule(instanceId);
         Action action = Actions.getCreateBody(domObject);
         domModule.postAction((DOMAction)action, true);
+
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).mParseJsonNanos = nanosTemp;
+          ((TraceableAction) action).mStartMillis = start;
+          ((TraceableAction) action).onStartDomExecute(instanceId, "createBody", "_root", domObject.getString("type"), tasks);
+        }
       }
     } catch (Exception e) {
         WXLogUtils.e("[WXBridgeManager] callCreateBody exception: ", e);
@@ -605,9 +621,19 @@ public class WXBridgeManager implements Callback,BactchExecutor {
     try {
       if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
         WXDomModule domModule = getDomModule(instanceId);
+        long start = System.currentTimeMillis();
+        long parseNanos = System.nanoTime();
         JSONObject domObject = JSON.parseObject(task);
+        parseNanos = System.nanoTime() - parseNanos;
+
         Action action = Actions.getUpdateAttrs(ref, domObject);
         domModule.postAction((DOMAction)action, false);
+
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).mStartMillis = start;
+          ((TraceableAction) action).mParseJsonNanos = parseNanos;
+          ((TraceableAction) action).onStartDomExecute(instanceId, "updateAttrs", domObject.getString("ref"), domObject.getString("type"), task);
+        }
       }
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateAttrs exception: ", e);
@@ -648,9 +674,19 @@ public class WXBridgeManager implements Callback,BactchExecutor {
     try {
       if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
         WXDomModule domModule = getDomModule(instanceId);
+        long start = System.currentTimeMillis();
+        long nanosTemp = System.nanoTime();
         JSONObject domObject = JSON.parseObject(task);
+        nanosTemp = System.nanoTime() - nanosTemp;
+
         Action action = Actions.getUpdateStyle(ref, domObject, false);
         domModule.postAction((DOMAction)action, false);
+
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).mParseJsonNanos = nanosTemp;
+          ((TraceableAction) action).mStartMillis = start;
+          ((TraceableAction) action).onStartDomExecute(instanceId, "updateStyle", ref, domObject.getString("type"), domObject.toJSONString());
+        }
       }
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateStyle exception: ", e);
@@ -684,6 +720,10 @@ public class WXBridgeManager implements Callback,BactchExecutor {
         WXDomModule domModule = getDomModule(instanceId);
         Action action = Actions.getRemoveElement(ref);
         domModule.postAction((DOMAction)action, false);
+
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).onStartDomExecute(instanceId, "removeElement", ref, null, ref);
+        }
       }
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRemoveElement exception: ", e);
@@ -752,6 +792,10 @@ public class WXBridgeManager implements Callback,BactchExecutor {
         WXDomModule domModule = getDomModule(instanceId);
         Action action = Actions.getAddEvent(ref, event);
         domModule.postAction((DOMAction)action, false);
+
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).onStartDomExecute(instanceId, "addEvent", ref, null, event);
+        }
       }
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callAddEvent exception: ", e);
@@ -785,6 +829,10 @@ public class WXBridgeManager implements Callback,BactchExecutor {
         WXDomModule domModule = getDomModule(instanceId);
         Action action = Actions.getRemoveEvent(ref, event);
         domModule.postAction((DOMAction)action, false);
+
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).onStartDomExecute(instanceId, "removeEvent", ref, null, event);
+        }
       }
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRemoveEvent exception: ", e);
@@ -815,13 +863,22 @@ public class WXBridgeManager implements Callback,BactchExecutor {
 
     if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
       long start = System.currentTimeMillis();
+      long nanosTemp = System.nanoTime();
       JSONObject domObject = JSON.parseObject(dom);
+      nanosTemp = System.nanoTime() - nanosTemp;
 
       if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
         WXSDKManager.getInstance().getSDKInstance(instanceId).jsonParseTime(System.currentTimeMillis() - start);
       }
       WXDomModule domModule = getDomModule(instanceId);
-      domModule.postAction(Actions.getAddElement(domObject, ref,Integer.parseInt(index)),false);
+      DOMAction addElementAction = Actions.getAddElement(domObject, ref,Integer.parseInt(index));
+      domModule.postAction(addElementAction, false);
+
+      if (WXTracing.isAvailable() && addElementAction instanceof TraceableAction) {
+        ((TraceableAction) addElementAction).mParseJsonNanos = nanosTemp;
+        ((TraceableAction) addElementAction).mStartMillis = start;
+        ((TraceableAction) addElementAction).onStartDomExecute(instanceId, "addElement", domObject.getString("ref"), domObject.getString("type"), dom);
+      }
     }
 
     if (UNDEFINED.equals(callback) || NON_CALLBACK.equals(callback)) {
@@ -1368,9 +1425,14 @@ public class WXBridgeManager implements Callback,BactchExecutor {
     wxParams.setDeviceHeight(TextUtils.isEmpty(config.get("deviceHeight")) ? String.valueOf(WXViewUtils.getScreenHeight(WXEnvironment.sApplication)) : config.get("deviceHeight"));
     wxParams.setOptions(WXEnvironment.getCustomOptions());
     wxParams.setNeedInitV8(WXSDKManager.getInstance().needInitV8());
+    mInitParams = wxParams;
     return wxParams;
   }
 
+  public WXParams getInitParams() {
+    return mInitParams;
+  }
+
   private void execRegisterFailTask() {
 
     if (mRegisterModuleFailList.size() > 0) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java b/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
deleted file mode 100644
index bc37386..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXTracing.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.taobao.weex.common;
-
-import android.os.Message;
-
-import com.taobao.weex.dom.WXDomHandler;
-import com.taobao.weex.dom.WXDomTask;
-import com.taobao.weex.dom.action.Action;
-import com.taobao.weex.utils.WXLogUtils;
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * Created by moxun on 2017/6/6.
- */
-
-public class WXTracing {
-    private static final AtomicInteger sIdGenerator = new AtomicInteger(0);
-
-    public static int nextId() {
-        return sIdGenerator.getAndIncrement();
-    }
-
-    public static void submit(TraceEvent event) {
-        WXLogUtils.d("WXTracing", event.toString());
-    }
-
-    public static class TraceEvent {
-        public String name;
-        public String phase;
-        public String threadName;
-        public long timestamp;
-        public long nanoTime;
-        public long duration;
-
-        @Override
-        public String toString() {
-            final StringBuffer sb = new StringBuffer("TraceEvent{");
-            sb.append("name='").append(name).append('\'');
-            sb.append(", threadName='").append(threadName).append('\'');
-            sb.append(", phase='").append(phase).append('\'');
-            sb.append(", timestamp=").append(timestamp);
-            sb.append(", nanoTime=").append(nanoTime);
-            sb.append(", duration=").append(duration);
-            sb.append('}');
-            return sb.toString();
-        }
-    }
-
-    public static String getFunctionName(Message msg) {
-        Object obj = msg.obj;
-        if (obj != null && obj instanceof WXDomTask) {
-            Object action = ((WXDomTask) obj).args.get(0);
-            if (action instanceof Action) {
-                return getFunctionName(action.getClass());
-            }
-        }
-
-        String actionName = "unknown";
-        int what = msg.what;
-        if (what == WXDomHandler.MsgType.WX_DOM_BATCH) {
-            actionName = "domBatch";
-        } else if (what == WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE) {
-            actionName = "updateStyle";
-        } else if (what == WXDomHandler.MsgType.WX_CONSUME_RENDER_TASKS) {
-            actionName = "consumeRenderTasks";
-        }
-        return actionName;
-    }
-
-    public static String getFunctionName(Class clazz) {
-        String simpleName = clazz.getSimpleName();
-        char[] chars = simpleName.replace("Action", "").toCharArray();
-        chars[0] = Character.toLowerCase(chars[0]);
-        return new String(chars);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
index 6e1e385..d18cea8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
@@ -26,12 +26,13 @@ import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.dom.action.Actions;
 import com.taobao.weex.dom.flex.CSSLayoutContext;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.IWXRenderTask;
 import com.taobao.weex.ui.WXRenderManager;
 import com.taobao.weex.ui.animation.WXAnimationBean;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXVContainer;
-import com.taobao.weex.utils.Stopwatch;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.util.ArrayList;
@@ -172,9 +173,18 @@ class DOMActionContextImpl implements DOMActionContext {
     if (!mDirty || mDestroy) {
       return;
     }
-
+    long start = System.currentTimeMillis();
+    long startNanos = System.nanoTime();
     WXDomObject rootDom = mRegistry.get(WXDomObject.ROOT);
     layout(rootDom);
+
+    if (WXTracing.isAvailable()) {
+      WXTracing.TraceEvent batchEvent = WXTracing.newEvent("domBatch", mInstanceId, -1);
+      batchEvent.duration = Stopwatch.nanosToMillis(System.nanoTime() - startNanos);
+      batchEvent.ts = start;
+      batchEvent.ph = "X";
+      WXTracing.submit(batchEvent);
+    }
   }
 
   void layout(WXDomObject rootDom) {
@@ -182,9 +192,7 @@ class DOMActionContextImpl implements DOMActionContext {
       return;
     }
     long start0 = System.currentTimeMillis();
-    Stopwatch.tick();
     rebuildingFixedDomTree(rootDom);
-    WXLogUtils.e("Tracing", "rebuildingFixedDomTree " + Stopwatch.tackAndTick() + " ms");
 
     rootDom.traverseTree( new WXDomObject.Consumer() {
       @Override
@@ -195,13 +203,9 @@ class DOMActionContextImpl implements DOMActionContext {
         dom.layoutBefore();
       }
     });
-    WXLogUtils.e("Tracing", "layoutBefore " + Stopwatch.tackAndTick() + " ms");
     long start = System.currentTimeMillis();
 
-
-    long s = System.nanoTime();
     rootDom.calculateLayout(mLayoutContext);
-    WXLogUtils.e("Tracing", "layout " + Stopwatch.tackAndTick() + " ms");
 
     WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(mInstanceId);
     if (instance != null) {
@@ -217,11 +221,9 @@ class DOMActionContextImpl implements DOMActionContext {
         dom.layoutAfter();
       }
     });
-    WXLogUtils.e("Tracing", "layoutAfter " + Stopwatch.tackAndTick() + " ms");
 
     start = System.currentTimeMillis();
     rootDom.traverseTree(new ApplyUpdateConsumer());
-    WXLogUtils.e("Tracing", "applyUpdateConsumer " + Stopwatch.tackAndTick() + " ms");
 
     if (instance != null) {
       instance.applyUpdateTime(System.currentTimeMillis() - start);
@@ -232,7 +234,6 @@ class DOMActionContextImpl implements DOMActionContext {
     if (instance != null) {
       instance.updateDomObjTime(System.currentTimeMillis() - start);
     }
-    WXLogUtils.e("Tracing", "updateDomObj " + Stopwatch.tack() + " ms");
     parseAnimation();
 
     boolean isPreRenderMode = instance != null && instance.isPreRenderMode();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/RenderActionTask.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/RenderActionTask.java b/android/sdk/src/main/java/com/taobao/weex/dom/RenderActionTask.java
index 28b487f..bac1574 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/RenderActionTask.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/RenderActionTask.java
@@ -18,6 +18,12 @@
  */
 package com.taobao.weex.dom;
 
+import android.os.SystemClock;
+
+import com.taobao.weex.dom.action.AbstractAddElementAction;
+import com.taobao.weex.dom.action.TraceableAction;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.IWXRenderTask;
 
 /**
@@ -27,15 +33,33 @@ import com.taobao.weex.ui.IWXRenderTask;
 class RenderActionTask implements IWXRenderTask {
   private final RenderAction mRenderTask;
   private final RenderActionContext mContext;
+  private final long mStartMillis = SystemClock.uptimeMillis();
 
   public RenderActionTask(RenderAction action, RenderActionContext context){
     mRenderTask = action;
     mContext = context;
   }
 
-
   @Override
   public void execute() {
+    if (WXTracing.isAvailable() && mRenderTask instanceof TraceableAction) {
+      ((TraceableAction) mRenderTask).mUIQueueTime = SystemClock.uptimeMillis() - mStartMillis;
+    }
+    long start = System.currentTimeMillis();
+    long uiNanos = System.nanoTime();
     mRenderTask.executeRender(mContext);
+
+    if (WXTracing.isAvailable()) {
+      uiNanos = System.nanoTime() - uiNanos;
+      if (mRenderTask instanceof TraceableAction) {
+        if (!(mRenderTask instanceof AbstractAddElementAction)) {
+          WXTracing.TraceEvent uiExecuteEvent = WXTracing.newEvent("UIExecute", mContext.getInstance().getInstanceId(), ((TraceableAction) mRenderTask).mTracingEventId);
+          uiExecuteEvent.duration = Stopwatch.nanosToMillis(uiNanos);
+          uiExecuteEvent.ts = start;
+          uiExecuteEvent.submit();
+        }
+        ((TraceableAction) mRenderTask).onFinishUIExecute();
+      }
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
index 03f6940..ca79066 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomHandler.java
@@ -23,9 +23,8 @@ import android.os.Message;
 import android.os.SystemClock;
 
 import com.alibaba.fastjson.JSONObject;
-import com.taobao.weex.common.WXTracing;
 import com.taobao.weex.dom.action.Actions;
-import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.dom.action.TraceableAction;
 
 /**
  * Handler for dom operations.
@@ -45,8 +44,6 @@ public class WXDomHandler implements Handler.Callback {
 
   @Override
   public boolean handleMessage(Message msg) {
-    long s = System.nanoTime();
-    String actionName = WXTracing.getFunctionName(msg);
     if (msg == null) {
       return false;
     }
@@ -54,11 +51,12 @@ public class WXDomHandler implements Handler.Callback {
     Object obj = msg.obj;
     WXDomTask task = null;
 
-    if (obj instanceof WXDomTask) {
+    if (obj != null && obj instanceof WXDomTask) {
       task = (WXDomTask) obj;
-      WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + ((s - task.startTime) / 1000000.0) + " ms");
-    } else {
-      WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + (SystemClock.uptimeMillis() - msg.getWhen()) + " ms");
+      Object action = ((WXDomTask) obj).args.get(0);
+      if (action != null && action instanceof TraceableAction) {
+        ((TraceableAction) action).mDomQueueTime = SystemClock.uptimeMillis() - msg.getWhen();
+      }
     }
 
     if (!mHasBatch) {
@@ -86,7 +84,6 @@ public class WXDomHandler implements Handler.Callback {
       default:
         break;
     }
-    WXLogUtils.e("Tracing", "Method " + actionName + ", Dom execute time " + ((System.nanoTime() - s) / 1000000.0) + " ms");
     return true;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
index fe8866b..66fd56e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomManager.java
@@ -26,6 +26,10 @@ import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
+import com.taobao.weex.dom.action.AbstractAddElementAction;
+import com.taobao.weex.dom.action.TraceableAction;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.WXRenderManager;
 import com.taobao.weex.utils.WXUtils;
 
@@ -160,8 +164,18 @@ public final class WXDomManager {
         return;
       }
     }
+    long domStart = System.currentTimeMillis();
+    long domNanos = System.nanoTime();
     action.executeDom(context);
-
+    if (WXTracing.isAvailable()) {
+      domNanos = System.nanoTime() - domNanos;
+      if (!(action instanceof AbstractAddElementAction) && action instanceof TraceableAction) {
+        WXTracing.TraceEvent domExecuteEvent = WXTracing.newEvent("DomExecute", context.getInstanceId(), ((TraceableAction) action).mTracingEventId);
+        domExecuteEvent.duration = Stopwatch.nanosToMillis(domNanos);
+        domExecuteEvent.ts = domStart;
+        domExecuteEvent.submit();
+      }
+    }
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
index 2d44561..399ab3a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomModule.java
@@ -26,6 +26,9 @@ import com.taobao.weex.bridge.WXBridgeManager;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.dom.action.Action;
 import com.taobao.weex.dom.action.Actions;
+import com.taobao.weex.dom.action.TraceableAction;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.utils.WXLogUtils;
 
 
@@ -76,16 +79,16 @@ public final class WXDomModule extends WXModule {
     mWXSDKInstance = instance;
   }
 
-  public void callDomMethod(JSONObject task) {
+  public void callDomMethod(JSONObject task, long... parseNanos) {
     if (task == null) {
       return;
     }
     String method = (String) task.get(WXBridgeManager.METHOD);
     JSONArray args = (JSONArray) task.get(WXBridgeManager.ARGS);
-    callDomMethod(method,args);
+    callDomMethod(method,args,parseNanos);
   }
   
-  public Object callDomMethod(String method, JSONArray args) {
+  public Object callDomMethod(String method, JSONArray args, long... parseNanos) {
 
     if (method == null) {
       return null;
@@ -102,6 +105,34 @@ public final class WXDomModule extends WXModule {
       }else {
         postAction((RenderAction)action);
       }
+
+      if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+        //TODO: CHECK AGAIN
+        String ref = null;
+        String type = null;
+        if (args.size() > 0) {
+          if (args.size() >= 1) {
+            if (args.get(0) instanceof String) {
+              ref = args.getString(0);
+            } else if (args.get(0) instanceof JSONObject) {
+              ref = ((JSONObject) args.get(0)).getString("ref");
+              type = ((JSONObject) args.get(0)).getString("type");
+            }
+          }
+
+          if (args.size() >= 2) {
+            if (args.get(1) instanceof JSONObject) {
+              ref = ((JSONObject) args.get(1)).getString("ref");
+              type = ((JSONObject) args.get(1)).getString("type");
+            }
+          }
+        }
+        if (parseNanos != null && parseNanos.length == 1) {
+          ((TraceableAction) action).mParseJsonNanos = parseNanos[0];
+          ((TraceableAction) action).mStartMillis -= Stopwatch.nanosToMillis(parseNanos[0]);
+        }
+        ((TraceableAction) action).onStartDomExecute(mWXSDKInstance.getInstanceId(), method, ref, type, args.toJSONString());
+      }
     } catch (IndexOutOfBoundsException e) {
       // no enougn args
       e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
index 641c95a..258df2b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
@@ -86,7 +86,11 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
 
   private boolean mYoung = false;
 
+  public long mDomThreadNanos;
+  public long mDomThreadTimestamp;
+
   public void traverseTree(Consumer...consumers){
+    long startNanos = System.nanoTime();
     if (consumers == null) {
       return;
     }
@@ -101,6 +105,7 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
       child = getChild(i);
       child.traverseTree(consumers);
     }
+    mDomThreadNanos += (System.nanoTime() - startNanos);
   }
 
 
@@ -628,6 +633,8 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
    * @return Dom Object corresponding to the JSONObject.
    */
   public static  @Nullable WXDomObject parse(JSONObject json, WXSDKInstance wxsdkInstance){
+      long startNanos = System.nanoTime();
+      long timestamp = System.currentTimeMillis();
       if (json == null || json.size() <= 0) {
         return null;
       }
@@ -671,6 +678,8 @@ public class WXDomObject extends CSSNode implements Cloneable,ImmutableDomObject
         }
       }
 
+      domObject.mDomThreadNanos = System.nanoTime() - startNanos;
+      domObject.mDomThreadTimestamp = timestamp;
       return domObject;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
index b3b27a6..3b2d964 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractAddElementAction.java
@@ -28,24 +28,30 @@ import com.taobao.weex.dom.DOMAction;
 import com.taobao.weex.dom.DOMActionContext;
 import com.taobao.weex.dom.RenderAction;
 import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXComponentFactory;
 import com.taobao.weex.ui.component.WXVContainer;
-import com.taobao.weex.utils.Stopwatch;
 import com.taobao.weex.utils.WXLogUtils;
 
+import java.util.List;
+
 /**
  * Created by sospartan on 22/02/2017.
  */
 
-abstract class AbstractAddElementAction implements DOMAction, RenderAction {
-
+public abstract class AbstractAddElementAction extends TraceableAction implements DOMAction, RenderAction {
 
   protected WXComponent generateComponentTree(DOMActionContext context, WXDomObject dom, WXVContainer parent) {
     if (dom == null) {
       return null;
     }
+    long startNanos = System.nanoTime();
     WXComponent component = WXComponentFactory.newInstance(context.getInstance(), dom, parent);
+    component.mTraceInfo.domThreadStart = dom.mDomThreadTimestamp;
+    component.mTraceInfo.rootEventId = mTracingEventId;
+    component.mTraceInfo.domQueueTime = mDomQueueTime;
 
     context.registerComponent(dom.getRef(), component);
     if (component instanceof WXVContainer) {
@@ -59,7 +65,7 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
         }
       }
     }
-
+    component.mTraceInfo.domThreadNanos = System.nanoTime() - startNanos;
     return component;
   }
 
@@ -83,7 +89,7 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
     //only non-root has parent.
     Stopwatch.tick();
     WXDomObject domObject = WXDomObject.parse(dom, instance);
-    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " parseDomObject " + Stopwatch.tackAndTick() + " ms");
+    Stopwatch.split("parseDomObject");
 
     if (domObject == null || context.getDomByRef(domObject.getRef()) != null) {
       if (WXEnvironment.isApkDebugable()) {
@@ -93,13 +99,13 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
       return;
     }
     appendDomToTree(context, domObject);
-    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " appendDomToTree " + Stopwatch.tackAndTick() + " ms");
+    Stopwatch.split("appendDomToTree");
 
     domObject.traverseTree(
         context.getAddDOMConsumer(),
         context.getApplyStyleConsumer()
     );
-    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " traverseTree " + Stopwatch.tackAndTick() + " ms");
+    Stopwatch.split("traverseTree");
 
 
     //Create component in dom thread
@@ -109,13 +115,19 @@ abstract class AbstractAddElementAction implements DOMAction, RenderAction {
       //stop redner, some fatal happened.
       return;
     }
-    WXLogUtils.e("Tracing", "Component " + domObject.getRef() + " createComponent " + Stopwatch.tackAndTick() + " ms");
+    Stopwatch.split("createComponent");
 
     context.addDomInfo(domObject.getRef(), component);
     context.postRenderTask(this);
     addAnimationForDomTree(context, domObject);
 
     instance.commitUTStab(IWXUserTrackAdapter.DOM_MODULE, WXErrorCode.WX_SUCCESS);
+    if (WXTracing.isAvailable()) {
+      List<Stopwatch.ProcessEvent> events = Stopwatch.getProcessEvents();
+      for (Stopwatch.ProcessEvent event : events) {
+        submitPerformance(event.fname, "X", context.getInstanceId(), event.duration, event.startMillis, true);
+      }
+    }
   }
 
   public void addAnimationForDomTree(DOMActionContext context, WXDomObject domObject) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractLayoutFinishAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractLayoutFinishAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractLayoutFinishAction.java
index 120e56c..a16f27a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractLayoutFinishAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AbstractLayoutFinishAction.java
@@ -21,7 +21,6 @@ package com.taobao.weex.dom.action;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.adapter.IWXUserTrackAdapter;
 import com.taobao.weex.common.WXErrorCode;
-import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.dom.DOMAction;
 import com.taobao.weex.dom.DOMActionContext;
 import com.taobao.weex.dom.RenderAction;
@@ -30,7 +29,7 @@ import com.taobao.weex.dom.WXDomObject;
 /**
  * Created by sospartan on 02/03/2017.
  */
-abstract class AbstractLayoutFinishAction implements DOMAction, RenderAction {
+abstract class AbstractLayoutFinishAction extends TraceableAction implements DOMAction, RenderAction {
 
   protected int mLayoutWidth;
   protected int mLayoutHeight;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
index a4b3adf..e8b3721 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddElementAction.java
@@ -25,11 +25,14 @@ import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.dom.DOMActionContext;
 import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXVContainer;
-import com.taobao.weex.utils.Stopwatch;
 import com.taobao.weex.utils.WXLogUtils;
 
+import java.util.List;
+
 /**
  * Created by sospartan on 22/02/2017.
  */
@@ -59,6 +62,7 @@ final class AddElementAction extends AbstractAddElementAction {
 
   @Override
   protected void appendDomToTree(DOMActionContext context, WXDomObject domObject) {
+    long startNanos = System.nanoTime();
     WXDomObject parent;
     mRef = domObject.getRef();
     if ((parent = context.getDomByRef(mParentRef)) == null) {
@@ -68,6 +72,7 @@ final class AddElementAction extends AbstractAddElementAction {
       //non-root and parent exist
       parent.add(domObject, mAddIndex);
     }
+    domObject.mDomThreadNanos += (System.nanoTime() - startNanos);
   }
 
   @Override
@@ -98,14 +103,31 @@ final class AddElementAction extends AbstractAddElementAction {
       if (parent == null || component == null) {
         return;
       }
+
       Stopwatch.tick();
       parent.addChild(component, mAddIndex);
       parent.createChildViewAt(mAddIndex);
-      WXLogUtils.e("Tracing", "Component " + mRef + " createViewTree " + Stopwatch.tackAndTick() + " ms");
+      Stopwatch.split("createViewTree");
+
       component.applyLayoutAndEvent(component);
-      WXLogUtils.e("Tracing", "Component " + mRef + " applyLayoutAndEvent " + Stopwatch.tackAndTick() + " ms");
+      Stopwatch.split("applyLayoutAndEvent");
+
       component.bindData(component);
-      WXLogUtils.e("Tracing", "Component " + mRef + " bindData " + Stopwatch.tackAndTick() + " ms");
+      Stopwatch.split("bindData");
+
+      if (WXTracing.isAvailable()) {
+        String instanceId = context.getInstance().getInstanceId();
+        List<Stopwatch.ProcessEvent> splits = Stopwatch.getProcessEvents();
+        for (Stopwatch.ProcessEvent event : splits) {
+          submitPerformance(event.fname, "X", instanceId, event.duration, event.startMillis, true);
+        }
+      }
+      component.mTraceInfo.uiQueueTime = mUIQueueTime;
+      if (component.isLazy()) {
+        component.onRenderFinish(WXComponent.STATE_DOM_FINISH);
+      } else {
+        component.onRenderFinish(WXComponent.STATE_ALL_FINISH);
+      }
     } catch (Exception e) {
       WXLogUtils.e("add component failed.", e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
index e051917..e0ee886 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/AddEventAction.java
@@ -26,14 +26,16 @@ import com.taobao.weex.dom.DOMActionContext;
 import com.taobao.weex.dom.RenderAction;
 import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.utils.Stopwatch;
-import com.taobao.weex.utils.WXLogUtils;
+
+import java.util.List;
 
 /**
  * Created by sospartan on 01/03/2017.
  */
-class AddEventAction implements DOMAction, RenderAction {
+class AddEventAction extends TraceableAction implements DOMAction, RenderAction {
   private final String mRef;
   private final String mEvent;
 
@@ -49,6 +51,8 @@ class AddEventAction implements DOMAction, RenderAction {
     if (context.isDestory()) {
       return;
     }
+
+    Stopwatch.tick();
     WXSDKInstance instance = context.getInstance();
     WXDomObject domObject = context.getDomByRef(mRef);
     if (domObject == null) {
@@ -59,6 +63,11 @@ class AddEventAction implements DOMAction, RenderAction {
     }
     domObject.addEvent(mEvent);
     mUpdatedDom = domObject;
+
+    if (WXTracing.isAvailable() && mBeginEvent != null) {
+      submitPerformance("addEventToDom", "X", instance.getInstanceId(), Stopwatch.tack(), Stopwatch.lastTickStamp(), true);
+    }
+
     context.postRenderTask(this);
 
     if (instance != null) {
@@ -73,9 +82,17 @@ class AddEventAction implements DOMAction, RenderAction {
       //sync dom change to component
       Stopwatch.tick();
       comp.updateDom(mUpdatedDom);
-      WXLogUtils.e("Tracing", "updateDom " + Stopwatch.tackAndTick() + " ms");
+      Stopwatch.split("updateDom");
+
       comp.addEvent(mEvent);
-      WXLogUtils.e("Tracing", "addEvent " + Stopwatch.tackAndTick() + " ms");
+      Stopwatch.split("addEventToComponent");
+
+      if (WXTracing.isAvailable() && mBeginEvent != null) {
+        List<Stopwatch.ProcessEvent> events = Stopwatch.getProcessEvents();
+        for (Stopwatch.ProcessEvent event : events) {
+          submitPerformance(event.fname, "X", comp.getInstanceId(), event.duration, event.startMillis, true);
+        }
+      }
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateBodyAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateBodyAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateBodyAction.java
index c7ac391..8c4df7d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateBodyAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateBodyAction.java
@@ -30,6 +30,8 @@ import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.dom.DOMActionContext;
 import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXScroller;
 import com.taobao.weex.utils.WXLogUtils;
@@ -48,6 +50,12 @@ class CreateBodyAction extends AbstractAddElementAction {
 
   @Override
   public void executeDom(DOMActionContext context) {
+    if (WXEnvironment.isApkDebugable()) {
+      WXTracing.TraceEvent execJsEndEvent = WXTracing.newEvent("executeBundleJS", context.getInstanceId(), -1);
+      execJsEndEvent.traceId = context.getInstance().mExecJSTraceId;
+      execJsEndEvent.ph = "E";
+      execJsEndEvent.submit();
+    }
     addDomInternal(context, mData);
   }
 
@@ -58,10 +66,12 @@ class CreateBodyAction extends AbstractAddElementAction {
 
   @Override
   protected void appendDomToTree(DOMActionContext context, WXDomObject domObject) {
+    long startNanos = System.nanoTime();
     String instanceId = context.getInstanceId();
     WXDomObject.prepareRoot(domObject,
         WXViewUtils.getWebPxByWidth(WXViewUtils.getWeexHeight(instanceId), WXSDKManager.getInstanceViewPortWidth(instanceId)),
         WXViewUtils.getWebPxByWidth(WXViewUtils.getWeexWidth(instanceId), WXSDKManager.getInstanceViewPortWidth(instanceId)));
+    domObject.mDomThreadNanos += (System.nanoTime() - startNanos);
   }
 
   @Override
@@ -84,17 +94,24 @@ class CreateBodyAction extends AbstractAddElementAction {
       return;
     }
     try {
+      Stopwatch.tick();
       long start = System.currentTimeMillis();
       component.createView();
       if (WXEnvironment.isApkDebugable()) {
         WXLogUtils.renderPerformanceLog("createView", (System.currentTimeMillis() - start));
+        submitPerformance("createView", "X", instance.getInstanceId(), Stopwatch.tackAndTick(), start, true);
       }
       start = System.currentTimeMillis();
       component.applyLayoutAndEvent(component);
+      if (WXTracing.isAvailable()) {
+        submitPerformance("applyLayoutAndEvent", "X", instance.getInstanceId(), Stopwatch.tackAndTick(), start, true);
+      }
+      start = System.currentTimeMillis();
       component.bindData(component);
 
       if (WXEnvironment.isApkDebugable()) {
         WXLogUtils.renderPerformanceLog("bind", (System.currentTimeMillis() - start));
+        submitPerformance("bindData", "X", instance.getInstanceId(), Stopwatch.tack(), start, true);
       }
 
       if (component instanceof WXScroller) {
@@ -108,6 +125,8 @@ class CreateBodyAction extends AbstractAddElementAction {
         instance.onCreateFinish();
       }
       instance.commitUTStab(IWXUserTrackAdapter.DOM_MODULE, WXErrorCode.WX_SUCCESS);
+      component.mTraceInfo.uiQueueTime = mUIQueueTime;
+      component.onRenderFinish(WXComponent.STATE_ALL_FINISH);
     } catch (Exception e) {
       WXLogUtils.e("create body failed.", e);
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateFinishAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateFinishAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateFinishAction.java
index c92cf11..e581c4e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateFinishAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/CreateFinishAction.java
@@ -25,6 +25,8 @@ import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.common.WXThread;
 import com.taobao.weex.dom.DOMActionContext;
 import com.taobao.weex.dom.RenderActionContext;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 
 /**
  * Created by sospartan on 02/03/2017.
@@ -54,5 +56,9 @@ final class CreateFinishAction extends AbstractLayoutFinishAction {
       instance.onCreateFinish();
     }
     instance.onRenderSuccess(mLayoutWidth, mLayoutHeight);
+    if (WXTracing.isAvailable()) {
+      double renderTime = Stopwatch.millisUntilNow(context.getInstance().mRenderStartNanos);
+      submitPerformance("renderFinish", "X", instance.getInstanceId(), renderTime, System.currentTimeMillis());
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/RefreshFinishAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/RefreshFinishAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/RefreshFinishAction.java
index c46b8d9..2d87d11 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/RefreshFinishAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/RefreshFinishAction.java
@@ -20,6 +20,7 @@ package com.taobao.weex.dom.action;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.dom.RenderActionContext;
+import com.taobao.weex.tracing.WXTracing;
 
 /**
  * Created by sospartan on 02/03/2017.
@@ -31,5 +32,8 @@ class RefreshFinishAction extends AbstractLayoutFinishAction {
   public void executeRender(RenderActionContext context) {
     WXSDKInstance instance = context.getInstance();
     instance.onRefreshSuccess(mLayoutWidth, mLayoutHeight);
+    if (WXTracing.isAvailable()) {
+      submitPerformance("refreshFinish", "I", context.getInstance().getInstanceId(), 0, 0);
+    }
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/TraceableAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/TraceableAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/TraceableAction.java
new file mode 100644
index 0000000..5bd2689
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/TraceableAction.java
@@ -0,0 +1,82 @@
+/**
+ * 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.dom.action;
+
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
+
+/**
+ * Created by moxun on 2017/6/30.
+ */
+
+public class TraceableAction {
+  public int mTracingEventId;
+  public long mStartMillis;
+  public long mDomQueueTime;
+  public long mUIQueueTime;
+  public long mParseJsonNanos = -1;
+  protected WXTracing.TraceEvent mBeginEvent;
+
+  {
+    if (WXTracing.isAvailable()) {
+      mTracingEventId = WXTracing.nextId();
+      mStartMillis = System.currentTimeMillis();
+    }
+  }
+
+  protected WXTracing.TraceEvent submitPerformance(String fname, String ph, String instanceId, double duration, long ts, boolean... isSegment) {
+    if (WXTracing.isAvailable()) {
+      WXTracing.TraceEvent event = WXTracing.newEvent(fname, instanceId, mTracingEventId);
+      event.ts = ts;
+      event.ph = ph;
+      event.duration = duration;
+
+      if (isSegment != null && isSegment.length == 1) {
+        event.isSegment = isSegment[0];
+      }
+
+      event.submit();
+      return event;
+    }
+    return new WXTracing.TraceEvent();
+  }
+
+  public void onStartDomExecute(String instanceId, String fname, String ref, String type, String payload) {
+    if (WXTracing.isAvailable()) {
+      mBeginEvent = WXTracing.newEvent(fname, instanceId, -1);
+      mBeginEvent.traceId = mTracingEventId;
+      mBeginEvent.ts = mStartMillis;
+      mBeginEvent.ph = "B";
+      mBeginEvent.ref = ref;
+      mBeginEvent.name = type;
+      mBeginEvent.payload = payload;
+      mBeginEvent.parseJsonTime = Stopwatch.nanosToMillis(mParseJsonNanos);
+      mBeginEvent.submit();
+    }
+  }
+
+  public void onFinishUIExecute() {
+    if (WXTracing.isAvailable() && mBeginEvent != null) {
+      WXTracing.TraceEvent endEvent = WXTracing.newEvent(getClass().getSimpleName(), mBeginEvent.iid, -1);
+      endEvent.traceId = mBeginEvent.traceId;
+      endEvent.ph = "E";
+      endEvent.submit();
+    }
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateAttributeAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateAttributeAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateAttributeAction.java
index 3db776e..017bb53 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateAttributeAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateAttributeAction.java
@@ -33,7 +33,7 @@ import com.taobao.weex.ui.component.WXComponent;
  * Created by sospartan on 28/02/2017.
  */
 
-class UpdateAttributeAction implements DOMAction, RenderAction {
+class UpdateAttributeAction extends TraceableAction implements DOMAction, RenderAction {
   private final String mRef;
   private final JSONObject mData;
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java b/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
index aa56e70..a4dc8e9 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/action/UpdateStyleAction.java
@@ -39,7 +39,7 @@ import java.util.Map;
  * Created by sospartan on 28/02/2017.
  */
 
-class UpdateStyleAction implements DOMAction, RenderAction {
+class UpdateStyleAction extends TraceableAction implements DOMAction, RenderAction {
   private final String mRef;
   private final JSONObject mData;
   private final boolean mIsCausedByPesudo;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/tracing/Stopwatch.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/tracing/Stopwatch.java b/android/sdk/src/main/java/com/taobao/weex/tracing/Stopwatch.java
new file mode 100644
index 0000000..10b8be2
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/tracing/Stopwatch.java
@@ -0,0 +1,132 @@
+/**
+ * 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.tracing;
+
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Created by moxun on 2017/6/2.
+ */
+
+public class Stopwatch {
+  private static final ThreadLocal<Stopwatch> sThreadLocal = new ThreadLocal<>();
+  private long startNanos;
+  private List<ProcessEvent> splits = new ArrayList<>();
+  private long startMillis;
+
+  private static void prepare() {
+    if (sThreadLocal.get() == null) {
+      sThreadLocal.set(new Stopwatch());
+    }
+  }
+
+  public static void tick() {
+    if (WXTracing.isAvailable()) {
+      try {
+        prepare();
+        if (sThreadLocal.get().startNanos != 0L) {
+          WXLogUtils.w("Stopwatch", "Stopwatch is not reset");
+        }
+        sThreadLocal.get().startNanos = System.nanoTime();
+        sThreadLocal.get().startMillis = System.currentTimeMillis();
+      } catch (Throwable t) {
+        t.printStackTrace();
+      }
+    }
+  }
+
+  public static void split(String fname) {
+    if (WXTracing.isAvailable()) {
+      try {
+        ProcessEvent event = new ProcessEvent();
+        long start = sThreadLocal.get().startMillis;
+        double millis = tackAndTick();
+        event.fname = fname;
+        event.duration = millis;
+        event.startMillis = start;
+        sThreadLocal.get().splits.add(event);
+      } catch (Throwable throwable) {
+        throwable.printStackTrace();
+      }
+    }
+  }
+
+  public static List<ProcessEvent> getProcessEvents() {
+    if (WXTracing.isAvailable()) {
+      tack();
+      List<ProcessEvent> existedEvents = sThreadLocal.get().splits;
+      sThreadLocal.get().splits = new ArrayList<>();
+      return existedEvents;
+    } else {
+      return Collections.emptyList();
+    }
+  }
+
+  public static double tack() {
+    if (WXTracing.isAvailable()) {
+      try {
+        long startNanos = sThreadLocal.get().startNanos;
+        if (startNanos == 0L) {
+          WXLogUtils.w("Stopwatch", "Should call Stopwatch.tick() before Stopwatch.tack() called");
+        }
+        long nanos = System.nanoTime() - startNanos;
+        sThreadLocal.get().startNanos = 0L;
+        return nanosToMillis(nanos);
+      } catch (Throwable throwable) {
+        throwable.printStackTrace();
+      }
+    }
+    return -1;
+  }
+
+  public static long lastTickStamp() {
+    if (WXTracing.isAvailable()) {
+      try {
+        return sThreadLocal.get().startMillis;
+      } catch (Throwable t) {
+        t.printStackTrace();
+      }
+    }
+    return -1;
+  }
+
+  public static double tackAndTick() {
+    double ms = tack();
+    tick();
+    return ms;
+  }
+
+  public static double nanosToMillis(long nanos) {
+    return nanos / 1000000.0;
+  }
+
+  public static double millisUntilNow(long startNanos) {
+    return nanosToMillis(System.nanoTime() - startNanos);
+  }
+
+  public static class ProcessEvent {
+    public String fname;
+    public double duration;
+    public long startMillis;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java b/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
new file mode 100644
index 0000000..7530322
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
@@ -0,0 +1,156 @@
+/**
+ * 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.tracing;
+
+import android.os.Looper;
+import android.util.SparseArray;
+
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.ITracingAdapter;
+import com.taobao.weex.utils.WXLogUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by moxun on 2017/6/6.
+ */
+
+public class WXTracing {
+  private static final AtomicInteger sIdGenerator = new AtomicInteger(0);
+
+  public static int nextId() {
+    return sIdGenerator.getAndIncrement();
+  }
+  
+  public static boolean isAvailable() {
+    return WXEnvironment.isApkDebugable();
+  }
+
+  public static synchronized void submit(TraceEvent event) {
+    ITracingAdapter tracingAdapter = WXSDKManager.getInstance().getTracingAdapter();
+    if (tracingAdapter != null) {
+      if (event.iid == null) {
+        WXLogUtils.w("WXTracing", "Event " + event.fname + " missing instance id");
+      }
+      tracingAdapter.submitTracingEvent(event);
+    }
+  }
+
+  public static class TraceEvent {
+    public String fname;
+    public String tname;
+    public String ph;
+    public int traceId;
+    public long ts;
+    public String iid;
+    public String ref;
+    public String parentRef;
+    public String name;
+    public String classname;
+    public int parentId = -1;
+    public double duration;
+
+    /**
+     * Internal use
+     */
+    public SparseArray<TraceEvent> subEvents;
+    public String payload;
+    public double parseJsonTime;
+    public boolean isSegment;
+    public Map<String, Object> extParams;
+    public boolean firstScreenFinish;
+
+    private boolean submitted;
+
+    public TraceEvent() {
+      ts = System.currentTimeMillis();
+      traceId = nextId();
+      tname = currentThreadName();
+    }
+
+    public JSONObject toJSONObject() {
+      JSONObject object = new JSONObject();
+      try {
+        object.put("parentId", parentId);
+        object.put("ref", ref);
+        object.put("parentRef", parentRef);
+        object.put("className", classname);
+        object.put("ts", ts);
+        object.put("traceId", traceId);
+        object.put("iid", iid);
+        object.put("duration", duration);
+        object.put("fName", fname);
+        object.put("ph", ph);
+        object.put("name", name);
+        object.put("tName", tname);
+      } catch (JSONException e) {
+        e.printStackTrace();
+      }
+      return object;
+    }
+
+    public void submit() {
+      if (!submitted) {
+        submitted = true;
+        WXTracing.submit(this);
+      } else {
+        WXLogUtils.w("WXTracing", "Event " + traceId + " has been submitted.");
+      }
+    }
+  }
+
+  public static String currentThreadName() {
+    Thread thread = Thread.currentThread();
+    String name = thread.getName();
+
+    if ("WeexJSBridgeThread".equals(name)) {
+      return "JSThread";
+    } else if ("WeeXDomThread".equals(name)) {
+      return "DOMThread";
+    } else if (Looper.getMainLooper() == Looper.myLooper()) {
+      return "UIThread";
+    }
+
+    return name;
+  }
+
+  public static TraceEvent newEvent(String fname, String instanceId, int parentId) {
+    WXTracing.TraceEvent traceEvent = new TraceEvent();
+    traceEvent.fname = fname;
+    traceEvent.iid = instanceId;
+    traceEvent.traceId = WXTracing.nextId();
+    traceEvent.parentId = parentId;
+    return traceEvent;
+  }
+
+  public static class TraceInfo {
+    public int rootEventId;
+    public long domQueueTime;
+    public long uiQueueTime;
+    public long domThreadStart = -1;
+    public long domThreadNanos;
+    public long uiThreadStart = -1;
+    public long uiThreadNanos;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
index 77e1b1b..edcc560 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/WXRenderManager.java
@@ -18,18 +18,21 @@
  */
 package com.taobao.weex.ui;
 
+import android.os.SystemClock;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
 
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
-import com.taobao.weex.common.WXTracing;
 import com.taobao.weex.dom.RenderAction;
 import com.taobao.weex.dom.RenderActionContext;
 import com.taobao.weex.dom.WXDomObject;
+import com.taobao.weex.dom.action.AbstractAddElementAction;
+import com.taobao.weex.dom.action.TraceableAction;
+import com.taobao.weex.tracing.Stopwatch;
+import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 
 import java.util.ArrayList;
@@ -104,18 +107,33 @@ public class WXRenderManager {
   }
 
   public void runOnThread(final String instanceId, final RenderAction action) {
-    final long start = System.nanoTime();
-    final String actionName = WXTracing.getFunctionName(action.getClass());
+    final long start = SystemClock.uptimeMillis();
     mWXRenderHandler.post(WXThread.secure(new Runnable() {
       @Override
       public void run() {
-        long s = System.nanoTime();
-        WXLogUtils.e("Tracing", "Method " + actionName + ", Queue time " + (s - start) + " ns");
         if (mRegistries.get(instanceId) == null) {
           return;
         }
+        if (WXTracing.isAvailable() && action instanceof TraceableAction) {
+          ((TraceableAction) action).mUIQueueTime = SystemClock.uptimeMillis() - start;
+        }
+
+        long start = System.currentTimeMillis();
+        long uiNanos = System.nanoTime();
         action.executeRender(getRenderContext(instanceId));
-        WXLogUtils.e("Tracing", "Method " + actionName + ", Render time " + (System.nanoTime() - s) + " ns");
+
+        if (WXTracing.isAvailable()) {
+          uiNanos = System.nanoTime() - uiNanos;
+          if (action instanceof TraceableAction) {
+            if (!(action instanceof AbstractAddElementAction)) {
+              WXTracing.TraceEvent uiExecuteEvent = WXTracing.newEvent("UIExecute", instanceId, ((TraceableAction) action).mTracingEventId);
+              uiExecuteEvent.duration = Stopwatch.nanosToMillis(uiNanos);
+              uiExecuteEvent.ts = start;
+              uiExecuteEvent.submit();
+            }
+            ((TraceableAction) action).onFinishUIExecute();
+          }
+        }
       }
     }));
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/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 cc44e79..9864b1e 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
@@ -31,6 +31,7 @@ import android.os.Build;
 import android.os.Message;
 import android.support.annotation.CallSuper;
 import android.support.annotation.CheckResult;
+import android.support.annotation.IntDef;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.view.ViewCompat;
@@ -76,6 +77,10 @@ import com.taobao.weex.utils.WXResourceUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -1556,16 +1561,49 @@ public abstract class  WXComponent<T extends View> implements IWXObject, IWXActi
     WXSDKManager.getInstance().getWXDomManager().sendMessage(message);
   }
 
-  public void onRenderFinish() {
-    if (isLazy()) {
-      return;
+  public static final int STATE_DOM_FINISH = 0;
+  public static final int STATE_UI_FINISH = 1;
+  public static final int STATE_ALL_FINISH = 2;
+  @IntDef({STATE_DOM_FINISH, STATE_UI_FINISH, STATE_ALL_FINISH})
+  @Retention(RetentionPolicy.SOURCE)
+  @Target(ElementType.PARAMETER)
+  public @interface RenderState {}
+
+  @CallSuper
+  public void onRenderFinish(@RenderState int state) {
+    if (WXTracing.isAvailable()) {
+      double domTime = Stopwatch.nanosToMillis(((WXDomObject) mDomObj).mDomThreadNanos + mTraceInfo.domThreadNanos);
+      double uiTime = Stopwatch.nanosToMillis(mTraceInfo.uiThreadNanos);
+      if (state == STATE_ALL_FINISH || state == STATE_DOM_FINISH) {
+        WXTracing.TraceEvent domEvent = WXTracing.newEvent("DomExecute", getInstanceId(), mTraceInfo.rootEventId);
+        domEvent.ph = "X";
+        domEvent.duration = domTime;
+        domEvent.ts = mTraceInfo.domThreadStart;
+        domEvent.tname = "DOMThread";
+        domEvent.name = getDomObject().getType();
+        domEvent.classname = getClass().getSimpleName();
+        if (getParent() != null) {
+          domEvent.parentRef = getParent().getRef();
+        }
+        domEvent.submit();
+      }
+
+      if (state == STATE_ALL_FINISH || state == STATE_UI_FINISH) {
+        if (mTraceInfo.uiThreadStart != -1) {
+          WXTracing.TraceEvent uiEvent = WXTracing.newEvent("UIExecute", getInstanceId(), mTraceInfo.rootEventId);
+          uiEvent.ph = "X";
+          uiEvent.duration = uiTime;
+          uiEvent.ts = mTraceInfo.uiThreadStart;
+          uiEvent.name = getDomObject().getType();
+          uiEvent.classname = getClass().getSimpleName();
+          if (getParent() != null) {
+            uiEvent.parentRef = getParent().getRef();
+          }
+          uiEvent.submit();
+        } else {
+          WXLogUtils.w("onRenderFinish", "createView() not called");
+        }
+      }
     }
-    double domTime = Stopwatch.nanosToMillis(((WXDomObject) mDomObj).mDomThreadNanos + mTraceInfo.domThreadNanos);
-    double uiTime = Stopwatch.nanosToMillis(mTraceInfo.uiThreadNanos);
-    WXLogUtils.e("RenderFinish", "Ref: " + getRef() + ", type: " + mDomObj.getType() + ", dom: " + mTraceInfo.domQueueTime + "/" + domTime + ", ui: " + mTraceInfo.uiQueueTime + "/" + uiTime);
-    WXTracing.TraceEvent domEvent = WXTracing.measureAndSubmit("dom " + mDomObj.getType() + "@" + getRef(), "X", mTraceInfo.rootEventId, getInstanceId(), domTime);
-    domEvent.ts = mTraceInfo.domThreadStart;
-    domEvent.tname = "DOMThread";
-    WXTracing.measureAndSubmit("ui " + mDomObj.getType() + "@" + getRef(), "X", mTraceInfo.rootEventId, getInstanceId(), uiTime).ts = mTraceInfo.uiThreadStart;
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/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 afdad86..871b18a 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
@@ -93,6 +93,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
 
   @Override
   public void applyLayoutAndEvent(WXComponent component) {
+    long startNanos = System.nanoTime();
     if(!isLazy()) {
       if (component == null) {
         component = this;
@@ -105,6 +106,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
       }
 
     }
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   /**
@@ -141,6 +143,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
   }
   @Override
   public void bindData(WXComponent component) {
+    long startNanos = System.nanoTime();
     if(!isLazy()) {
       if (component == null) {
         component = this;
@@ -151,6 +154,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
         getChild(i).bindData(((WXVContainer)component).getChild(i));
       }
     }
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   @Override
@@ -240,6 +244,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
   }
 
   public void addChild(WXComponent child, int index) {
+    long startNanos = System.nanoTime();
     if (child == null || index < -1) {
       return;
     }
@@ -250,6 +255,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
     } else {
       mChildren.add(index, child);
     }
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   public final int indexOf(WXComponent comp){
@@ -257,6 +263,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
   }
 
   public void createChildViewAt(int index){
+    long startNanos = System.nanoTime();
     int indexToCreate = index;
     if(indexToCreate < 0){
       indexToCreate = childCount()-1;
@@ -269,6 +276,7 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
     if(!child.isVirtualComponent()){
       addSubView(child.getHostView(),indexToCreate);
     }
+    mTraceInfo.uiThreadNanos += (System.nanoTime() - startNanos);
   }
 
   protected void addSubView(View child, int index) {
@@ -429,6 +437,16 @@ public abstract class WXVContainer<T extends ViewGroup> extends WXComponent<T> {
     }
   }
 
+  @Override
+  public void onRenderFinish(@RenderState int state) {
+    for (int i = 0; i < getChildCount(); i++) {
+      WXComponent child = getChild(i);
+      child.mTraceInfo.uiQueueTime = mTraceInfo.uiQueueTime;
+      child.onRenderFinish(state);
+    }
+    super.onRenderFinish(state);
+  }
+
   /********************************
    *  end hook Activity life cycle callback
    ********************************************************/

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
index 9418a1f..08c6c8e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
@@ -850,7 +850,7 @@ public abstract class BasicListComponent<T extends ViewGroup & ListComponentView
     if (holder.getComponent() != null && holder.getComponent() instanceof WXCell) {
       if(holder.isRecycled()) {
         holder.bindData(component);
-        component.onRenderFinish();
+        component.onRenderFinish(STATE_UI_FINISH);
       }
       if (mDragHelper == null || !mDragHelper.isDraggable()) {
         return;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
index 1107003..43246ea 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
@@ -35,13 +35,12 @@ public class WXLogUtils {
   public static final String WEEX_TAG = "weex";
   public static final String WEEX_PERF_TAG = "weex_perf";
 
-  public static boolean isShowLineNumber = false;
-
   private static final String CLAZZ_NAME_DEBUG_TOOL = "com.taobao.weex.WXDebugTool";
   private static final String CLAZZ_NAME_LOG_UTIL = "com.taobao.weex.devtools.common.LogUtil";
 
   private static StringBuilder builder = new StringBuilder(50);
   private static HashMap<String, Class> clazzMaps = new HashMap<>(2);
+  private static JsLogWatcher jsLogWatcher;
 
   static {
     clazzMaps.put(CLAZZ_NAME_DEBUG_TOOL, loadClass(CLAZZ_NAME_DEBUG_TOOL));
@@ -65,14 +64,13 @@ public class WXLogUtils {
     if (WXEnvironment.isApkDebugable() || WXEnvironment.isPerf()) {
       builder.setLength(0);
       builder.append("[render time]").append(type).append(":").append(time);
-      Log.d(WEEX_PERF_TAG, getLineNumber() + builder.substring(0));
+      Log.d(WEEX_PERF_TAG, builder.substring(0));
       writeConsoleLog("debug", builder.substring(0));
     }
   }
 
   private static void log(String tag, String msg, LogLevel level){
     if (WXEnvironment.isApkDebugable() && msg != null && WXEnvironment.sLogLevel.compare(level) >= 0) {
-      msg = getLineNumber() + msg;
       Log.println(level.getPriority(),tag, msg);
       writeConsoleLog(level.getName(), msg);
       sendLog(level, msg);
@@ -109,8 +107,22 @@ public class WXLogUtils {
 
   public static void d(String tag, String msg) {
     if (WXEnvironment.isApkDebugable() && !TextUtils.isEmpty(msg) && WXEnvironment.sLogLevel.compare(LogLevel.DEBUG) >= 0) {
-      msg = getLineNumber() + msg;
       Log.d(tag, msg);
+
+      if ("jsLog".equals(tag) && jsLogWatcher != null) {
+        if (msg.endsWith("__DEBUG")) {
+          jsLogWatcher.onJsLog(Log.DEBUG, msg.replace("__DEBUG", ""));
+        } else if (msg.endsWith("__INFO")) {
+          jsLogWatcher.onJsLog(Log.DEBUG, msg.replace("__INFO", ""));
+        } else if (msg.endsWith("__WARN")) {
+          jsLogWatcher.onJsLog(Log.DEBUG, msg.replace("__WARN", ""));
+        } else if (msg.endsWith("__ERROR")) {
+          jsLogWatcher.onJsLog(Log.DEBUG, msg.replace("__ERROR", ""));
+        } else {
+          jsLogWatcher.onJsLog(Log.DEBUG, msg);
+        }
+      }
+
       /** This log method will be invoked from jni code, so try to extract loglevel from message. **/
       writeConsoleLog("debug", tag + ":" + msg);
       if(msg.contains(" | __")){
@@ -268,22 +280,11 @@ public class WXLogUtils {
     }
   }
 
-  /**
-   * Why the index is 2 ?
-   * StackTrace:
-   * 0 = com.taobao.weex.utils.WXLogUtils.getLineNumber
-   * 1 = com.taobao.weex.utils.WXLogUtils#x
-   * 2 = the actual caller
-   * …… more stack trace element
-   * */
-  private static String getLineNumber() {
-    if (!isShowLineNumber) {
-      return "";
-    }
-    StackTraceElement[] stackTrace = new Throwable().getStackTrace();
-    final int index = 2;
-    String className = stackTrace[index].getFileName();
-    int lineNum = stackTrace[index].getLineNumber();
-    return "(" + className + ":" + lineNum + ") ";
+  public static void setJsLogWatcher(JsLogWatcher watcher) {
+    jsLogWatcher = watcher;
+  }
+
+  public interface JsLogWatcher {
+    void onJsLog(int level, String log);
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/102f2ed0/android/sdk/src/test/java/com/taobao/weex/utils/WXLogUtilsTest.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/test/java/com/taobao/weex/utils/WXLogUtilsTest.java b/android/sdk/src/test/java/com/taobao/weex/utils/WXLogUtilsTest.java
index ece6e0e..3fde10a 100644
--- a/android/sdk/src/test/java/com/taobao/weex/utils/WXLogUtilsTest.java
+++ b/android/sdk/src/test/java/com/taobao/weex/utils/WXLogUtilsTest.java
@@ -46,7 +46,6 @@ public class WXLogUtilsTest {
 
   @Before
   public void setUp() throws Exception {
-    WXLogUtils.isShowLineNumber = true;
     PowerMockito.mockStatic(WXEnvironment.class);
     PowerMockito.when(WXEnvironment.isApkDebugable()).thenReturn(true);
   }



[11/16] incubator-weex git commit: Revert: * [android] fix Jni crash due to emoji

Posted by mi...@apache.org.
Revert: * [android] fix Jni crash due to emoji


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

Branch: refs/heads/0.16-dev
Commit: 4b0a600e8e5c24e7f6434a7c66512e51f5bbf781
Parents: d258736
Author: misakuo <mi...@apache.org>
Authored: Thu Aug 10 14:57:03 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Thu Aug 10 14:57:03 2017 +0800

----------------------------------------------------------------------
 android/sdk/libs/armeabi/libweexjsc.so | Bin 7570392 -> 7570504 bytes
 android/sdk/libs/x86/libweexjsc.so     | Bin 7570392 -> 12121924 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4b0a600e/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
index a365bed..41b1ee8 100755
Binary files a/android/sdk/libs/armeabi/libweexjsc.so and b/android/sdk/libs/armeabi/libweexjsc.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4b0a600e/android/sdk/libs/x86/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjsc.so b/android/sdk/libs/x86/libweexjsc.so
index a365bed..c45672a 100755
Binary files a/android/sdk/libs/x86/libweexjsc.so and b/android/sdk/libs/x86/libweexjsc.so differ


[15/16] incubator-weex git commit: * [android] make WXSDKManager#setIWXJSExceptionAdapter public

Posted by mi...@apache.org.
* [android] make WXSDKManager#setIWXJSExceptionAdapter public


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

Branch: refs/heads/0.16-dev
Commit: 71b0792e2208d631f80704443eaf4f72a015f727
Parents: 6743256
Author: misakuo <mi...@apache.org>
Authored: Tue Aug 15 11:11:50 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Tue Aug 15 11:11:50 2017 +0800

----------------------------------------------------------------------
 android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/71b0792e/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 10b1873..e6511d4 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -322,7 +322,7 @@ public class WXSDKManager {
     return mIWXJSExceptionAdapter;
   }
 
-  void setIWXJSExceptionAdapter(IWXJSExceptionAdapter IWXJSExceptionAdapter) {
+  public void setIWXJSExceptionAdapter(IWXJSExceptionAdapter IWXJSExceptionAdapter) {
     mIWXJSExceptionAdapter = IWXJSExceptionAdapter;
   }
 


[05/16] incubator-weex git commit: * [android] add PerformanceActivity

Posted by mi...@apache.org.
* [android] add PerformanceActivity


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

Branch: refs/heads/0.16-dev
Commit: e2d8a7b1e6a42a7191b23def69b10a572e48280e
Parents: afeedd9
Author: misakuo <mi...@apache.org>
Authored: Tue Jul 25 16:08:58 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Tue Jul 25 16:08:58 2017 +0800

----------------------------------------------------------------------
 .../com/alibaba/weex/PerformanceActivity.java   | 121 +++++++++++++++++++
 1 file changed, 121 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/e2d8a7b1/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java b/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java
new file mode 100644
index 0000000..ad88546
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/PerformanceActivity.java
@@ -0,0 +1,121 @@
+package com.alibaba.weex;
+
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.alibaba.weex.performance.EnvironmentFragment;
+import com.alibaba.weex.performance.EventOverviewFragment;
+
+public class PerformanceActivity extends WXBaseActivity {
+
+  private LinearLayout segmentHost;
+
+  public static void start(Context context, int instanceId) {
+    Intent intent = new Intent(context, PerformanceActivity.class);
+    intent.putExtra("instanceId", instanceId);
+    context.startActivity(intent);
+  }
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    setContentView(R.layout.activity_performance);
+    segmentHost = (LinearLayout) findViewById(R.id.segment_control);
+    addTab("页面性能", true, new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        switchFragment(EventOverviewFragment.getInstance(getIntent().getIntExtra("instanceId", -1)));
+      }
+    });
+
+    addTab("DOM树", false, new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+
+      }
+    });
+
+    addTab("JS LOG", false, new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+
+      }
+    });
+
+    addTab("环境变量", false, new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        switchFragment(new EnvironmentFragment());
+      }
+    });
+  }
+
+  private void switchFragment(Fragment fragment) {
+    getSupportFragmentManager()
+        .beginTransaction()
+        .replace(R.id.fragment_container, fragment)
+        .commitAllowingStateLoss();
+  }
+
+  @Override
+  protected void onResumeFragments() {
+    super.onResumeFragments();
+    FragmentManager fragmentManager = getSupportFragmentManager();
+
+    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
+    if (fragment == null) {
+      fragmentManager
+          .beginTransaction()
+          .add(R.id.fragment_container, EventOverviewFragment.getInstance(getIntent().getIntExtra("instanceId", -1)))
+          .commitAllowingStateLoss();
+    }
+  }
+
+  private void addTab(String title, final boolean selected, final View.OnClickListener listener) {
+    final TextView textView = new TextView(this);
+    textView.setText(title);
+    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+    lp.weight = 1;
+    lp.setMargins(1, 1, 1, 1);
+    if (selected) {
+      textView.setBackgroundColor(Color.TRANSPARENT);
+    } else {
+      textView.setBackgroundColor(Color.WHITE);
+    }
+    textView.setGravity(Gravity.CENTER);
+    textView.setLayoutParams(lp);
+    textView.setOnClickListener(new View.OnClickListener() {
+      @Override
+      public void onClick(View v) {
+        if (!v.isSelected() && v instanceof TextView) {
+          listener.onClick(v);
+          for (int i = 0; i < segmentHost.getChildCount(); i++) {
+            segmentHost.getChildAt(i).setSelected(false);
+            segmentHost.getChildAt(i).setBackgroundColor(Color.WHITE);
+            ((TextView) segmentHost.getChildAt(i)).setTextColor(Color.parseColor("#1E90FF"));
+          }
+          v.setSelected(true);
+          v.setBackgroundColor(Color.TRANSPARENT);
+          ((TextView) v).setTextColor(Color.WHITE);
+        }
+      }
+    });
+    textView.setSelected(selected);
+    if (selected) {
+      textView.setTextColor(Color.WHITE);
+    } else {
+      textView.setTextColor(Color.parseColor("#1E90FF"));
+    }
+    segmentHost.addView(textView);
+  }
+}


[16/16] incubator-weex git commit: Merge remote-tracking branch 'upstream/pr586' into apache-0.16-dev

Posted by mi...@apache.org.
Merge remote-tracking branch 'upstream/pr586' into apache-0.16-dev

# Conflicts:
#	android/sdk/libs/x86/libweexjsc.so


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

Branch: refs/heads/0.16-dev
Commit: 20741567969ef7910df7492b7ac6319318c6613c
Parents: 71b0792 57802c0
Author: misakuo <mi...@apache.org>
Authored: Tue Aug 15 17:32:22 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Tue Aug 15 17:32:22 2017 +0800

----------------------------------------------------------------------
 .travis.yml                                     |     8 +-
 android/build.gradle                            |     8 +-
 android/sdk/libs/x86/libweexjsc.so              |   Bin 12121924 -> 12121924 bytes
 .../java/com/taobao/weex/common/Constants.java  |     3 +
 .../java/com/taobao/weex/dom/WXDomObject.java   |    15 +-
 .../com/taobao/weex/dom/WXTextDomObject.java    |    91 +-
 .../taobao/weex/dom/action/AnimationAction.java |     1 +
 .../weex/dom/action/GetComponentRectAction.java |    12 +
 .../ui/animation/CameraDistanceProperty.java    |    54 +
 .../weex/ui/animation/WXAnimationBean.java      |    86 +-
 .../ui/component/AbstractEditComponent.java     |     2 +-
 .../weex/ui/component/ContentMeasurable.java    |    29 +
 .../taobao/weex/ui/component/WXComponent.java   |    16 -
 .../taobao/weex/ui/component/WXScroller.java    |    16 +-
 .../com/taobao/weex/ui/component/WXSlider.java  |     4 +-
 .../ui/component/list/BasicListComponent.java   |    18 +-
 .../java/com/taobao/weex/utils/WXViewUtils.java |     4 +-
 doc/source/_posts/arkit.md                      |   112 +
 doc/source/_posts/cn/hello.md                   |     6 -
 doc/source/_posts/hello_world.md                |     7 -
 doc/source/_posts/test.md                       |    14 -
 doc/source/cn/blog/index.md                     |     4 -
 .../cn/references/advanced/extend-to-ios.md     |     4 +-
 .../advanced/integrate-devtool-to-android.md    |    86 +-
 doc/source/cn/references/common-style.md        |     2 +
 doc/source/cn/references/components/text.md     |     4 +-
 doc/source/cn/references/modules/animation.md   |     2 +-
 doc/source/references/advanced/extend-to-ios.md |     5 +-
 doc/source/references/common-style.md           |     2 +
 doc/source/references/components/text.md        |     4 +-
 doc/source/references/modules/animation.md      |     2 +-
 doc/themes/weex/layout/_partial/header.ejs      |     1 +
 .../weex/layout/_partial/post/summary.ejs       |     1 +
 doc/themes/weex/source/css/blog.scss            |     3 +
 doc/themes/weex/source/css/media-queries.scss   |     1 +
 doc/themes/weex/source/css/partial/header.scss  |     6 +-
 examples/vue/modules/websocket.vue              |    22 +-
 html5/runtime/normalize.js                      |    13 +-
 html5/runtime/task-center.js                    |     6 +-
 .../WeexDemo.xcodeproj/project.pbxproj          |     6 +
 ios/playground/WeexDemo/AppDelegate.m           |     2 +-
 .../WeexDemo/WXExtendCallNativeTest.h           |    25 +
 .../WeexDemo/WXExtendCallNativeTest.m           |    47 +
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj       |    56 +-
 .../WeexSDK/Sources/Bridge/WXBridgeContext.m    |    35 +-
 ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m |    23 +-
 .../Sources/Component/WXComponent_internal.h    |    12 +
 .../WeexSDK/Sources/Component/WXListComponent.m |     4 +-
 .../Sources/Component/WXScrollerComponent.m     |     3 +-
 .../WeexSDK/Sources/Component/WXTextComponent.m |     5 +-
 ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.h     |     4 +
 ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.m     |    10 +
 .../Sources/Display/WXComponent+Display.m       |    16 +-
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h    |    10 +
 ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.m    |     6 +
 .../WeexSDK/Sources/Layout/WXComponent+Layout.m |     3 +-
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.h  |     2 +-
 .../WeexSDK/Sources/Loader/WXWebSocketLoader.m  |     2 +-
 .../WeexSDK/Sources/Manager/WXBridgeManager.m   |     4 +
 .../Sources/Manager/WXComponentFactory.h        |     1 +
 .../Sources/Manager/WXComponentFactory.m        |    23 +
 .../Sources/Manager/WXComponentManager.m        |    18 +-
 .../Sources/Manager/WXExtendCallNativeManager.h |    26 +
 .../Sources/Manager/WXExtendCallNativeManager.m |    80 +
 .../WeexSDK/Sources/Manager/WXModuleFactory.h   |     6 +
 .../WeexSDK/Sources/Manager/WXModuleFactory.m   |    24 +
 .../WeexSDK/Sources/Manager/WXTracingManager.h  |    33 +-
 .../WeexSDK/Sources/Manager/WXTracingManager.m  |   169 +-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     |    68 +-
 ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m   |     6 +-
 .../WeexSDK/Sources/Module/WXAnimationLayout.h  |    49 -
 .../WeexSDK/Sources/Module/WXAnimationLayout.m  |   115 -
 .../WeexSDK/Sources/Module/WXAnimationModule.h  |     2 +
 .../WeexSDK/Sources/Module/WXAnimationModule.m  |    88 +-
 ios/sdk/WeexSDK/Sources/Module/WXStreamModule.m |    13 +
 ios/sdk/WeexSDK/Sources/Module/WXTransition.h   |    43 +
 ios/sdk/WeexSDK/Sources/Module/WXTransition.m   |   311 +
 .../WeexSDK/Sources/Module/WXWebSocketModule.m  |    16 +-
 ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.m     |     9 +
 .../Sources/Protocol/WXAppMonitorProtocol.h     |     2 +
 .../Protocol/WXExtendCallNativeProtocol.h       |    47 +
 .../Sources/Protocol/WXTracingProtocol.h        |    29 +
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.m     |     3 +-
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.h     |    12 +
 ios/sdk/WeexSDK/Sources/Utility/WXUtility.m     |    22 +
 .../Sources/View/WXComponent+ViewManagement.m   |     1 -
 .../Sources/WebSocket/WXWebSocketDefaultImpl.m  |     2 +-
 ios/sdk/WeexSDK/Sources/WeexSDK.h               |     2 +
 package.json                                    |     4 +-
 packages/weex-js-framework/index.js             | 16073 +++++++++--------
 packages/weex-js-framework/index.min.js         |     2 +-
 packages/weex-js-framework/package.json         |     2 +-
 packages/weex-js-runtime/index.js               |  1436 +-
 packages/weex-js-runtime/index.min.js           |     2 +-
 packages/weex-js-runtime/index.min.js.gz        |   Bin 12588 -> 13215 bytes
 packages/weex-js-runtime/package.json           |     2 +-
 pre-build/native-bundle-main.js                 |    16 +-
 test/run.sh                                     |    18 +-
 98 files changed, 11020 insertions(+), 8704 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/20741567/android/sdk/src/main/java/com/taobao/weex/dom/WXDomObject.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/20741567/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponent.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/20741567/android/sdk/src/main/java/com/taobao/weex/ui/component/list/BasicListComponent.java
----------------------------------------------------------------------


[13/16] incubator-weex git commit: * [android] remove some methods

Posted by mi...@apache.org.
* [android] remove some methods


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

Branch: refs/heads/0.16-dev
Commit: 1f028a6614266874eaa81304a5859aa4d16a9656
Parents: b80a7b5
Author: misakuo <mi...@apache.org>
Authored: Mon Aug 14 14:48:26 2017 +0800
Committer: misakuo <mi...@apache.org>
Committed: Mon Aug 14 14:48:26 2017 +0800

----------------------------------------------------------------------
 .../taobao/weex/dom/DOMActionContextImpl.java   |  2 +-
 .../java/com/taobao/weex/tracing/WXTracing.java | 27 --------------------
 2 files changed, 1 insertion(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1f028a66/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
index d18cea8..5a2e88d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/dom/DOMActionContextImpl.java
@@ -180,7 +180,7 @@ class DOMActionContextImpl implements DOMActionContext {
 
     if (WXTracing.isAvailable()) {
       WXTracing.TraceEvent batchEvent = WXTracing.newEvent("domBatch", mInstanceId, -1);
-      batchEvent.duration = Stopwatch.nanosToMillis(System.nanoTime() - startNanos);
+      batchEvent.duration = Stopwatch.millisUntilNow(startNanos);
       batchEvent.ts = start;
       batchEvent.ph = "X";
       WXTracing.submit(batchEvent);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1f028a66/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java b/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
index 7530322..da1fc4f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
+++ b/android/sdk/src/main/java/com/taobao/weex/tracing/WXTracing.java
@@ -26,9 +26,6 @@ import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.adapter.ITracingAdapter;
 import com.taobao.weex.utils.WXLogUtils;
 
-import org.json.JSONException;
-import org.json.JSONObject;
-
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -50,9 +47,6 @@ public class WXTracing {
   public static synchronized void submit(TraceEvent event) {
     ITracingAdapter tracingAdapter = WXSDKManager.getInstance().getTracingAdapter();
     if (tracingAdapter != null) {
-      if (event.iid == null) {
-        WXLogUtils.w("WXTracing", "Event " + event.fname + " missing instance id");
-      }
       tracingAdapter.submitTracingEvent(event);
     }
   }
@@ -89,27 +83,6 @@ public class WXTracing {
       tname = currentThreadName();
     }
 
-    public JSONObject toJSONObject() {
-      JSONObject object = new JSONObject();
-      try {
-        object.put("parentId", parentId);
-        object.put("ref", ref);
-        object.put("parentRef", parentRef);
-        object.put("className", classname);
-        object.put("ts", ts);
-        object.put("traceId", traceId);
-        object.put("iid", iid);
-        object.put("duration", duration);
-        object.put("fName", fname);
-        object.put("ph", ph);
-        object.put("name", name);
-        object.put("tName", tname);
-      } catch (JSONException e) {
-        e.printStackTrace();
-      }
-      return object;
-    }
-
     public void submit() {
       if (!submitted) {
         submitted = true;