You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/04/28 06:54:08 UTC

[40/48] incubator-weex git commit: * [android] Merge WeexCore-master to master.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/build.gradle
----------------------------------------------------------------------
diff --git a/android/sdk/build.gradle b/android/sdk/build.gradle
index 7e05943..f277443 100755
--- a/android/sdk/build.gradle
+++ b/android/sdk/build.gradle
@@ -1,10 +1,6 @@
 buildscript {
-    repositories {
-        mavenCentral()
-    }
-
     dependencies {
-        classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.7.3'
+        classpath 'com.android.tools.build:gradle:2.3.3'
         classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.5.0'
     }
 }
@@ -15,7 +11,6 @@ plugins {
 
 apply plugin: 'com.android.library'
 apply plugin: 'checkstyle'
-apply plugin: 'com.getkeepsafe.dexcount'
 
 ext.disableCov = project.hasProperty('disableCov') ? project.getProperty('disableCov') : 'false'
 if(!disableCov.toBoolean()){
@@ -40,13 +35,17 @@ checkstyle {
     toolVersion = '6.9'
 }
 
-version = "0.18.0-beta-3"
+
+version = "Devtool-WeexCore-1.0.3-SNAPSHOT"
 
 android {
+
+    publishNonDefault true
     compileSdkVersion project.compileSdkVersion
     buildToolsVersion project.buildToolsVersion
     resourcePrefix "weex"
 
+    delete 'libs/armeabi/libweexjsc.so'
     useLibrary 'org.apache.http.legacy'
     copy {
         from '../../pre-build'
@@ -57,7 +56,7 @@ android {
     def line
     new File(projectDir,"assets/main.js").withReader { line = it.readLine() }
     def m = line =~ /[A-Z\s]+\s+([0-9\.]+),\s+Build\s+[0-9]+/;
-    def jsfmVersion = m[0][1]
+    def jsfmVersion // = m[0][1]
     println jsfmVersion
 
     copy {
@@ -92,7 +91,6 @@ android {
     println "ARMEABI_Size: "+ARMEABI_Size;
     println "X86_Size:" + X86_Size;
 
-
     defaultConfig {
         buildConfigField "long", "ARMEABI_Size", "${ARMEABI_Size}"
         buildConfigField "long", "X86_Size", "${X86_Size}"
@@ -100,22 +98,43 @@ android {
         buildConfigField "String", "buildVersion", "\"${version}\""
         minSdkVersion 14
         targetSdkVersion project.targetSdkVersion
+
+        multiDexEnabled true
+
         versionCode 1
         versionName "1.0"
         ndk {
             abiFilters "armeabi","x86"
         }
+
+        externalNativeBuild {
+            cmake {
+                arguments '-DANDROID_PLATFORM=android-19',
+                        '-DANDROID_TOOLCHAIN=gcc',
+                        '-DANDROID_STL=c++_static'
+            }
+        }
     }
     buildTypes {
         release {
             minifyEnabled false
+            testCoverageEnabled true
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
             buildConfigField "boolean", "ENABLE_TRACE", "false"
+            consumerProguardFiles 'proguard-rules.pro'
         }
 
         debug {
-            testCoverageEnabled true
             buildConfigField "boolean", "ENABLE_TRACE", "true"
+            jniDebuggable true
+            debuggable true
+            consumerProguardFiles 'proguard-rules.pro'
+        }
+    }
+
+    externalNativeBuild {
+        cmake {
+            path '../../weex_core/CMakeLists.txt'
         }
     }
 
@@ -140,7 +159,6 @@ android {
         targetCompatibility JavaVersion.VERSION_1_7
     }
     testOptions {
-        unitTests.returnDefaultValues = true
         unitTests.all {
             maxHeapSize = "1024m"
             jvmArgs += ['-XX:-UseSplitVerifier', '-noverify','-Xverify:none']/* fix VerifyError  */
@@ -179,4 +197,4 @@ if(file('../license/LICENSE').exists()){
         excludes(["com/taobao/weex/dom/flex/*.java"])
     }
     preBuild.dependsOn licenseFormat
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/gradle/wrapper/gradle-wrapper.jar
----------------------------------------------------------------------
diff --git a/android/sdk/gradle/wrapper/gradle-wrapper.jar b/android/sdk/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..b5166da
Binary files /dev/null and b/android/sdk/gradle/wrapper/gradle-wrapper.jar differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/gradle/wrapper/gradle-wrapper.properties
----------------------------------------------------------------------
diff --git a/android/sdk/gradle/wrapper/gradle-wrapper.properties b/android/sdk/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..d649982
--- /dev/null
+++ b/android/sdk/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed May 03 18:06:49 CST 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=http://gw.alicdn.com/bao/uploaded/LB1J5WLJVXXXXcMXpXXXXXXXXXX.zip

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
deleted file mode 100755
index 96fe1c2..0000000
Binary files a/android/sdk/libs/armeabi/libweexjsc.so and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/libs/armeabi/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjss.so b/android/sdk/libs/armeabi/libweexjss.so
index f91f45a..719678e 100755
Binary files a/android/sdk/libs/armeabi/libweexjss.so and b/android/sdk/libs/armeabi/libweexjss.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/libs/x86/libweexjsb.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjsb.so b/android/sdk/libs/x86/libweexjsb.so
old mode 100755
new mode 100644

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/libs/x86/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjsc.so b/android/sdk/libs/x86/libweexjsc.so
deleted file mode 100755
index b86a821..0000000
Binary files a/android/sdk/libs/x86/libweexjsc.so and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/libs/x86/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjss.so b/android/sdk/libs/x86/libweexjss.so
old mode 100755
new mode 100644
index fc8e5f6..9a4f570
Binary files a/android/sdk/libs/x86/libweexjss.so and b/android/sdk/libs/x86/libweexjss.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/proguard-rules.pro
----------------------------------------------------------------------
diff --git a/android/sdk/proguard-rules.pro b/android/sdk/proguard-rules.pro
index 2814dc7..73247bc 100755
--- a/android/sdk/proguard-rules.pro
+++ b/android/sdk/proguard-rules.pro
@@ -16,4 +16,7 @@
 #   public *;
 #}
 -keep class com.taobao.weex.bridge.** { *; }
--dontwarn com.taobao.weex.bridge.**
+-keep class com.taobao.weex.layout.** { *; }
+-keep class com.taobao.weex.WXSDKEngine { *; }
+-keep class com.taobao.weex.base.SystemMessageHandler { *; }
+-dontwarn com.taobao.weex.bridge.**
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/AndroidManifest.xml b/android/sdk/src/main/AndroidManifest.xml
index 9897b6a..9d6cb35 100755
--- a/android/sdk/src/main/AndroidManifest.xml
+++ b/android/sdk/src/main/AndroidManifest.xml
@@ -18,7 +18,7 @@ specific language governing permissions and limitations
 under the License.
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.taobao.weappplus_sdk"
+          package="com.taobao.weex"
           android:versionCode="1"
           android:versionName="1.0">
 
@@ -32,6 +32,7 @@ under the License.
                 android:enabled="true"
                 android:exported="false">
         </receiver>
-    </application>
 
+
+    </application>
 </manifest>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/InitConfig.java b/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
index aaa2dd0..9ff1377 100644
--- a/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
+++ b/android/sdk/src/main/java/com/taobao/weex/InitConfig.java
@@ -180,7 +180,7 @@ public class InitConfig {
       config.framework=this.framework;
       config.mURIAdapter = this.mURIAdapter;
       config.webSocketAdapterFactory = this.webSocketAdapterFactory;
-      config.mJSExceptionAdapter= this.mJSExceptionAdapter;
+      config.mJSExceptionAdapter=this.mJSExceptionAdapter;
       config.classLoaderAdapter = this.classLoaderAdapter;
       return config;
     }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/LayoutFinishListener.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/LayoutFinishListener.java b/android/sdk/src/main/java/com/taobao/weex/LayoutFinishListener.java
deleted file mode 100644
index b863316..0000000
--- a/android/sdk/src/main/java/com/taobao/weex/LayoutFinishListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package com.taobao.weex;
-
-import android.support.annotation.NonNull;
-
-public interface LayoutFinishListener {
-
-    void onLayoutFinish(@NonNull WXSDKInstance instance);
-}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java b/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
index a37a47e..978d2c1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
+++ b/android/sdk/src/main/java/com/taobao/weex/RenderContainer.java
@@ -23,34 +23,42 @@ import android.content.Context;
 import android.os.Build;
 import android.util.AttributeSet;
 import android.view.MotionEvent;
+import android.view.View;
 import android.widget.FrameLayout;
 
 
+import com.taobao.weex.bridge.WXBridgeManager;
+
 import java.lang.ref.WeakReference;
 
 /**
  * Created by sospartan on 08/10/2016.
  */
 
-public class RenderContainer extends FrameLayout {
+public class RenderContainer extends FrameLayout implements WeexFrameRateControl.VSyncListener{
   private WeakReference<WXSDKInstance> mSDKInstance;
+  private WeexFrameRateControl mFrameRateControl;
   private boolean mPageHasEvent = false;
 
   public RenderContainer(Context context) {
     super(context);
+    mFrameRateControl = new WeexFrameRateControl(this);
   }
 
   public RenderContainer(Context context, AttributeSet attrs) {
     super(context, attrs);
+    mFrameRateControl = new WeexFrameRateControl(this);
   }
 
   public RenderContainer(Context context, AttributeSet attrs, int defStyleAttr) {
     super(context, attrs, defStyleAttr);
+    mFrameRateControl = new WeexFrameRateControl(this);
   }
 
   @TargetApi(Build.VERSION_CODES.LOLLIPOP)
   public RenderContainer(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
     super(context, attrs, defStyleAttr, defStyleRes);
+    mFrameRateControl = new WeexFrameRateControl(this);
   }
 
   public void setSDKInstance(WXSDKInstance instance) {
@@ -68,6 +76,42 @@ public class RenderContainer extends FrameLayout {
   }
 
   @Override
+  public void onAttachedToWindow() {
+    super.onAttachedToWindow();
+    if (mFrameRateControl != null) {
+      mFrameRateControl.start();
+    }
+  }
+
+  @Override
+  protected void onDetachedFromWindow() {
+    super.onDetachedFromWindow();
+    if (mFrameRateControl != null) {
+      mFrameRateControl.stop();
+    }
+  }
+  @Override
+  public void dispatchWindowVisibilityChanged(int visibility) {
+    super.dispatchWindowVisibilityChanged(visibility);
+    if (visibility == View.GONE) {
+      if (mFrameRateControl != null) {
+        mFrameRateControl.stop();
+      }
+    } else if (visibility == View.VISIBLE) {
+      if (mFrameRateControl != null) {
+        mFrameRateControl.start();
+      }
+    }
+  }
+
+  @Override
+  public void OnVSync() {
+    if (mSDKInstance != null && mSDKInstance.get() != null) {
+      mSDKInstance.get().OnVSync();
+    }
+  }
+
+  @Override
   public boolean dispatchTouchEvent(MotionEvent ev) {
     mPageHasEvent = true;
     return super.dispatchTouchEvent(ev);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/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 96ca990..2f6420a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -28,13 +28,10 @@ import android.os.Environment;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
-import com.taobao.weappplus_sdk.BuildConfig;
 import com.taobao.weex.common.WXConfig;
 import com.taobao.weex.utils.FontDO;
-import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.utils.LogLevel;
 import com.taobao.weex.utils.TypefaceUtil;
-import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXSoInstallMgrSdk;
 import com.taobao.weex.utils.WXUtils;
@@ -70,7 +67,7 @@ public class WXEnvironment {
    * Debug model
    */
   public static boolean sDebugMode = false;
-  public static boolean sForceEnableDevTool = false;
+  public static final boolean sForceEnableDevTool = false;
   public static String sDebugWsUrl = "";
   public static boolean sDebugServerConnectable = false;
   public static boolean sRemoteDebugMode = false;
@@ -129,7 +126,7 @@ public class WXEnvironment {
     }
     configs.putAll(options);
     if(configs!=null&&configs.get(WXConfig.appName)==null && sApplication!=null){
-       configs.put(WXConfig.appName, sApplication.getPackageName());
+      configs.put(WXConfig.appName, sApplication.getPackageName());
     }
     return configs;
   }
@@ -209,7 +206,7 @@ public class WXEnvironment {
     boolean isCPUSupport = WXSoInstallMgrSdk.isCPUSupport() && !isX86AndExcluded;
     if (WXEnvironment.isApkDebugable()) {
       WXLogUtils.d("WXEnvironment.sSupport:" + isCPUSupport
-                   + "isX86AndExclueded: "+ isX86AndExcluded);
+              + "isX86AndExclueded: "+ isX86AndExcluded);
     }
     return isCPUSupport;
   }
@@ -245,7 +242,7 @@ public class WXEnvironment {
 
   private static String getDevId() {
     return sApplication == null ? "" : ((TelephonyManager) sApplication
-        .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
+            .getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
   }
 
   public static Application getApplication() {
@@ -322,8 +319,7 @@ public class WXEnvironment {
   public static void  setApkDebugable(boolean debugable){
     isApkDebug  = debugable;
     if(!isApkDebug){
-       openDebugLog = false;
+      openDebugLog = false;
     }
   }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
index ef87679..4fef0c3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -21,9 +21,10 @@ package com.taobao.weex;
 import android.app.Application;
 import android.content.Context;
 import android.content.Intent;
-import android.os.Looper;
+import android.content.res.Resources;
 import android.support.v4.content.LocalBroadcastManager;
 import android.text.TextUtils;
+import android.util.Log;
 
 import com.taobao.weex.adapter.IDrawableLoader;
 import com.taobao.weex.adapter.IWXHttpAdapter;
@@ -48,16 +49,6 @@ import com.taobao.weex.common.WXException;
 import com.taobao.weex.common.WXInstanceWrap;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.common.WXPerformance;
-import com.taobao.weex.dom.BasicEditTextDomObject;
-import com.taobao.weex.dom.TextAreaEditTextDomObject;
-import com.taobao.weex.dom.WXCellDomObject;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.WXDomRegistry;
-import com.taobao.weex.dom.WXListDomObject;
-import com.taobao.weex.dom.WXRecyclerDomObject;
-import com.taobao.weex.dom.WXScrollerDomObject;
-import com.taobao.weex.dom.WXSwitchDomObject;
-import com.taobao.weex.dom.WXTextDomObject;
 import com.taobao.weex.http.WXStreamModule;
 import com.taobao.weex.ui.ExternalLoaderComponentHolder;
 import com.taobao.weex.ui.IExternalComponentGetter;
@@ -103,10 +94,11 @@ import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXSoInstallMgrSdk;
 import com.taobao.weex.utils.batch.BatchOperationHelper;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.Map;
 
-public class WXSDKEngine {
+public class WXSDKEngine implements Serializable {
 
   public static final String JS_FRAMEWORK_RELOAD="js_framework_reload";
 
@@ -137,9 +129,9 @@ public class WXSDKEngine {
   @Deprecated
   public static void init(Application application, IWXUserTrackAdapter utAdapter, String framework) {
     initialize(application,
-      new InitConfig.Builder()
-        .setUtAdapter(utAdapter)
-        .build()
+            new InitConfig.Builder()
+                    .setUtAdapter(utAdapter)
+                    .build()
     );
   }
 
@@ -166,31 +158,49 @@ public class WXSDKEngine {
       if(WXEnvironment.isApkDebugable()){
         WXEnvironment.sLogLevel = LogLevel.DEBUG;
       }else{
-		if(WXEnvironment.sApplication != null){
-		  WXEnvironment.sLogLevel = LogLevel.WARN;
-		}else {
-		  WXLogUtils.e(TAG,"WXEnvironment.sApplication is " + WXEnvironment.sApplication);
-		}
+        if(WXEnvironment.sApplication != null){
+          WXEnvironment.sLogLevel = LogLevel.WARN;
+        }else {
+          WXLogUtils.e(TAG,"WXEnvironment.sApplication is " + WXEnvironment.sApplication);
+        }
       }
       doInitInternal(application,config);
+      registerApplicationOptions(application);
       WXEnvironment.sSDKInitInvokeTime = System.currentTimeMillis()-start;
       WXLogUtils.renderPerformanceLog("SDKInitInvokeTime", WXEnvironment.sSDKInitInvokeTime);
       WXPerformance.init();
-
       mIsInit = true;
     }
   }
 
+  private static void registerApplicationOptions(final Application application) {
+
+    if (application == null) {
+      WXLogUtils.e(TAG, "RegisterApplicationOptions application is null");
+      return;
+    }
+
+    Resources resources = application.getResources();
+    registerCoreEnv("screen_width_pixels", String.valueOf(resources.getDisplayMetrics().widthPixels));
+    registerCoreEnv("screen_height_pixels", String.valueOf(resources.getDisplayMetrics().heightPixels));
+
+    int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
+    if (resourceId > 0) {
+      int statusBarHeight = resources.getDimensionPixelSize(resourceId);
+      registerCoreEnv("status_bar_height", String.valueOf(statusBarHeight));
+    }
+  }
+
   private static void doInitInternal(final Application application,final InitConfig config){
     WXEnvironment.sApplication = application;
-	if(application == null){
-	  WXLogUtils.e(TAG, " doInitInternal application is null");
-	  WXExceptionUtils.commitCriticalExceptionRT(null,
-			  WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
-			  "doInitInternal",
-			  WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "WXEnvironment sApplication is null",
-			  null);
-	}
+    if(application == null){
+      WXLogUtils.e(TAG, " doInitInternal application is null");
+      WXExceptionUtils.commitCriticalExceptionRT(null,
+              WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
+              "doInitInternal",
+              WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "WXEnvironment sApplication is null",
+              null);
+    }
     WXEnvironment.JsFrameworkInit = false;
 
     WXBridgeManager.getInstance().post(new Runnable() {
@@ -203,15 +213,15 @@ public class WXSDKEngine {
           sm.setInitConfig(config);
         }
         WXSoInstallMgrSdk.init(application,
-                              sm.getIWXSoLoaderAdapter(),
-                              sm.getWXStatisticsListener());
+                sm.getIWXSoLoaderAdapter(),
+                sm.getWXStatisticsListener());
         boolean isSoInitSuccess = WXSoInstallMgrSdk.initSo(V8_SO_NAME, 1, config!=null?config.getUtAdapter():null);
         if (!isSoInitSuccess) {
-		  WXExceptionUtils.commitCriticalExceptionRT(null,
-				  WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
-				  "doInitInternal",
-				  WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "isSoInit false",
-				  null);
+          WXExceptionUtils.commitCriticalExceptionRT(null,
+                  WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT,
+                  "doInitInternal",
+                  WXErrorCode.WX_KEY_EXCEPTION_SDK_INIT.getErrorMsg() + "isSoInit false",
+                  null);
 
           return;
         }
@@ -227,11 +237,11 @@ public class WXSDKEngine {
   @Deprecated
   public static void init(Application application, String framework, IWXUserTrackAdapter utAdapter, IWXImgLoaderAdapter imgLoaderAdapter, IWXHttpAdapter httpAdapter) {
     initialize(application,
-      new InitConfig.Builder()
-        .setUtAdapter(utAdapter)
-        .setHttpAdapter(httpAdapter)
-        .setImgAdapter(imgLoaderAdapter)
-        .build()
+            new InitConfig.Builder()
+                    .setUtAdapter(utAdapter)
+                    .setHttpAdapter(httpAdapter)
+                    .setImgAdapter(imgLoaderAdapter)
+                    .build()
     );
   }
 
@@ -243,57 +253,57 @@ public class WXSDKEngine {
     BatchOperationHelper batchHelper = new BatchOperationHelper(WXBridgeManager.getInstance());
     try {
       registerComponent(
-        new SimpleComponentHolder(
-          WXText.class,
-          new WXText.Creator()
-        ),
-        false,
-        WXBasicComponentType.TEXT
+              new SimpleComponentHolder(
+                      WXText.class,
+                      new WXText.Creator()
+              ),
+              false,
+              WXBasicComponentType.TEXT
       );
       registerComponent(
-        new SimpleComponentHolder(
-          WXDiv.class,
-          new WXDiv.Ceator()
-        ),
-        false,
-        WXBasicComponentType.CONTAINER,
-        WXBasicComponentType.DIV,
-        WXBasicComponentType.HEADER,
-        WXBasicComponentType.FOOTER
+              new SimpleComponentHolder(
+                      WXDiv.class,
+                      new WXDiv.Ceator()
+              ),
+              false,
+              WXBasicComponentType.CONTAINER,
+              WXBasicComponentType.DIV,
+              WXBasicComponentType.HEADER,
+              WXBasicComponentType.FOOTER
       );
       registerComponent(
-        new SimpleComponentHolder(
-          WXImage.class,
-          new WXImage.Ceator()
-        ),
-        false,
-        WXBasicComponentType.IMAGE,
-        WXBasicComponentType.IMG
+              new SimpleComponentHolder(
+                      WXImage.class,
+                      new WXImage.Creator()
+              ),
+              false,
+              WXBasicComponentType.IMAGE,
+              WXBasicComponentType.IMG
       );
       registerComponent(
-        new SimpleComponentHolder(
-          WXScroller.class,
-          new WXScroller.Creator()
-        ),
-        false,
-        WXBasicComponentType.SCROLLER
+              new SimpleComponentHolder(
+                      WXScroller.class,
+                      new WXScroller.Creator()
+              ),
+              false,
+              WXBasicComponentType.SCROLLER
       );
       registerComponent(
-        new SimpleComponentHolder(
-          WXSlider.class,
-          new WXSlider.Creator()
-        ),
-        true,
-        WXBasicComponentType.SLIDER,
-        WXBasicComponentType.CYCLE_SLIDER
+              new SimpleComponentHolder(
+                      WXSlider.class,
+                      new WXSlider.Creator()
+              ),
+              true,
+              WXBasicComponentType.SLIDER,
+              WXBasicComponentType.CYCLE_SLIDER
       );
       registerComponent(
-        new SimpleComponentHolder(
-                WXSliderNeighbor.class,
-          new WXSliderNeighbor.Creator()
-        ),
-        true,
-        WXBasicComponentType.SLIDER_NEIGHBOR
+              new SimpleComponentHolder(
+                      WXSliderNeighbor.class,
+                      new WXSliderNeighbor.Creator()
+              ),
+              true,
+              WXBasicComponentType.SLIDER_NEIGHBOR
       );
       String simpleList = "simplelist";
       registerComponent(SimpleListComponent.class,false,simpleList);
@@ -317,7 +327,7 @@ public class WXSDKEngine {
 
       registerModule("modal", WXModalUIModule.class, false);
       registerModule("instanceWrap", WXInstanceWrap.class, true);
-      registerModule("animation", WXAnimationModule.class, false);
+      registerModule("animation", WXAnimationModule.class, true);
       registerModule("webview", WXWebViewModule.class, true);
       registerModule("navigator", WXNavigatorModule.class);
       registerModule("stream", WXStreamModule.class);
@@ -329,24 +339,6 @@ public class WXSDKEngine {
       registerModule("meta", WXMetaModule.class,true);
       registerModule("webSocket", WebSocketModule.class);
       registerModule("locale", WXLocaleModule.class);
-
-
-      registerDomObject(simpleList, WXListDomObject.class);
-      registerDomObject(WXBasicComponentType.INDICATOR, WXIndicator.IndicatorDomNode.class);
-      registerDomObject(WXBasicComponentType.TEXT, WXTextDomObject.class);
-      registerDomObject(WXBasicComponentType.HEADER, WXCellDomObject.class);
-      registerDomObject(WXBasicComponentType.CELL, WXCellDomObject.class);
-      registerDomObject(WXBasicComponentType.CELL_SLOT, WXCellDomObject.class);
-      registerDomObject(WXBasicComponentType.INPUT, BasicEditTextDomObject.class);
-      registerDomObject(WXBasicComponentType.TEXTAREA, TextAreaEditTextDomObject.class);
-      registerDomObject(WXBasicComponentType.SWITCH, WXSwitchDomObject.class);
-      registerDomObject(WXBasicComponentType.LIST, WXListDomObject.class);
-      registerDomObject(WXBasicComponentType.RECYCLE_LIST, WXRecyclerDomObject.class);
-      registerDomObject(WXBasicComponentType.VLIST, WXListDomObject.class);
-      registerDomObject(WXBasicComponentType.HLIST, WXListDomObject.class);
-      registerDomObject(WXBasicComponentType.SCROLLER, WXScrollerDomObject.class);
-      registerDomObject(WXBasicComponentType.RECYCLER, WXRecyclerDomObject.class);
-      registerDomObject(WXBasicComponentType.WATERFALL, WXRecyclerDomObject.class);
     } catch (WXException e) {
       WXLogUtils.e("[WXSDKEngine] register:", e);
     }
@@ -354,7 +346,6 @@ public class WXSDKEngine {
     batchHelper.flush();
   }
 
-
   /**
    *
    * Register component. The registration is singleton in {@link WXSDKEngine} level
@@ -465,10 +456,6 @@ public class WXSDKEngine {
     }
   }
 
-  public static boolean registerDomObject(String type, Class<? extends WXDomObject> clazz) throws WXException {
-    return WXDomRegistry.registerDomObject(type, clazz);
-  }
-
   public static void callback(String instanceId, String funcId, Map<String, Object> data) {
     WXSDKManager.getInstance().callback(instanceId, funcId, data);
   }
@@ -535,7 +522,6 @@ public class WXSDKEngine {
     WXBridgeManager.getInstance().restart();
     WXBridgeManager.getInstance().initScriptsFramework(framework);
 
-    WXServiceManager.reload();
     WXModuleManager.reload();
     WXComponentRegistry.reload();
     WXSDKManager.getInstance().postOnUiThread(new Runnable() {
@@ -546,10 +532,14 @@ public class WXSDKEngine {
     }, 0);
   }
   public static void reload(final Context context, boolean remoteDebug) {
-   reload(context,null,remoteDebug);
+    reload(context,null,remoteDebug);
   }
 
   public static void reload() {
     reload(WXEnvironment.getApplication(), WXEnvironment.sRemoteDebugMode);
   }
+
+  public static void registerCoreEnv(String key, String value) {
+    WXBridgeManager.getInstance().registerCoreEnv(key, value);
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/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 5f0cd14..7271186 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -27,11 +27,16 @@ import android.content.IntentFilter;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.net.Uri;
-import android.os.Message;
+import android.support.v4.util.ArrayMap;
+
+import com.taobao.weex.bridge.WXBridge;
+import com.taobao.weex.common.WXPerformance.Dimension;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.annotation.RestrictTo;
 import android.support.annotation.RestrictTo.Scope;
+import android.support.annotation.UiThread;
+import android.support.annotation.WorkerThread;
 import android.text.TextUtils;
 import android.view.Menu;
 import android.view.View;
@@ -43,7 +48,6 @@ import com.taobao.weex.adapter.IWXHttpAdapter;
 import com.taobao.weex.adapter.IWXImgLoaderAdapter;
 import com.taobao.weex.adapter.IWXUserTrackAdapter;
 import com.taobao.weex.adapter.URIAdapter;
-import com.taobao.weex.performance.IWXAnalyzer;
 import com.taobao.weex.appfram.websocket.IWebSocketAdapter;
 import com.taobao.weex.bridge.EventResult;
 import com.taobao.weex.bridge.NativeInvokeHelper;
@@ -57,19 +61,15 @@ import com.taobao.weex.common.OnWXScrollListener;
 import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.common.WXPerformance;
-import com.taobao.weex.common.WXPerformance.Dimension;
 import com.taobao.weex.common.WXRefreshData;
 import com.taobao.weex.common.WXRenderStrategy;
 import com.taobao.weex.common.WXRequest;
 import com.taobao.weex.common.WXResponse;
-import com.taobao.weex.dom.DomContext;
-import com.taobao.weex.dom.WXDomHandler;
-import com.taobao.weex.dom.WXDomObject;
-import com.taobao.weex.dom.WXDomTask;
 import com.taobao.weex.dom.WXEvent;
 import com.taobao.weex.http.WXHttpUtil;
 import com.taobao.weex.performance.WXAnalyzerDataTransfer;
 import com.taobao.weex.tracing.WXTracing;
+import com.taobao.weex.ui.action.GraphicActionAddElement;
 import com.taobao.weex.ui.component.NestedContainer;
 import com.taobao.weex.ui.component.WXBasicComponentType;
 import com.taobao.weex.ui.component.WXComponent;
@@ -77,14 +77,12 @@ import com.taobao.weex.ui.component.WXComponentFactory;
 import com.taobao.weex.ui.component.WXEmbed;
 import com.taobao.weex.ui.flat.FlatGUIContext;
 import com.taobao.weex.ui.view.WXScrollView;
-import com.taobao.weex.ui.view.WXScrollView.WXScrollViewListener;
 import com.taobao.weex.utils.Trace;
 import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXFileUtils;
 import com.taobao.weex.utils.WXJsonUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXReflectionUtils;
-import com.taobao.weex.utils.WXViewUtils;
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.lang.ref.WeakReference;
@@ -96,11 +94,12 @@ import java.util.PriorityQueue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+
 /**
  * Each instance of WXSDKInstance represents an running weex instance.
  * It can be a pure weex view, or mixed with native view
  */
-public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.OnLayoutChangeListener {
+public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChangeListener {
 
   private static  final  String SOURCE_TEMPLATE_BASE64_MD5 = "templateSourceBase64MD5";
 
@@ -128,7 +127,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   private boolean enableLayerType = true;
   private boolean mNeedValidate = false;
   private boolean mNeedReLoad = false;
-  private static volatile int mViewPortWidth = 750;
   private int mInstanceViewPortWidth = 750;
   private @NonNull
   FlatGUIContext mFlatGUIContext =new FlatGUIContext();
@@ -160,7 +158,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   private long mRefreshStartTime;
   private WXPerformance mWXPerformance;
   private ScrollView mScrollView;
-  private WXScrollViewListener mWXScrollViewListener;
+  private WXScrollView.WXScrollViewListener mWXScrollViewListener;
 
   private List<OnWXScrollListener> mWXScrollListeners;
 
@@ -169,11 +167,9 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
    * */
   private volatile boolean isPreRenderMode;
 
-  private LayoutFinishListener mLayoutFinishListener;
-
   private boolean mCurrentGround = false;
   private ComponentObserver mComponentObserver;
-  private boolean mIsCommitedDomAtionExp = false;
+  private Map<String, GraphicActionAddElement> inactiveAddElementAction = new ArrayMap<>();
 
   /**
    * set open SandBox
@@ -182,25 +178,35 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   public void setUseSandBox(boolean flag) {
     WXBridgeManager.getInstance().setSandBoxContext(flag);
   }
+
   public PriorityQueue<WXEmbed> hiddenEmbeds;
 
   private int maxHiddenEmbedsNum = -1; //max hidden embed num, -1 standard for ulimit
 
+  public int getMaxHiddenEmbedsNum() {
+    return maxHiddenEmbedsNum;
+  }
 
-  public boolean getismIsCommitedDomAtionExp() {
-	return mIsCommitedDomAtionExp;
+  public void setMaxHiddenEmbedsNum(int maxHiddenEmbedsNum) {
+    this.maxHiddenEmbedsNum = maxHiddenEmbedsNum;
   }
 
-  public void setmIsCommitedDomAtionExp(boolean mIsCommitedDomAtionExp) {
-	this.mIsCommitedDomAtionExp = mIsCommitedDomAtionExp;
+  @WorkerThread
+  @RestrictTo(Scope.LIBRARY)
+  public void addInActiveAddElementAction(String ref, GraphicActionAddElement action){
+    inactiveAddElementAction.put(ref, action);
   }
 
-  public int getMaxHiddenEmbedsNum() {
-    return maxHiddenEmbedsNum;
+  @WorkerThread
+  @RestrictTo(Scope.LIBRARY)
+  public void removeInActiveAddElmentAction(String ref){
+    inactiveAddElementAction.remove(ref);
   }
 
-  public void setMaxHiddenEmbedsNum(int maxHiddenEmbedsNum) {
-    this.maxHiddenEmbedsNum = maxHiddenEmbedsNum;
+  @WorkerThread
+  @RestrictTo(Scope.LIBRARY)
+  public GraphicActionAddElement getInActiveAddElementAction(String ref){
+    return inactiveAddElementAction.get(ref);
   }
 
   /**
@@ -213,11 +219,26 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       a.setSDKInstance(this);
       a.addOnLayoutChangeListener(this);
     }
+
     mRenderContainer = a;
+    if (mRenderContainer != null && mRenderContainer.getLayoutParams() != null
+            && mRenderContainer.getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT) {
+      WXBridgeManager.getInstance().post(new Runnable() {
+        @Override
+        public void run() {
+          WXBridgeManager.getInstance().setRenderContentWrapContentToCore(true, getInstanceId());
+        }
+      });
+    } else {
+      WXBridgeManager.getInstance().post(new Runnable() {
+        @Override
+        public void run() {
+          WXBridgeManager.getInstance().setRenderContentWrapContentToCore(false, getInstanceId());
+        }
+      });
+    }
   }
 
-
-
   private int mMaxDeepLayer;
   private int mMaxVDomDeepLayer;
 
@@ -252,7 +273,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     enableLayerType = enable;
   }
 
-  @RestrictTo(Scope.LIBRARY)
+  @RestrictTo(RestrictTo.Scope.LIBRARY)
   public @NonNull
   FlatGUIContext getFlatUIContext(){
     return mFlatGUIContext;
@@ -269,26 +290,10 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   public void setNeedLoad(boolean load) {
     mNeedReLoad = load;
   }
-  /*
-  *  Warning: use setInstanceViewPortWidth instead.
-  *  store custom ViewPort Width
-  */
-  @Deprecated
-  public void setViewPortWidth(int viewPortWidth) {
-    mViewPortWidth = viewPortWidth;
-  }
-
-  /**
-   * Warning: use getInstanceViewPortWidth instead.
-   * @return
-   */
-  @Deprecated
-  public static int getViewPortWidth() {
-    return mViewPortWidth;
-  }
 
   public void setInstanceViewPortWidth(int instanceViewPortWidth) {
     this.mInstanceViewPortWidth = instanceViewPortWidth;
+    WXSDKManager.getInstance().getWXBridgeManager().setViewPortWidth(getInstanceId(), instanceViewPortWidth);
   }
 
   public int getInstanceViewPortWidth(){
@@ -315,7 +320,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     init(context);
   }
 
-
   public WXComponent getRootComponent() {
     return mRootComp;
   }
@@ -329,6 +333,9 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     if(mNestedInstanceInterceptor != null){
       mNestedInstanceInterceptor.onCreateNestInstance(sdkInstance,container);
     }
+    if(sdkInstance != null){
+        sdkInstance.setComponentObserver(this.getComponentObserver());
+    }
     return sdkInstance;
   }
 
@@ -393,12 +400,12 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   }
 
   @Deprecated
-  public void registerScrollViewListener(WXScrollViewListener scrollViewListener) {
+  public void registerScrollViewListener(WXScrollView.WXScrollViewListener scrollViewListener) {
     mWXScrollViewListener = scrollViewListener;
   }
 
   @Deprecated
-  public WXScrollViewListener getScrollViewListener() {
+  public WXScrollView.WXScrollViewListener getScrollViewListener() {
     return mWXScrollViewListener;
   }
 
@@ -475,11 +482,11 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
 
       if (getUIContext() != null) {
         new AlertDialog.Builder(getUIContext())
-            .setTitle("Error: Missing pageName")
-            .setMessage("We highly recommend you to set pageName. Call" +
-                "\nWXSDKInstance#render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag)\n" +
-                "to fix it.")
-            .show();
+                .setTitle("Error: Missing pageName")
+                .setMessage("We highly recommend you to set pageName. Call" +
+                        "\nWXSDKInstance#render(String pageName, String template, Map<String, Object> options, String jsonInitData, WXRenderStrategy flag)\n" +
+                        "to fix it.")
+                .show();
       }
 
       return;
@@ -490,7 +497,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   private void ensureRenderArchor(){
     if(mRenderContainer == null){
       if (getContext() != null) {
-        mRenderContainer = new RenderContainer(getContext());
+        setRenderContainer(new RenderContainer(getContext()));
         mRenderContainer.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
         mRenderContainer.setBackgroundColor(Color.TRANSPARENT);
         mRenderContainer.setSDKInstance(this);
@@ -508,12 +515,12 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       return;
     }
 
-	mWXPerformance.pageName = (TextUtils.isEmpty(pageName) ? "defaultBundleUrl":pageName);
-	if (TextUtils.isEmpty(mBundleUrl)) {
-	  mBundleUrl = mWXPerformance.pageName;
-	}
+    mWXPerformance.pageName = (TextUtils.isEmpty(pageName) ? "defaultBundleUrl":pageName);
+    if (TextUtils.isEmpty(mBundleUrl)) {
+      mBundleUrl = mWXPerformance.pageName;
+    }
 
-	WXLogUtils.d("WXSDKInstance", "Start render page: " + pageName);
+    WXLogUtils.d("WXSDKInstance", "Start render page: " + pageName);
 
     if (WXTracing.isAvailable()) {
       WXTracing.TraceEvent traceEvent = WXTracing.newEvent("executeBundleJS", mInstanceId, -1);
@@ -580,11 +587,11 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
 
     WXRequest wxRequest = new WXRequest();
     wxRequest.url = rewriteUri(Uri.parse(url),URIAdapter.BUNDLE).toString();
-	if(wxRequest != null && !TextUtils.isEmpty(wxRequest.url)){
-	  requestUrl = wxRequest.url;
-	}else {
-	  requestUrl = pageName;
-	}
+    if(wxRequest != null && !TextUtils.isEmpty(wxRequest.url)){
+      requestUrl = wxRequest.url;
+    }else {
+      requestUrl = pageName;
+    }
 
     if (wxRequest.paramMap == null) {
       wxRequest.paramMap = new HashMap<String, String>();
@@ -592,7 +599,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     wxRequest.instanceId = getInstanceId();
     wxRequest.paramMap.put(KEY_USER_AGENT, WXHttpUtil.assembleUserAgent(mContext,WXEnvironment.getConfig()));
     WXHttpListener httpListener =
-        new WXHttpListener(pageName, renderOptions, jsonInitData, flag, System.currentTimeMillis());
+            new WXHttpListener(pageName, renderOptions, jsonInitData, flag, System.currentTimeMillis());
     httpListener.setSDKInstance(this);
     adapter.sendRequest(wxRequest, (IWXHttpAdapter.OnHttpListener) httpListener);
   }
@@ -653,7 +660,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   private String wrapPageName(String pageName, String url) {
     if(TextUtils.equals(pageName, WXPerformance.DEFAULT)){
       pageName = url;
-	  WXExceptionUtils.degradeUrl = pageName;
+      WXExceptionUtils.degradeUrl = pageName;
       try {
         Uri uri=Uri.parse(url);
         if(uri!=null){
@@ -693,6 +700,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       // refreshInstance("{}");
     }
   }
+
   /**
    * Refresh instance asynchronously.
    * @param data the new data
@@ -727,7 +735,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     return mRenderStrategy;
   }
 
-  @Override
   public Context getUIContext() {
     return mContext;
   }
@@ -822,15 +829,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     mStatisticsListener = listener;
   }
 
-  public void setLayoutFinishListener(@Nullable LayoutFinishListener listener) {
-    this.mLayoutFinishListener = listener;
-  }
-
-  public LayoutFinishListener getLayoutFinishListener() {
-    return this.mLayoutFinishListener;
-  }
-
-
   /**set render start time*/
   public void setRenderStartTime(long renderStartTime) {
     this.mRenderStartTime = renderStartTime;
@@ -845,7 +843,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
    *  begin hook Activity life cycle callback
    ********************************************************/
 
-
   @Override
   public void onActivityCreate() {
 
@@ -886,7 +883,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     return true;
   }
 
-
   @Override
   public void onActivityPause() {
     onViewDisappear();
@@ -918,12 +914,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.PAUSE_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
-      //todo tmp solution for gray version
-      if (null != mContext){
-        mContext.sendBroadcast(intent);
-      }else {
-        WXEnvironment.getApplication().sendBroadcast(intent);
-      }
+      mContext.sendBroadcast(intent);
       this.mCurrentGround = true;
     }
   }
@@ -946,13 +937,16 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       Intent intent = new Intent(WXGlobalEventReceiver.EVENT_ACTION);
       intent.putExtra(WXGlobalEventReceiver.EVENT_NAME, Constants.Event.RESUME_EVENT);
       intent.putExtra(WXGlobalEventReceiver.EVENT_WX_INSTANCEID, getInstanceId());
-      mContext.sendBroadcast(intent);
-      mCurrentGround = false;
+      //todo tmp solution for gray version
+      if (null != mContext){
+        mContext.sendBroadcast(intent);
+      }else {
+        WXEnvironment.getApplication().sendBroadcast(intent);
+      }
+      this.mCurrentGround = false;
     }
 
     onViewAppear();
-
-    setViewPortWidth(mInstanceViewPortWidth);
   }
 
   @Override
@@ -1000,7 +994,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   public boolean onBackPressed() {
     WXComponent comp = getRootComponent();
     if(comp != null) {
-      WXEvent events= comp.getDomObject().getEvents();
+      WXEvent events= comp.getEvents();
       boolean hasBackPressed = events.contains(Constants.Event.CLICKBACKITEM);
       if (hasBackPressed) {
         fireEvent(comp.getRef(), Constants.Event.CLICKBACKITEM,null, null);
@@ -1010,7 +1004,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     return false;
   }
 
-    public void onActivityResult(int requestCode, int resultCode, Intent data){
+  public void onActivityResult(int requestCode, int resultCode, Intent data){
     WXModuleManager.onActivityResult(getInstanceId(),requestCode,resultCode,data);
 
     if(mRootComp != null) {
@@ -1061,7 +1055,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   public void onCreateFinish() {
     if (null != mWXPerformance){
       mWXPerformance.callCreateFinishTime=System.currentTimeMillis()-mWXPerformance
-          .renderTimeOrigin;
+              .renderTimeOrigin;
     }
     if (mContext != null) {
       runOnUiThread(new Runnable() {
@@ -1100,14 +1094,13 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
 
     long time = System.currentTimeMillis() - mRenderStartTime;
     WXLogUtils.renderPerformanceLog("onRenderSuccess", time);
+    WXLogUtils.renderPerformanceLog("   firstCallAddElementSumTime("+mWXPerformance.mActionAddElementCount+")", mWXPerformance.mCallAddElementSumTime);
+    WXLogUtils.renderPerformanceLog("   firstCallLayoutSumTime("+mWXPerformance.mActionLayoutCount+")", mWXPerformance.mCallLayoutSumTime);
     WXLogUtils.renderPerformanceLog("   invokeCreateInstance",mWXPerformance.communicateTime);
-    WXLogUtils.renderPerformanceLog("   TotalCallNativeTime", mWXPerformance.callNativeTime);
-    WXLogUtils.renderPerformanceLog("       TotalJsonParseTime", mWXPerformance.parseJsonTime);
-    WXLogUtils.renderPerformanceLog("   TotalBatchTime", mWXPerformance.batchTime);
-    WXLogUtils.renderPerformanceLog("       TotalCssLayoutTime", mWXPerformance.cssLayoutTime);
-    WXLogUtils.renderPerformanceLog("       TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
-    WXLogUtils.renderPerformanceLog("       TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+    WXLogUtils.renderPerformanceLog("   TotalApplyUpdateTime", mWXPerformance.applyUpdateTime);
+    WXLogUtils.renderPerformanceLog("   TotalUpdateDomObjTime", mWXPerformance.updateDomObjTime);
 
+    WXBridgeManager.getInstance().printRenderFinishTime(getInstanceId());
 
     mWXPerformance.totalTime = time;
     if(mWXPerformance.screenRenderTime<0.001){
@@ -1161,11 +1154,11 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
    */
   public void onElementChange(){
     if (isDestroy() || !mEnd ||null == mRenderContainer || mRenderContainer.isPageHasEvent() ||
-        mWXPerformance == null){
+            mWXPerformance == null){
       return;
     }
     long lazyLoadTime = System.currentTimeMillis()- mWXPerformance.renderTimeOrigin - mWXPerformance
-        .callCreateFinishTime;
+            .callCreateFinishTime;
     if (lazyLoadTime > 8000){
       //bad case
       return;
@@ -1207,7 +1200,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
 
   @Override
   public final void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int
-      oldTop, int oldRight, int oldBottom) {
+          oldTop, int oldRight, int oldBottom) {
     if (left != oldLeft || top != oldTop || right != oldRight || bottom != oldBottom) {
       onLayoutChange(v);
     }
@@ -1243,56 +1236,105 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
   }
 
-  public void jsonParseTime(long time) {
-    mWXPerformance.parseJsonTime += time;
-  }
+  public void callCreateBodyTime(long time) {
+        mWXPerformance.mCallCreateBodySumTime += time;
+    }
 
-  public void firstScreenRenderFinished() {
-    if(mEnd)
-       return;
+  public void callAddElementTime(long time) {
+      mWXPerformance.mCallAddElementSumTime += time;
+  }
 
-    mEnd = true;
+  public void callLayoutTime(long time) {
+      mWXPerformance.mCallLayoutSumTime += time;
+  }
 
-    if (mStatisticsListener != null && mContext != null) {
-      runOnUiThread(new Runnable() {
-        @Override
-        public void run() {
-          if (mStatisticsListener != null && mContext != null) {
-            Trace.beginSection("onFirstScreen");
-            mStatisticsListener.onFirstScreen();
-            Trace.endSection();
-          }
-        }
-      });
-    }
+  public void callLayoutUpdateDemissionTime(long time) {
+      mWXPerformance.mCallLayoutUpdateDemissionSumTime += time;
+  }
 
-    mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
-    mWXPerformance.fsRenderTime = System.currentTimeMillis();
-    WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
-    WXLogUtils.renderPerformanceLog("   firstScreenJSFExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
-    WXLogUtils.renderPerformanceLog("   firstScreenCallNativeTime", mWXPerformance.callNativeTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenJsonParseTime", mWXPerformance.parseJsonTime);
-    WXLogUtils.renderPerformanceLog("   firstScreenBatchTime", mWXPerformance.batchTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenCssLayoutTime", mWXPerformance.cssLayoutTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
-    WXLogUtils.renderPerformanceLog("       firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+  public void callLayoutaAplyLayoutAndEventTime(long time) {
+      mWXPerformance.mCallLayoutApplyLayoutAndEventSumTime += time;
   }
 
-  public void batchTime(long time) {
-    mWXPerformance.batchTime += time;
+  public void callLayoutBindDataCoreTime(long time) {
+      mWXPerformance.mCallLayoutBindDataSumTime += time;
   }
-  public void cssLayoutTime(long time) {
-      mWXPerformance.cssLayoutTime += time;
+
+  public void callActionLayoutTime(long time) {
+        mWXPerformance.mActionLayoutSumTime += time;
+    }
+
+  public void callActionAddElementTime(long time) {
+      mWXPerformance.mActionAddElementSumTime += time;
   }
 
-  public void applyUpdateTime(long time) {
-      mWXPerformance.applyUpdateTime += time;
+  public void callActionCreateBodyTime(long time) {
+      mWXPerformance.mActionCreateBodySumTime += time;
   }
 
-  public void updateDomObjTime(long time) {
-      mWXPerformance.updateDomObjTime += time;
+  public void callActionOtherTime(long time) {
+        mWXPerformance.mActionOtherSumTime += time;
+    }
+
+  public void callActionAddElementCount() {
+        mWXPerformance.mActionAddElementCount++;
     }
 
+  public void callActionCreateBodyCount() {
+        mWXPerformance.mActionCreateBodyCount++;
+    }
+
+  public void callActionLayoutCount() {
+        mWXPerformance.mActionLayoutCount++;
+    }
+
+  public void callActionOtherCount() {
+        mWXPerformance.mActionOtherCount++;
+    }
+
+  public void jsonParseTime(long time) {
+    mWXPerformance.parseJsonTime += time;
+  }
+
+  public void firstScreenRenderFinished() {
+      if (mEnd)
+          return;
+
+      mEnd = true;
+
+      if (mStatisticsListener != null && mContext != null) {
+          runOnUiThread(new Runnable() {
+              @Override
+              public void run() {
+                  if (mStatisticsListener != null && mContext != null) {
+                      Trace.beginSection("onFirstScreen");
+                      mStatisticsListener.onFirstScreen();
+                      Trace.endSection();
+                  }
+              }
+          });
+      }
+
+      mWXPerformance.screenRenderTime = System.currentTimeMillis() - mRenderStartTime;
+      mWXPerformance.fsRenderTime = System.currentTimeMillis();
+      WXLogUtils.renderPerformanceLog("firstScreenJSFAndWeexCoreExecuteTime", mWXPerformance.firstScreenJSFExecuteTime);
+      WXLogUtils.renderPerformanceLog("firstScreenRenderFinished", mWXPerformance.screenRenderTime);
+      WXLogUtils.renderPerformanceLog("   firstScreenApplyUpdateTime", mWXPerformance.applyUpdateTime);
+      WXLogUtils.renderPerformanceLog("   firstScreenUpdateDomObjTime", mWXPerformance.updateDomObjTime);
+      WXLogUtils.renderPerformanceLog("   firstCallCreateBodySumTime("+mWXPerformance.mActionCreateBodyCount+")", mWXPerformance.mCallCreateBodySumTime);
+      WXLogUtils.renderPerformanceLog("   firstCallAddElementSumTime("+mWXPerformance.mActionAddElementCount+")", mWXPerformance.mCallAddElementSumTime);
+      WXLogUtils.renderPerformanceLog("   firstCallLayoutSumTime("+mWXPerformance.mActionLayoutCount+")", mWXPerformance.mCallLayoutSumTime);
+      WXLogUtils.renderPerformanceLog("   firstScreenRenderSumTime", mWXPerformance.renderSumTime());
+      WXLogUtils.renderPerformanceLog("       firstActionCreateBodySumTime", mWXPerformance.mActionCreateBodySumTime);
+      WXLogUtils.renderPerformanceLog("       firstActionAddElementSumTime", mWXPerformance.mActionAddElementSumTime);
+      WXLogUtils.renderPerformanceLog("       firstActionLayoutSumTime", mWXPerformance.mActionLayoutSumTime);
+      WXLogUtils.renderPerformanceLog("           firstCallLayoutUpdateDemissionSumTime", mWXPerformance.mCallLayoutUpdateDemissionSumTime);
+      WXLogUtils.renderPerformanceLog("           firstCallLayoutApplyLayoutAndEventSumTime", mWXPerformance.mCallLayoutApplyLayoutAndEventSumTime);
+      WXLogUtils.renderPerformanceLog("           firstCallLayoutBindDataSumTime", mWXPerformance.mCallLayoutBindDataSumTime);
+      WXLogUtils.renderPerformanceLog("       firstActionOtherSumTime("+mWXPerformance.mActionOtherCount+")", mWXPerformance.mActionOtherSumTime);
+
+    WXBridgeManager.getInstance().printFirstScreenRenderTime(getInstanceId());
+  }
 
   public void createInstanceFinished(long time) {
     if (time > 0) {
@@ -1300,40 +1342,6 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
   }
 
-  /**
-   * UserTrack Log instead by {@code WXExceptionUtils#commitCriticalExceptionRT}
-   */
-//  public void commitUTStab(final String type, final WXErrorCode errorCode) {
-//    if (TextUtils.isEmpty(type) || errorCode == null) {
-//      return;
-//    }
-//
-//    runOnUiThread(new Runnable() {
-//      @Override
-//      public void run() {
-//        // Record exception if a render error happened.
-//        if (mStatisticsListener != null && errorCode != WXErrorCode.WX_SUCCESS) {
-//          mStatisticsListener.onException(mInstanceId,
-//                                          errorCode.getErrorCode(),
-//                                          errorCode.getErrorMsg());
-//        }
-//
-//        WXPerformance performance = new WXPerformance();
-//        performance.errCode = errorCode.getErrorCode();
-//        performance.args = errorCode.getArgs();
-//        if (errorCode != WXErrorCode.WX_SUCCESS) {
-//          performance.errMsg = errorCode.getErrorMsg();
-//          if (WXEnvironment.isApkDebugable()) {
-//            WXLogUtils.d(performance.toString());
-//          }
-//        }
-//        if( mUserTrackAdapter!= null) {
-//          mUserTrackAdapter.commit(mContext, null, type, performance, getUserTrackParams());
-//        }
-//      }
-//    });
-//  }
-
   private void destroyView(View rootView) {
     try {
       if (rootView instanceof ViewGroup) {
@@ -1393,12 +1401,20 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       isDestroy = true;
       mStatisticsListener = null;
       if(responseHeaders != null){
-          responseHeaders.clear();
+        responseHeaders.clear();
       }
       if(templateRef != null){
         templateRef = null;
       }
       mWXPerformance.afterInstanceDestroy(mInstanceId);
+
+      WXBridgeManager.getInstance().post(new Runnable() {
+        @Override
+        public void run() {
+          WXBridgeManager.getInstance().onInstanceClose(getInstanceId());
+          inactiveAddElementAction.clear();
+        }
+      });
     }
   }
 
@@ -1414,6 +1430,8 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   }
 
   public View getRootView() {
+    if (mRootComp == null)
+      return null;
     return mRootComp.getRealView();
   }
 
@@ -1459,6 +1477,20 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     }
   }
 
+  public int getRenderContainerPaddingLeft() {
+    if(mRenderContainer != null) {
+      return mRenderContainer.getPaddingLeft();
+    }
+    return 0;
+  }
+
+  public int getRenderContainerPaddingTop() {
+    if(mRenderContainer != null) {
+      return mRenderContainer.getPaddingTop();
+    }
+    return 0;
+  }
+
   public synchronized List<OnWXScrollListener> getWXScrollListeners() {
     return mWXScrollListeners;
   }
@@ -1470,46 +1502,30 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     mWXScrollListeners.add(wxScrollListener);
   }
 
-  private void updateRootComponentStyle(JSONObject style) {
-    Message message = Message.obtain();
-    WXDomTask task = new WXDomTask();
-    task.instanceId = getInstanceId();
-    if (task.args == null) {
-      task.args = new ArrayList<>();
-    }
-    task.args.add(WXDomObject.ROOT);
-    task.args.add(style);
-    message.obj = task;
-    message.what = WXDomHandler.MsgType.WX_DOM_UPDATE_STYLE;
-    WXSDKManager.getInstance().getWXDomManager().sendMessage(message);
-  }
-
   public void setSize(int width, int height) {
-    if (width < 0 || height < 0 || isDestroy || !mRendered) {
-      return;
-    }
-    float realWidth = WXViewUtils.getWebPxByWidth(width,getInstanceViewPortWidth());
-    float realHeight = WXViewUtils.getWebPxByWidth(height,getInstanceViewPortWidth());
-
-    View godView = mRenderContainer;
-    if (godView != null) {
-      ViewGroup.LayoutParams layoutParams = godView.getLayoutParams();
+    if (width > 0 && height > 0 & !isDestroy && mRendered && mRenderContainer != null) {
+      ViewGroup.LayoutParams layoutParams = mRenderContainer.getLayoutParams();
       if (layoutParams != null) {
-        if(godView.getWidth() != width || godView.getHeight() != height) {
+        final float realWidth = width;
+        final float realHeight = height;
+        if (mRenderContainer.getWidth() != width || mRenderContainer.getHeight() != height) {
           layoutParams.width = width;
           layoutParams.height = height;
-          godView.setLayoutParams(layoutParams);
+          mRenderContainer.setLayoutParams(layoutParams);
         }
 
-        JSONObject style = new JSONObject();
-        WXComponent rootComponent = mRootComp;
+        if (mRootComp != null && layoutParams != null) {
+          final boolean isWidthWrapContent = layoutParams.width == ViewGroup.LayoutParams.WRAP_CONTENT;
+          final boolean isHeightWrapContent = layoutParams.height == ViewGroup.LayoutParams.WRAP_CONTENT;
 
-        if(rootComponent == null){
-          return;
+          WXBridgeManager.getInstance().post(new Runnable() {
+            @Override
+            public void run() {
+              WXBridgeManager.getInstance().setDefaultRootSize(getInstanceId(), realWidth, realHeight, isWidthWrapContent,
+                      isHeightWrapContent);
+            }
+          });
         }
-        style.put(Constants.Name.DEFAULT_WIDTH, realWidth);
-        style.put(Constants.Name.DEFAULT_HEIGHT, realHeight);
-        updateRootComponentStyle(style);
       }
     }
   }
@@ -1551,7 +1567,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
    * @param domChanges
    */
   public void fireEvent(String elementRef,final String type, final Map<String, Object> data,final Map<String, Object> domChanges){
-       fireEvent(elementRef, type, data, domChanges, null);
+    fireEvent(elementRef, type, data, domChanges, null);
   }
 
   public void fireEvent(String elementRef,final String type, final Map<String, Object> data){
@@ -1623,7 +1639,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
    * Check whether the current module registered the event
    * @param eventName EventName register in weex
    * @param module Events occur in this Module
-   * @return  boolean true
+   * @return  register->true
    */
   public boolean checkModuleEventRegistered(String eventName,WXModule module) {
     if (module != null) {
@@ -1723,17 +1739,17 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     @Override
     public void onHttpStart() {
       if (this.instance != null
-          && this.instance.getWXStatisticsListener() != null) {
+              && this.instance.getWXStatisticsListener() != null) {
         this.instance.getWXStatisticsListener().onHttpStart();
-        this.instance.onHttpStart();
       }
     }
 
     @Override
     public void onHeadersReceived(int statusCode, Map<String,List<String>> headers) {
       if (this.instance != null
-          && this.instance.getWXStatisticsListener() != null) {
+              && this.instance.getWXStatisticsListener() != null) {
         this.instance.getWXStatisticsListener().onHeadersReceived();
+        this.instance.onHttpStart();
       }
       if(this.instance != null
               && this.instance.responseHeaders != null
@@ -1755,7 +1771,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
     @Override
     public void onHttpFinish(WXResponse response) {
       if (this.instance != null
-          && this.instance.getWXStatisticsListener() != null) {
+              && this.instance.getWXStatisticsListener() != null) {
         this.instance.getWXStatisticsListener().onHttpFinish();
       }
 
@@ -1822,7 +1838,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
             performance.appendErrMsg("|template is null!");
           }else {
             performance.errCode=WXErrorCode.WX_SUCCESS.getErrorCode();
-		  }
+          }
 
           if (mUserTrackAdapter != null) {
             mUserTrackAdapter.commit(getContext(), null, IWXUserTrackAdapter.JS_DOWNLOAD, performance, null);
@@ -1834,29 +1850,29 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
         String template = new String(response.originalData);
         render(pageName, template, options, jsonInitData, flag);
 
-		// check content-type
+        // check content-type
       } else if (TextUtils.equals(WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
-			  response.statusCode)) {
+              response.statusCode)) {
         WXLogUtils.e("user intercept: WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR");
         onRenderError(WXErrorCode.WX_DEGRAD_ERR_BUNDLE_CONTENTTYPE_ERROR.getErrorCode(),
-				"|response.errorMsg==" + response.errorMsg +
-				"|instance.getTemplateInfo == \n" + instance.getTemplateInfo() +
-				"|instance bundleUrl = \n" + instance.getBundleUrl() +
-				"|instance requestUrl = \n" + Uri.decode(WXSDKInstance.requestUrl)
-		);
+                "|response.errorMsg==" + response.errorMsg +
+                        "|instance.getTemplateInfo == \n" + instance.getTemplateInfo() +
+                        "|instance bundleUrl = \n" + instance.getBundleUrl() +
+                        "|instance requestUrl = \n" + Uri.decode(WXSDKInstance.requestUrl)
+        );
 
-		// check content-length
+        // check content-length
       } else if (response!=null && response.originalData!=null && TextUtils.equals("-206", response.statusCode)) {
-		WXLogUtils.e("user intercept: WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED");
-		onRenderError(
-				WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode(),
+        WXLogUtils.e("user intercept: WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED");
+        onRenderError(
+                WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode(),
                 WXErrorCode.WX_DEGRAD_ERR_NETWORK_CHECK_CONTENT_LENGTH_FAILED.getErrorCode() +
-				"|response.errorMsg==" + response.errorMsg +
-				"|instance.getTemplateInfo == \n" + instance.getTemplateInfo());
-	  }
+                        "|response.errorMsg==" + response.errorMsg +
+                        "|instance.getTemplateInfo == \n" + instance.getTemplateInfo());
+      }
       else {
         onRenderError(WXErrorCode.WX_DEGRAD_ERR_NETWORK_BUNDLE_DOWNLOAD_FAILED.getErrorCode(),
-				response.errorMsg);
+                response.errorMsg);
       }
     }
   }
@@ -1864,8 +1880,8 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   private boolean isNet(String requestType){
 
     return "network".equals(requestType) || "2g".equals(requestType) || "3g".equals(requestType)
-           || "4g".equals(requestType) || "wifi".equals(requestType) || "other".equals(requestType)
-           || "unknown".equals(requestType);
+            || "4g".equals(requestType) || "wifi".equals(requestType) || "other".equals(requestType)
+            || "unknown".equals(requestType);
   }
 
   /**
@@ -1891,7 +1907,7 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
       responseHeaders.put(SOURCE_TEMPLATE_BASE64_MD5, sourceBase64MD5List);
       return " template md5 " + sourceMD5 + " length " +   bts.length
               + " base64 md5 " + sourceBase64MD5
-               + " response header " + JSONObject.toJSONString(responseHeaders);
+              + " response header " + JSONObject.toJSONString(responseHeaders);
     } catch (UnsupportedEncodingException e) {
       return "template md5 getBytes error";
     }
@@ -1933,10 +1949,22 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
   }
 
   public void setTemplate(String template) {
-    this.templateRef = new WeakReference<>(template);
+    this.templateRef = new WeakReference<String>(template);
   }
 
   public interface NestedInstanceInterceptor {
     void onCreateNestInstance(WXSDKInstance instance, NestedContainer container);
   }
+
+  public void OnVSync() {
+    boolean forceLayout = WXBridgeManager.getInstance().notifyLayout(getInstanceId());
+    if(forceLayout) {
+      WXBridgeManager.getInstance().post(new Runnable() {
+        @Override
+        public void run() {
+          WXBridgeManager.getInstance().forceLayout(getInstanceId());
+        }
+      });
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/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 b9a0913..1823ef2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -48,7 +48,6 @@ import com.taobao.weex.common.WXRefreshData;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.common.WXThread;
 import com.taobao.weex.common.WXWorkThreadManager;
-import com.taobao.weex.dom.WXDomManager;
 import com.taobao.weex.performance.IWXAnalyzer;
 import com.taobao.weex.ui.WXRenderManager;
 import com.taobao.weex.utils.WXLogUtils;
@@ -68,7 +67,6 @@ public class WXSDKManager {
 
   private static volatile WXSDKManager sManager;
   private static AtomicInteger sInstanceId = new AtomicInteger(0);
-  private final WXDomManager mWXDomManager;
   private final WXWorkThreadManager mWXWorkThreadManager;
   private WXBridgeManager mBridgeManager;
   /** package **/ WXRenderManager mWXRenderManager;
@@ -106,7 +104,6 @@ public class WXSDKManager {
 
   private WXSDKManager(WXRenderManager renderManager) {
     mWXRenderManager = renderManager;
-    mWXDomManager = new WXDomManager(mWXRenderManager);
     mBridgeManager = WXBridgeManager.getInstance();
     mWXWorkThreadManager = new WXWorkThreadManager();
     mWXAnalyzerList = new ArrayList<>();
@@ -196,10 +193,6 @@ public class WXSDKManager {
     mBridgeManager.restart();
   }
 
-  public WXDomManager getWXDomManager() {
-    return mWXDomManager;
-  }
-
   public WXBridgeManager getWXBridgeManager() {
     return mBridgeManager;
   }
@@ -221,9 +214,6 @@ public class WXSDKManager {
   }
 
   public void destroy() {
-    if (mWXDomManager != null) {
-      mWXDomManager.destroy();
-    }
     if (mWXWorkThreadManager != null) {
       mWXWorkThreadManager.destroy();
     }
@@ -307,7 +297,6 @@ public class WXSDKManager {
       }
     }
     mWXRenderManager.removeRenderStatement(instanceId);
-    mWXDomManager.removeDomStatement(instanceId);
     mBridgeManager.destroyInstance(instanceId);
     WXModuleManager.destroyInstanceModules(instanceId);
   }
@@ -352,7 +341,7 @@ public class WXSDKManager {
 
   public ClassLoaderAdapter getClassLoaderAdapter() {
     if(mClassLoaderAdapter == null){
-        mClassLoaderAdapter = new ClassLoaderAdapter();
+      mClassLoaderAdapter = new ClassLoaderAdapter();
     }
     return mClassLoaderAdapter;
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/WeexFrameRateControl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WeexFrameRateControl.java b/android/sdk/src/main/java/com/taobao/weex/WeexFrameRateControl.java
new file mode 100644
index 0000000..61f47eb
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/WeexFrameRateControl.java
@@ -0,0 +1,88 @@
+/**
+ * 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;
+
+/**
+ * Created by shiwentao on 2017/8/24.
+ */
+
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.view.Choreographer;
+
+import java.lang.ref.WeakReference;
+
+public class WeexFrameRateControl {
+    private static final long VSYNC_FRAME = 1000 / 16;
+    private WeakReference<VSyncListener> mListener;
+    private final Choreographer mChoreographer;
+    private final Choreographer.FrameCallback mVSyncFrameCallback;
+    private final Runnable runnable;
+
+    public interface VSyncListener {
+        void OnVSync();
+    }
+
+    public WeexFrameRateControl(VSyncListener listener) {
+        mListener = new WeakReference<>(listener);
+        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
+            mChoreographer = Choreographer.getInstance();
+            mVSyncFrameCallback = new Choreographer.FrameCallback() {
+                @Override
+                public void doFrame(long frameTimeNanos) {
+                    mChoreographer.postFrameCallback(mVSyncFrameCallback);
+                    if (mListener != null && mListener.get() != null) {
+                        mListener.get().OnVSync();
+                    }
+                }
+            };
+            runnable = null;
+        } else {
+            // For API 15 or lower
+            runnable = new Runnable() {
+                @Override
+                public void run() {
+                    WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(runnable, VSYNC_FRAME);
+                    if (mListener != null && mListener.get() != null) {
+                        mListener.get().OnVSync();
+                    }
+                }
+            };
+            mChoreographer = null;
+            mVSyncFrameCallback = null;
+        }
+    }
+
+    public void start() {
+        if (mChoreographer != null) {
+            mChoreographer.postFrameCallback(mVSyncFrameCallback);
+        }
+        else if(runnable!=null){
+            WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(runnable, VSYNC_FRAME);
+        }
+    }
+
+    public void stop() {
+        if (mChoreographer != null) {
+            mChoreographer.removeFrameCallback(mVSyncFrameCallback);
+        }else if(runnable!=null){
+            WXSDKManager.getInstance().getWXRenderManager().removeTask(runnable);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/adapter/ClassLoaderAdapter.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/ClassLoaderAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/ClassLoaderAdapter.java
index fcd1956..7d6a854 100644
--- a/android/sdk/src/main/java/com/taobao/weex/adapter/ClassLoaderAdapter.java
+++ b/android/sdk/src/main/java/com/taobao/weex/adapter/ClassLoaderAdapter.java
@@ -23,7 +23,6 @@ import android.content.Context;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.ui.component.WXComponent;
-import com.taobao.weex.utils.WXLogUtils;
 
 /**
  * Created by furture on 2018/2/7.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/appfram/websocket/WebSocketCloseCodes.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/appfram/websocket/WebSocketCloseCodes.java b/android/sdk/src/main/java/com/taobao/weex/appfram/websocket/WebSocketCloseCodes.java
index 0f742ae..6251399 100644
--- a/android/sdk/src/main/java/com/taobao/weex/appfram/websocket/WebSocketCloseCodes.java
+++ b/android/sdk/src/main/java/com/taobao/weex/appfram/websocket/WebSocketCloseCodes.java
@@ -20,7 +20,7 @@ package com.taobao.weex.appfram.websocket;
 
 /**
  * Created by moxun on 17/1/3.
- * @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent">CloseEvent</a>
+ * @link {https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent}
  */
 
 public enum WebSocketCloseCodes {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/base/CalledByNative.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/base/CalledByNative.java b/android/sdk/src/main/java/com/taobao/weex/base/CalledByNative.java
new file mode 100644
index 0000000..15fa920
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/base/CalledByNative.java
@@ -0,0 +1,22 @@
+/*
+ * 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.base;
+public @interface CalledByNative {
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/base/FloatUtil.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/base/FloatUtil.java b/android/sdk/src/main/java/com/taobao/weex/base/FloatUtil.java
new file mode 100755
index 0000000..ecbeeb4
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/base/FloatUtil.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.base;
+
+public class FloatUtil {
+
+  private static final float EPSILON = .00001f;
+
+  public static boolean floatsEqual(float f1, float f2) {
+    if (Float.isNaN(f1) || Float.isNaN(f2)) {
+      return Float.isNaN(f1) && Float.isNaN(f2);
+    }
+    return Math.abs(f2 - f1) < EPSILON;
+  }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java b/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java
new file mode 100644
index 0000000..6a408fb
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java
@@ -0,0 +1,106 @@
+/**
+ * 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.base;
+
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+
+public class SystemMessageHandler extends Handler implements Serializable {
+
+    private static final String TAG = "SystemMessageHandler";
+
+    private static final int SCHEDULED_WORK = 1;
+
+    private long mMessagePumpDelegateNative = 0;
+
+    private boolean mIsRunning = false;
+
+    private Method mMessageMethodSetAsynchronous;
+
+    private native void nativeRunWork(long delegateNative);
+
+    private SystemMessageHandler(long messagePumpDelegateNative) {
+        this.mMessagePumpDelegateNative = messagePumpDelegateNative;
+        try {
+            Class<?> messageClass = Class.forName("android.os.Message");
+            mMessageMethodSetAsynchronous = messageClass.getMethod(
+                    "setAsynchronous", new Class[]{boolean.class});
+        } catch (ClassNotFoundException e) {
+            Log.e(TAG, "Failed to find android.os.Message class:" + e);
+        } catch (NoSuchMethodException e) {
+            Log.e(TAG, "Failed to load Message.setAsynchronous method:" + e);
+        } catch (RuntimeException e) {
+            Log.e(TAG, "Exception while loading Message.setAsynchronous method: " + e);
+        }
+        mIsRunning = true;
+    }
+
+    @CalledByNative
+    public static SystemMessageHandler create(long messagePumpDelegateNative) {
+        return new SystemMessageHandler(messagePumpDelegateNative);
+    }
+
+    @CalledByNative
+    private void scheduleWork() {
+        sendMessage(obtainAsyncMessage(SCHEDULED_WORK));
+    }
+
+    @CalledByNative
+    private void stop() {
+        mIsRunning = false;
+    }
+
+    private Message obtainAsyncMessage(int what) {
+        Message msg = Message.obtain();
+        msg.what = what;
+        if (mMessageMethodSetAsynchronous != null) {
+            // If invocation fails, assume this is indicative of future
+            // failures, and avoid log spam by nulling the reflected method.
+            try {
+                mMessageMethodSetAsynchronous.invoke(msg, true);
+            } catch (IllegalAccessException e) {
+                Log.e(TAG, "Illegal access to asynchronous message creation, disabling.");
+                mMessageMethodSetAsynchronous = null;
+            } catch (IllegalArgumentException e) {
+                Log.e(TAG, "Illegal argument for asynchronous message creation, disabling.");
+                mMessageMethodSetAsynchronous = null;
+            } catch (InvocationTargetException e) {
+                Log.e(TAG, "Invocation exception during asynchronous message creation, disabling.");
+                mMessageMethodSetAsynchronous = null;
+            } catch (RuntimeException e) {
+                Log.e(TAG, "Runtime exception during asynchronous message creation, disabling.");
+                mMessageMethodSetAsynchronous = null;
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public void handleMessage(Message msg) {
+        if(mIsRunning) {
+            nativeRunWork(mMessagePumpDelegateNative);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/bridge/JSCallback.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/JSCallback.java b/android/sdk/src/main/java/com/taobao/weex/bridge/JSCallback.java
index 4bf8412..d0ccb69 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/JSCallback.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/JSCallback.java
@@ -18,8 +18,6 @@
  */
 package com.taobao.weex.bridge;
 
-import java.util.Map;
-
 /**
  * Created by sospartan on 5/24/16.
  */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/bridge/ModuleFactoryImpl.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/ModuleFactoryImpl.java b/android/sdk/src/main/java/com/taobao/weex/bridge/ModuleFactoryImpl.java
index fe0e00a..da26f14 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/ModuleFactoryImpl.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/ModuleFactoryImpl.java
@@ -23,16 +23,15 @@ package com.taobao.weex.bridge;
  */
 
 public class ModuleFactoryImpl {
-    public ModuleFactory mFactory = null;
-    public boolean hasRigster = false;
+  public ModuleFactory mFactory = null;
+  public boolean hasRigster = false;
 
-    public ModuleFactoryImpl(ModuleFactory factory) {
-        mFactory = factory;
-    }
-
-    public ModuleFactoryImpl(ModuleFactory factory, boolean rigister) {
-        mFactory = factory;
-        hasRigster = rigister;
-    }
-}
+  public ModuleFactoryImpl(ModuleFactory factory) {
+    mFactory = factory;
+  }
 
+  public ModuleFactoryImpl(ModuleFactory factory, boolean rigister) {
+    mFactory = factory;
+    hasRigster = rigister;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/2f8caedb/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java b/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
index dc38025..0480aaa 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/NativeInvokeHelper.java
@@ -34,21 +34,23 @@ public final class NativeInvokeHelper {
   private String mInstanceId;
 
   public NativeInvokeHelper(String instanceId){
-      mInstanceId = instanceId;
+    mInstanceId = instanceId;
   }
 
   public Object invoke(final Object target,final Invoker invoker,JSONArray args) throws Exception {
     final Object[] params = prepareArguments(
-        invoker.getParameterTypes(),
-        args);
+            invoker.getParameterTypes(),
+            args);
     if (invoker.isRunOnUIThread()) {
       WXSDKManager.getInstance().postOnUiThread(new Runnable() {
         @Override
         public void run() {
-          try {
-            invoker.invoke(target, params);
-          } catch (Exception e) {
-            throw new RuntimeException(target + "Invoker " + invoker.toString() ,e);
+          if (invoker != null) {
+            try {
+              invoker.invoke(target, params);
+            } catch (Exception e) {
+              throw new RuntimeException(target + "Invoker " + invoker.toString(), e);
+            }
           }
         }
       }, 0);