Merge branch 'feature/tmall-preInstall' into 'release/20190925'

Support Tmall preInstall

Extract So from apk

See merge request !609815
diff --git a/.travis.yml b/.travis.yml
index 3bf6dc9..d9f4191 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -137,8 +137,8 @@
         esac
         if npm run danger -- ci --dangerfile ./dangerfile-android.js | grep -q "hasAndroidFile" ; then
           cd android
-          ./gradlew clean install -PbuildRuntimeApi=true ${GRADLE_ABI} --info
-          ./gradlew install -PbuildRuntimeApi=false ${GRADLE_ABI} --info
+          ./gradlew clean assembleRelease -PbuildRuntimeApi=true ${GRADLE_ABI} --info || exit 1
+          ./gradlew assembleRelease -PbuildRuntimeApi=false ${GRADLE_ABI} --info || exit 1
         fi
         ;;
       "jsfm" )
diff --git a/android/sdk/build.gradle b/android/sdk/build.gradle
index e183968..2a9654e 100755
--- a/android/sdk/build.gradle
+++ b/android/sdk/build.gradle
@@ -151,6 +151,9 @@
                         '-DANDROID_PROJECT_DIR=' + "${android_project_dir}",
                         '-DENABLE_ASAN=false',
                         '-DBUILD_RUNTIME_API='+"${buildRuntimeApi}"
+                if(project.hasProperty('enableASan') && "true" == project.getProperty('enableASan')) {
+                    cppFlags "-fsanitize=address -fno-omit-frame-pointer"
+                }
             }
         }
     }
@@ -264,11 +267,10 @@
     }
     preBuild.dependsOn licenseFormat
 }
-
+def ndkDir = ''
 task checkNdkVersion() {
     def rootDir = project.rootDir
     def localProperties = new File(rootDir, "local.properties")
-    def ndkDir = ''
     if (localProperties.exists()) {
         Properties properties = new Properties()
         localProperties.withInputStream { instr ->
@@ -360,7 +362,45 @@
         }
     }
 }
-
+def asanAbi = project.hasProperty('asanAbi') ? project.getProperty('asanAbi') : 'arm64-v8a'
+task clearASanLibs(type: Delete){
+    delete project.android.sourceSets.main.resources.srcDirs
+    delete fileTree(project.android.sourceSets.main.jniLibs.srcDirs[-1]) {
+        include '**/libclang_rt.asan-*-android.so'
+    }
+}
+task copyWrapScript(type: Copy,dependsOn: clearASanLibs) {
+    if(project.hasProperty('enableASan') && "true" == project.getProperty('enableASan')) {
+        from 'wrap.sh'
+        into new File(project.android.sourceSets.main.resources.srcDirs[-1], "lib")
+        eachFile {
+            it.path = "${asanAbi}/${it.name}"
+        }
+    }
+}
+task copyASanLib(type: Copy,dependsOn: copyWrapScript){
+    if(project.hasProperty('enableASan') && "true" == project.getProperty('enableASan')) {
+        def ndkPath = ndkDir == '' ? System.getenv("ANDROID_NDK_HOME"):ndkDir
+        def dir = ndkPath + '/toolchains/llvm/prebuilt/'
+        def renamedAbi = asanAbi
+        if (asanAbi == "armeabi-v7a" || asanAbi == "armeabi")
+            renamedAbi = "arm"
+        if (asanAbi == "arm64-v8a")
+            renamedAbi = "aarch64"
+        if (asanAbi == "x86")
+            renamedAbi = "i686"
+        new File(dir).eachFileRecurse { file ->
+            if (file.name == 'libclang_rt.asan-' + renamedAbi + '-android.so')
+                from file.absolutePath
+                into project.android.sourceSets.main.jniLibs.srcDirs[-1]
+                eachFile {
+                    it.path = "${asanAbi}/${it.name}"
+                }
+            includeEmptyDirs = false
+        }
+    }
+}
+preBuild.dependsOn copyASanLib
 
 afterEvaluate { project ->
     transformNativeLibsWithStripDebugSymbolForRelease << {
diff --git a/android/sdk/src/main/AndroidManifest.xml b/android/sdk/src/main/AndroidManifest.xml
index e0d8d4b..5360c0c 100755
--- a/android/sdk/src/main/AndroidManifest.xml
+++ b/android/sdk/src/main/AndroidManifest.xml
@@ -20,14 +20,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.taobao.weex">
     <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
-
-    <application>
-        <receiver
-                android:name="com.taobao.weex.WXGlobalEventReceiver"
-                android:enabled="true"
-                android:exported="false">
-        </receiver>
-
-
-    </application>
 </manifest>
\ No newline at end of file
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 4c52f47..dbf6473 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -114,6 +114,8 @@
 
   public static long sJSFMStartListenerTime=0;
 
+  public static volatile boolean isWsFixMode = true;
+
   /**
    * component and modules ready
    * */
@@ -605,13 +607,13 @@
 
   public static String getLibJssRealPath() {
     if (WXEnvironment.sUseRunTimeApi && !TextUtils.isEmpty(CORE_JSS_RUNTIME_SO_PATH)){
-      WXLogUtils.e("test-> findLibJssRuntimeRealPath " + CORE_JSS_RUNTIME_SO_PATH);
+      WXLogUtils.d("test-> findLibJssRuntimeRealPath " + CORE_JSS_RUNTIME_SO_PATH);
       return CORE_JSS_RUNTIME_SO_PATH;
     }
 
     if(TextUtils.isEmpty(CORE_JSS_SO_PATH)) {
       CORE_JSS_SO_PATH = findSoPath(CORE_JSS_SO_NAME);
-      WXLogUtils.e("test-> findLibJssRealPath " + CORE_JSS_SO_PATH);
+      WXLogUtils.d("test-> findLibJssRealPath " + CORE_JSS_SO_PATH);
     }
 
     return CORE_JSS_SO_PATH;
@@ -652,7 +654,7 @@
       }
     }
 
-    WXLogUtils.e("getLibLdPath is " + LIB_LD_PATH);
+    WXLogUtils.d("getLibLdPath is " + LIB_LD_PATH);
     return LIB_LD_PATH;
   }
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java b/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java
index d2ffd09..15d9cf2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java
@@ -219,10 +219,10 @@
 
         if (isPreDownLoadMode){
             if (isInstanceReady){
-                WXLogUtils.e("test->", "DownLoad didHttpFinish on http" );
+                WXLogUtils.d("test->", "DownLoad didHttpFinish on http" );
                 didHttpFinish(response);
             }else {
-                WXLogUtils.e("test->", "DownLoad end before activity created" );
+                WXLogUtils.d("test->", "DownLoad end before activity created" );
                 mResponse = response;
                 isResponseHasWait = true;
             }
@@ -238,7 +238,7 @@
         }
         this.isInstanceReady = true;
         if (isResponseHasWait){
-            WXLogUtils.e("test->", "preDownLoad didHttpFinish on ready" );
+            WXLogUtils.d("test->", "preDownLoad didHttpFinish on ready" );
             this.didHttpFinish(mResponse);
         }
 
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 959eab3..d9ef522 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -167,7 +167,7 @@
       long start = System.currentTimeMillis();
       WXEnvironment.sSDKInitStart = start;
       if(WXEnvironment.isApkDebugable(application)){
-        WXEnvironment.sLogLevel = LogLevel.INFO;
+        WXEnvironment.sLogLevel = LogLevel.DEBUG;
       }else{
         WXEnvironment.sLogLevel = LogLevel.WARN;
       }
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 9e0f2dc..cc3a8c8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -203,6 +203,8 @@
 
   private List<OnBackPressedHandler> mWXBackPressedHandlers;
 
+  private List<OnActivityResultHandler> mWXOnActivityResultHandlers;
+
   private WXSDKInstance mParentInstance;
 
   private String mRenderType = RenderTypes.RENDER_TYPE_NATIVE;
@@ -309,6 +311,20 @@
     boolean onBackPressed();
   }
 
+  public static abstract class OnActivityResultHandler {
+    private String id;
+
+    public OnActivityResultHandler(String id) {
+      this.id = id;
+    }
+
+    public abstract boolean onActivityResult(int requestCode, int resultCode, Intent data, String id);
+
+    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
+      return onActivityResult(requestCode, resultCode, data, id);
+    }
+  }
+
   /**
    * set make weexCore run in single process mode
    * @param flag true means weexCore run in single process mode or multi process mode
@@ -465,6 +481,15 @@
       WXBridgeManager.getInstance().setViewPortWidth(getInstanceId(), mInstanceViewPortWidth);
     }
   }
+  public void resetDeviceDisplayOfPage(){
+    WXBridgeManager.getInstance().setDeviceDisplayOfPage(getInstanceId(), WXViewUtils.getScreenWidth(getContext()), WXViewUtils.getScreenHeight(getContext()));
+  }
+  public void setPageKeepRawCssStyles(){
+    WXBridgeManager.getInstance().setPageArgument(getInstanceId(),"reserveCssStyles","true");
+  }
+  public void reloadPageLayout(){
+    WXBridgeManager.getInstance().reloadPageLayout(getInstanceId());
+  }
 
   public void setAutoAdjustDeviceWidth(boolean autoAdjustViewPort){
     this.mAutoAdjustDeviceWidth = autoAdjustViewPort;
@@ -776,7 +801,7 @@
   }
 
   public void onInstanceReady(){
-    WXLogUtils.e("test->","onInstanceReady");
+    WXLogUtils.d("test->","onInstanceReady");
     mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_CONTAINER_READY);
     if (!isPreInit && !isPreDownLoad){
       return;
@@ -943,7 +968,10 @@
     if (!isWS){
       return;
     }
-    WXErrorCode errorCode = WXErrorCode.WX_ERROR_WHITE_SCREEN;
+    WXErrorCode errorCode = createInstanceHeartBeat?WXErrorCode.WX_ERROR_WHITE_SCREEN:WXErrorCode.WHITE_SCREEN_RESPONSE_TIMEOUT;
+    if (WXBridgeManager.getInstance().isRebootExceedLimit()){
+      errorCode = WXErrorCode.WHITE_SCREEN_REBOOT_EXCEED_LIMIT;
+    }
     Map<String,String> args = new HashMap<>(1);
     String vieTreeMsg = WhiteScreenUtils.takeViewTreeSnapShot(this);
     args.put("viewTree",null == vieTreeMsg?"null viewTreeMsg":vieTreeMsg);
@@ -1523,6 +1551,16 @@
             WXLogUtils.w("Warning :Component tree has not build completely, onActivityResult can not be call!");
         }
     }
+
+
+    if (mWXOnActivityResultHandlers != null && !mWXOnActivityResultHandlers.isEmpty()) {
+      for (OnActivityResultHandler onActivityResultHandler : mWXOnActivityResultHandlers) {
+        if (onActivityResultHandler.onActivityResult(requestCode, resultCode, data)) {
+          break;
+        }
+      }
+    }
+
   }
 
 
@@ -1828,10 +1866,15 @@
         WXSDKManager.getInstance().destroyInstance(mInstanceId);
       }
 
-      if (mGlobalEventReceiver != null) {
-        getContext().unregisterReceiver(mGlobalEventReceiver);
-        mGlobalEventReceiver = null;
+      try {
+        if (mGlobalEventReceiver != null) {
+          getContext().unregisterReceiver(mGlobalEventReceiver);
+          mGlobalEventReceiver = null;
+        }
+      }catch (IllegalArgumentException e){
+        WXLogUtils.w(WXLogUtils.getStackTrace(e));
       }
+
       if (mRootComp != null) {
         mRootComp.destroy();
         mRootComp = null;
@@ -1854,6 +1897,18 @@
         mLayerOverFlowListeners.clear();
       }
 
+      if(mWXOnActivityResultHandlers != null && !mWXOnActivityResultHandlers.isEmpty()) {
+        mWXOnActivityResultHandlers.clear();
+      }
+
+      if(mWXBackPressedHandlers != null && !mWXBackPressedHandlers.isEmpty()) {
+        mWXBackPressedHandlers.clear();
+      }
+
+      if(mWXActionbarHandlers != null && !mWXActionbarHandlers.isEmpty()) {
+        mWXActionbarHandlers.clear();
+      }
+
       getFlatUIContext().destroy();
       mFlatGUIContext = null;
       mInstanceOnFireEventInterceptorList = null;
@@ -2010,6 +2065,24 @@
     }
   }
 
+  public synchronized void unRegisterOnActivityResultHandler(OnActivityResultHandler onActivityResultHandler) {
+    if(mWXOnActivityResultHandlers != null && onActivityResultHandler != null) {
+      mWXOnActivityResultHandlers.remove(onActivityResultHandler);
+    }
+  }
+
+  public synchronized void registerOnActivityResultHandler(OnActivityResultHandler onActivityResultHandler) {
+    if(onActivityResultHandler == null) {
+      return;
+    }
+
+    if(mWXOnActivityResultHandlers == null) {
+      mWXOnActivityResultHandlers = new ArrayList<>();
+    }
+    mWXOnActivityResultHandlers.add(onActivityResultHandler);
+  }
+
+
   public synchronized void registerBackPressedHandler(OnBackPressedHandler backPressedHandler) {
     if(backPressedHandler == null) {
       return;
diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java
index 9eee5b0..953bf2c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java
+++ b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXConfigAdapter.java
@@ -24,4 +24,6 @@
  */
 public interface IWXConfigAdapter {
     String getConfig(String nameSpace,String key,String defaultValue);
+    String getConfigWhenInit(String nameSpace,String key,String defaultValue);
+    boolean checkMode(String name);
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index 3020cf6..14181c1 100755
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -125,6 +125,8 @@
 
   public native void nativeOnInteractionTimeUpdate(String instanceId);
 
+  public native String nativeDumpIpcPageQueueInfo();
+
   /**
    * Update Init Framework Params
    * */
@@ -139,6 +141,10 @@
   private native void nativeSetViewPortWidth(String instanceId, float viewPortWidth);
   private native void nativeSetLogType(float type, float isPerf);
 
+  private native void nativeReloadPageLayout(String instanceId);
+
+  private native void nativeSetDeviceDisplayOfPage(String instanceId,float width,float height);
+
   public static final boolean MULTIPROCESS = true;
 
 
@@ -880,7 +886,7 @@
         params.put(IWXUserTrackAdapter.MONITOR_ERROR_CODE, statusCode);
         params.put(IWXUserTrackAdapter.MONITOR_ARG, "InitFrameworkNativeError");
         params.put(IWXUserTrackAdapter.MONITOR_ERROR_MSG, errorMsg);
-        Log.e("Dyy", "reportNativeInitStatus is running and errorCode is " + statusCode + " And errorMsg is " + errorMsg);
+        WXLogUtils.e("reportNativeInitStatus is running and errorCode is " + statusCode + " And errorMsg is " + errorMsg);
         userTrackAdapter.commit(null, null, IWXUserTrackAdapter.INIT_FRAMEWORK, null, params);
       }
 
@@ -919,4 +925,12 @@
   public void registerComponentOnDataRenderNode(String data) {
     nativeRegisterComponentOnDataRenderNode(data);
   }
+  public void reloadPageLayout(String instanceId){
+    nativeReloadPageLayout(instanceId);
+  }
+
+  public void setDeviceDisplayOfPage(String instanceId, float width, float height){
+    nativeSetDeviceDisplayOfPage(instanceId,width,height);
+  }
+
 }
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 c1a9616..72843a7 100755
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -189,6 +189,7 @@
   static volatile WXBridgeManager mBridgeManager;
   private static long LOW_MEM_VALUE = 120;
   public volatile static int reInitCount = 1;
+  private volatile static int sInitFrameWorkCount = 0;
   private static String crashUrl = null;
   private static long lastCrashTime = 0;
 
@@ -443,6 +444,17 @@
     }
   }
 
+  public String dumpIpcPageInfo(){
+    if (mWXBridge instanceof WXBridge){
+      return ((WXBridge)mWXBridge).nativeDumpIpcPageQueueInfo();
+    }
+    return "";
+  }
+
+  public boolean isRebootExceedLimit(){
+    return reInitCount > CRASHREINIT;
+  }
+
   public void stopRemoteDebug() {
     if (mWxDebugProxy != null) {
       try {
@@ -890,13 +902,15 @@
         } catch (Throwable e) {
           WXLogUtils.e(WXLogUtils.getStackTrace(e));
         }
-        WXStateRecord.getInstance().onJSCCrash();
+        WXStateRecord.getInstance().onJSCCrash(TextUtils.isEmpty(instanceId)?"null":instanceId);
         callReportCrash(crashFile, instanceId, url,extInfo);
       } else {
-        WXStateRecord.getInstance().onJSEngineReload();
+        WXStateRecord.getInstance().onJSEngineReload(TextUtils.isEmpty(instanceId)?"null":instanceId);
          commitJscCrashAlarmMonitor(IWXUserTrackAdapter.JS_BRIDGE, WXErrorCode.WX_ERR_RELOAD_PAGE, "reboot jsc Engine", instanceId, url,extInfo);
       }
 
+      WXLogUtils.e("reInitCount:"+reInitCount);
+
       if (reInitCount > CRASHREINIT) {
         WXExceptionUtils.commitCriticalExceptionRT("jsEngine", WXErrorCode.WX_ERR_RELOAD_PAGE_EXCEED_LIMIT,
             "callReportCrashReloadPage","reInitCount:"+reInitCount,extInfo);
@@ -2160,6 +2174,8 @@
 
           execRegisterFailTask();
           WXEnvironment.JsFrameworkInit = true;
+          sInitFrameWorkCount++;
+          WXLogUtils.e("initFrameWorkCount :"+ sInitFrameWorkCount);
           registerDomModule();
           trackComponentAndModulesTime();
         } else {
@@ -2274,6 +2290,25 @@
       customOptions.put("__enable_native_promise__","true");
     }
 
+    String enableAlarmSignal = "true";
+    IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter();
+    if (null != adapter){
+      try {
+        if (adapter.checkMode("white_screen_fix_open")){
+          WXEnvironment.isWsFixMode = true;
+          enableAlarmSignal = "true";
+        }else {
+          enableAlarmSignal = adapter.getConfigWhenInit("wxapm","enableAlarmSignal",enableAlarmSignal);
+          WXEnvironment.isWsFixMode = "true".equalsIgnoreCase(enableAlarmSignal);
+        }
+      }catch (Exception e){
+        e.printStackTrace();
+      }
+    }
+    if (null != enableAlarmSignal){
+      customOptions.put("enableAlarmSignal",enableAlarmSignal);
+    }
+    WXLogUtils.e("weex","enableAlarmSignal:"+enableAlarmSignal);
 
     wxParams.setOptions(customOptions);
     wxParams.setNeedInitV8(WXSDKManager.getInstance().needInitV8());
@@ -2530,7 +2565,6 @@
           } else {
             String errorMsg = new StringBuilder()
                 .append(WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg())
-                .append(", reportJSException >>>> instanceId:").append(instanceId)
                 .append(", exception function:").append(function)
                 .append(", exception:").append(exception)
                 .append(", extInitTime:").append(System.currentTimeMillis()-WXBridgeManager.sInitFrameWorkTimeOrigin).append("ms")
@@ -3580,6 +3614,22 @@
       mWXBridge.setViewPortWidth(instanceId,viewPortWidth);
     }
   }
+  public void setPageArgument(String instanceId,String key,String value){
+    if (isSkipFrameworkInit(instanceId) || isJSFrameworkInit()) {
+      mWXBridge.setPageArgument(instanceId,key,value);
+    }
+  }
+  public void reloadPageLayout(String instanceId){
+    if (isSkipFrameworkInit(instanceId) || isJSFrameworkInit()) {
+      mWXBridge.reloadPageLayout(instanceId);
+    }
+  }
+
+  public void setDeviceDisplayOfPage(String instanceId,float width,float height){
+    if (isSkipFrameworkInit(instanceId) || isJSFrameworkInit()) {
+      mWXBridge.setDeviceDisplayOfPage(instanceId,width,height);
+    }
+  }
 
   public int callHasTransitionPros(String instanceId, String ref, HashMap<String, String> styles) {
     WXComponent component = WXSDKManager.getInstance().getWXRenderManager().getWXComponent(instanceId, ref);
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
index 2898f13..a20b20f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
@@ -19,6 +19,8 @@
 package com.taobao.weex.bridge;
 
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXConfigAdapter;
 import com.taobao.weex.base.CalledByNative;
 import com.taobao.weex.utils.WXLogUtils;
 
@@ -142,6 +144,17 @@
     return deviceWidth;
   }
 
+  @CalledByNative
+  public boolean getReleaseMap() {
+    IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter();
+    if (null == adapter){
+      return false;
+    }
+    String doRelease = adapter.getConfigWhenInit("wxapm","release_map","true");
+    WXLogUtils.e("getReleaseMap:"+doRelease);
+    return "true".equalsIgnoreCase(doRelease);
+  }
+
 
   /**
    * Device should not be set manually, instead it suppose to represent the width of device and
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index da33222..479203d 100755
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -226,4 +226,9 @@
 
   void setViewPortWidth(String instanceId,float viewPortWidth);
 
+  void reloadPageLayout(String instanceId);
+
+  void setDeviceDisplayOfPage(String instanceId, float width, float height);
+
+
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
index e2435af..2434c12 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
@@ -126,7 +126,8 @@
   WX_ERR_RELOAD_PAGE_EXCEED_LIMIT("-2114", "RELOAD_PAGE_EXCEED_LIMIT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   WX_ERROR_WHITE_SCREEN("-2116", "WHITE_SCREEN",ErrorType.RENDER_ERROR,ErrorGroup.JS),
-
+  WHITE_SCREEN_RESPONSE_TIMEOUT("-2117", "WHITE_SCREEN_RESPONSE_TIMEOUT",ErrorType.RENDER_ERROR,ErrorGroup.JS),
+  WHITE_SCREEN_REBOOT_EXCEED_LIMIT("-2118", "WHITE_SCREEN_REBOOT_EXCEED_LIMIT",ErrorType.RENDER_ERROR,ErrorGroup.JS),
 
   /**
    *
@@ -219,6 +220,7 @@
   WX_RENDER_ERR_NULL_KEY("-9603", "WX_RENDER_ERR_NULL_KEY", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
   WX_RENDER_ERR_NATIVE_RUNTIME("-9604", "WX_RENDER_ERR for js error", ErrorType.RENDER_ERROR, ErrorGroup.NATIVE),
   WX_RENDER_ERR_COMPONENT_NOT_REGISTER("-9605", "WX_RENDER_ERR_COMPONENT_NOT_REGISTER", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
+  WX_RENDER_ERR_COMPONENT_ATTR_KEY("-9606", "The key passed to Component.updateAttr() is not string", ErrorType.NATIVE_ERROR, ErrorGroup.JS),
   WX_RENDER_ERR_BRIDGE_ARG_NULL("-9610", "WX_RENDER_ERR_BRIDGE_ARG_NULL", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
   WX_RENDER_ERR_CONTAINER_TYPE("-9611", "WX_RENDER_ERR_CONTAINER_TYPE", ErrorType.JS_ERROR,ErrorGroup.JS),
   WX_RENDER_ERR_TRANSITION("-9616", "WX_RENDER_ERR_TRANSITION", ErrorType.JS_ERROR, ErrorGroup.JS),
@@ -227,8 +229,8 @@
   WX_RENDER_ERR_TEXTURE_SETBACKGROUND("-9620", "WX_RENDER_ERR_TEXTURE_SETBACKGROUND", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
   WX_RENDER_WAR_GPU_LIMIT_LAYOUT("-9621", "WX_RENDER_WAR_GPU_LIMIT_LAYOUT", ErrorType.JS_ERROR,ErrorGroup.JS),
 
-  WX_KEY_EXCEPTION_HERON("-9900", "Error of Heron engine: ", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_HERON_RENDER("-9901", "Render error of Heron engine: ", ErrorType.RENDER_ERROR, ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_HERON("Heron_-9900", "Error of Heron engine: ", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_HERON_RENDER("Heron_-9901", "Render error of Heron engine: ", ErrorType.RENDER_ERROR, ErrorGroup.NATIVE),
 
   WX_KEY_EXCEPTION_NO_BUNDLE_TYPE("-9801", "Fatal Error : No bundle type in js bundle head, cause white screen or memory leak!!", ErrorType.JS_ERROR, ErrorGroup.JS),
   /**
@@ -270,7 +272,7 @@
 
   WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED_JS("-1006", "degradeToH5|createInstance fail|wx_create_instance_error",ErrorType.DEGRAD_ERROR,ErrorGroup.JS),
 
-  WX_DEGRAD_EAGLE_RENDER_ERROR ("-1007", "degradeToH5|eagleRenderErr", ErrorType.DEGRAD_ERROR, ErrorGroup.JS),
+  WX_DEGRAD_EAGLE_RENDER_ERROR ("Eagle_-1007", "degradeToH5|eagleRenderErr", ErrorType.DEGRAD_ERROR, ErrorGroup.NATIVE),
 
   WX_ERR_HASH_MAP_TMP("-10010", "WX_ERR_HASH_MAP_TMP",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java b/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java
index 3510d54..ed4df79 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXWorkThreadManager.java
@@ -18,13 +18,21 @@
  */
 package com.taobao.weex.common;
 
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 /**
- * Class for managing work thread
+ * Class for managing work thread.
+ *
+ * <p>
+ *  This class is for internal purpose,
+ *  please don't use it directly unless you know what you are doing.
+ * </p>
  */
-public final class WXWorkThreadManager {
+@RestrictTo(Scope.LIBRARY_GROUP)
+public class WXWorkThreadManager {
 
   private ExecutorService singleThreadExecutor;
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
index d75e271..4f99696 100644
--- a/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXInstanceApm.java
@@ -391,7 +391,7 @@
         exceptionRecord.clear();
         mUIHandler.removeCallbacks(jsPerformanceCallBack);
         onStage(KEY_PAGE_STAGES_DESTROY);
-        if (!mHasInit){
+        if (mHasInit && null != apmInstance){
             apmInstance.onEnd();
         }
         mEnd = true;
@@ -418,13 +418,13 @@
         Long interaction = stageMap.get(KEY_PAGE_STAGES_INTERACTION);
         Long containerReady = stageMap.get(KEY_PAGE_STAGES_CONTAINER_READY);
         if (null != endDownLoad && null != startDownLoad){
-            WXLogUtils.e("test->", "downLoadTime: "+ (endDownLoad - startDownLoad));
+            WXLogUtils.d("test->", "downLoadTime: "+ (endDownLoad - startDownLoad));
         }
         if (null != endDownLoad && null != interaction){
-            WXLogUtils.e("test->", "renderTime: "+ (interaction - endDownLoad));
+            WXLogUtils.d("test->", "renderTime: "+ (interaction - endDownLoad));
         }
         if (null != containerReady && null !=interaction){
-            WXLogUtils.e("test->", "showTime: "+ (interaction - containerReady));
+            WXLogUtils.d("test->", "showTime: "+ (interaction - containerReady));
         }
 
     }
diff --git a/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java b/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java
index a95e957..0711af2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java
+++ b/android/sdk/src/main/java/com/taobao/weex/performance/WXStateRecord.java
@@ -28,6 +28,8 @@
 import java.util.concurrent.ConcurrentLinkedQueue;
 
 import android.support.annotation.NonNull;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXConfigAdapter;
 import com.taobao.weex.bridge.WXBridgeManager;
 import com.taobao.weex.ui.IFComponentHolder;
 import com.taobao.weex.utils.WXUtils;
@@ -102,15 +104,15 @@
     /**
      * check onJSEngineReload time,and we know how many times reload and each reload time
      */
-    public void onJSEngineReload() {
-        recordCommon(mJscReloadHistory,new Info(WXUtils.getFixUnixTime(), "", "onJSEngineReload"));
+    public void onJSEngineReload(String instanceId) {
+        recordCommon(mJscReloadHistory,new Info(WXUtils.getFixUnixTime(), instanceId, "onJSEngineReload"));
     }
 
     /**
      * check jsc crash time,and we know how many times jscCrash and each crash time
      */
-    public void onJSCCrash() {
-        recordCommon(mJscCrashHistory,new Info(WXUtils.getFixUnixTime(), "", "onJSCCrash"));
+    public void onJSCCrash(String instanceId) {
+        recordCommon(mJscCrashHistory,new Info(WXUtils.getFixUnixTime(), instanceId, "onJSCCrash"));
     }
 
     private void recordCommon(RecordList<Info> list ,Info info){
@@ -145,6 +147,10 @@
         Collections.sort(reportTimeLineInfo);
         stateInfo.put("stateInfoList",reportTimeLineInfo.toString());
 
+        IWXConfigAdapter adapter = WXSDKManager.getInstance().getWxConfigAdapter();
+        if (null != adapter && "true".equalsIgnoreCase(adapter.getConfig("wxapm","dumpIpcPageInfo","true"))){
+            stateInfo.put("pageQueueInfo",WXBridgeManager.getInstance().dumpIpcPageInfo());
+        }
         return stateInfo;
     }
 
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 e7be2ff..17630e1 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
@@ -707,7 +707,19 @@
     }
 
     for (Map.Entry<String, Object> entry : props.entrySet()) {
-      String key = entry.getKey();
+      Object key_obj = entry.getKey();
+      String key = WXUtils.getString(key_obj, null);
+      if ((key != null) && !(key_obj instanceof String)) {
+        Map<String, String> map = new HashMap<>();
+        map.put("componentType", getComponentType());
+        map.put("actual key", key == null ? "" : key);
+        WXExceptionUtils.commitCriticalExceptionRT(getInstanceId(),
+            WXErrorCode.WX_RENDER_ERR_COMPONENT_ATTR_KEY,
+            "WXComponent.updateProperties",
+            WXErrorCode.WX_RENDER_ERR_COMPONENT_ATTR_KEY.getErrorMsg(),
+            map);
+      }
+
       Object param = entry.getValue();
       String value = WXUtils.getString(param, null);
 
@@ -980,7 +992,7 @@
       mInstance.getWXPerformance().cellExceedNum++;
       if (WXAnalyzerDataTransfer.isOpenPerformance){
         WXAnalyzerDataTransfer.transferPerformance(getInstanceId(),"details",WXInstanceApm.KEY_PAGE_STATS_CELL_EXCEED_NUM,
-            String.format(Locale.ROOT, "cell:[w:%d,h:%d],attrs:%s,styles:%s",realWidth,realHeight,getAttrs(),getStyles())
+            String.format(Locale.ROOT, "cell:ref:%s,[w:%d,h:%d],attrs:%s,styles:%s",getRef(),realWidth,realHeight,getAttrs(),getStyles())
         );
       }
 
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 eba3b3f..0db53a8 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
@@ -832,7 +832,7 @@
     }
 
     boolean isRemoveAnimation = false;
-    Object attr = getAttrs().get(Constants.Name.DELETE_CELL_ANIMATION);
+    Object attr = child.getAttrs().get(Constants.Name.DELETE_CELL_ANIMATION);
     if (Constants.Value.DEFAULT.equals(attr)) {
       isRemoveAnimation = true;
     }
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/module/WXDomModule.java b/android/sdk/src/main/java/com/taobao/weex/ui/module/WXDomModule.java
index 8f8c957..08ce054 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/module/WXDomModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/module/WXDomModule.java
@@ -18,6 +18,8 @@
  */
 package com.taobao.weex.ui.module;
 
+import android.support.annotation.RestrictTo;
+import android.support.annotation.RestrictTo.Scope;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXSDKInstance;
@@ -41,8 +43,14 @@
  * <p>
  *   This module is work different with other regular module, method is invoked directly, without reflection.
  * </p>
+ *
+ * <p>
+ *  This class is for internal purpose,
+ *  please don't use it directly unless you know what you are doing.
+ * </p>
  */
-public final class WXDomModule extends WXModule {
+@RestrictTo(Scope.LIBRARY_GROUP)
+public class WXDomModule extends WXModule {
 
   /** package **/
   public static final String SCROLL_TO_ELEMENT = "scrollToElement";
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXFileUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXFileUtils.java
index 05933a1..094ce98 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXFileUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXFileUtils.java
@@ -87,7 +87,7 @@
     return "";
   }
 
-  private static String readStreamToString(InputStream inputStream) {
+  public static String readStreamToString(InputStream inputStream) {
     BufferedReader bufferedReader = null;
     try {
       StringBuilder builder = new StringBuilder(inputStream.available() + 10);
diff --git a/android/sdk/wrap.sh b/android/sdk/wrap.sh
new file mode 100644
index 0000000..2b0dfbe
--- /dev/null
+++ b/android/sdk/wrap.sh
@@ -0,0 +1,11 @@
+#!/system/bin/sh
+HERE="$(cd "$(dirname "$0")" && pwd)"
+export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1,use_sigaltstack=0
+ASAN_LIB=$(ls $HERE/libclang_rt.asan-*-android.so)
+if [ -f "$HERE/libc++_shared.so" ]; then
+    # Workaround for https://github.com/android-ndk/ndk/issues/988.
+    export LD_PRELOAD="$ASAN_LIB $HERE/libc++_shared.so"
+else
+    export LD_PRELOAD="$ASAN_LIB"
+fi
+"$@"
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
index 0948d5c..feda1d7 100644
--- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
+++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
@@ -218,7 +218,6 @@
 		74A4BA9B1CB3BAA100195969 /* WXThreadSafeMutableDictionary.m in Sources */ = {isa = PBXBuildFile; fileRef = 74A4BA991CB3BAA100195969 /* WXThreadSafeMutableDictionary.m */; };
 		74A4BA9E1CB3C0A100195969 /* WXHandlerFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 74A4BA9C1CB3C0A100195969 /* WXHandlerFactory.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		74A4BA9F1CB3C0A100195969 /* WXHandlerFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 74A4BA9D1CB3C0A100195969 /* WXHandlerFactory.m */; };
-		74A4BAA61CB4F98300195969 /* WXStreamModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 74A4BAA41CB4F98300195969 /* WXStreamModule.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		74A4BAA71CB4F98300195969 /* WXStreamModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 74A4BAA51CB4F98300195969 /* WXStreamModule.m */; };
 		74AD99841D5B0E59008F0336 /* WXPolyfillSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 74AD99821D5B0E59008F0336 /* WXPolyfillSet.h */; };
 		74AD99851D5B0E59008F0336 /* WXPolyfillSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 74AD99831D5B0E59008F0336 /* WXPolyfillSet.m */; };
@@ -613,7 +612,6 @@
 		D334510D1D3E19B80083598A /* WXCanvasModule.m in Sources */ = {isa = PBXBuildFile; fileRef = D334510B1D3E19B80083598A /* WXCanvasModule.m */; };
 		D362F94F1C83EDA20003F546 /* WXWebViewModule.h in Headers */ = {isa = PBXBuildFile; fileRef = D362F94D1C83EDA20003F546 /* WXWebViewModule.h */; };
 		D362F9501C83EDA20003F546 /* WXWebViewModule.m in Sources */ = {isa = PBXBuildFile; fileRef = D362F94E1C83EDA20003F546 /* WXWebViewModule.m */; };
-		D3FC0DF71C508B2A002B9E31 /* WXTimerModule.h in Headers */ = {isa = PBXBuildFile; fileRef = D3FC0DF51C508B2A002B9E31 /* WXTimerModule.h */; };
 		D3FC0DF81C508B2A002B9E31 /* WXTimerModule.m in Sources */ = {isa = PBXBuildFile; fileRef = D3FC0DF61C508B2A002B9E31 /* WXTimerModule.m */; };
 		D735F1B022D761F800B53CDF /* log_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = D735F1AB22D761F800B53CDF /* log_utils.h */; };
 		D735F1B122D761F800B53CDF /* log_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = D735F1AB22D761F800B53CDF /* log_utils.h */; };
@@ -888,6 +886,8 @@
 		ED053501207F4DEB007B4568 /* JSContext+Weex.h in Headers */ = {isa = PBXBuildFile; fileRef = ED0534FE207F4DEB007B4568 /* JSContext+Weex.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		ED053502207F4DEB007B4568 /* JSContext+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0534FF207F4DEB007B4568 /* JSContext+Weex.m */; };
 		ED053503207F4DEB007B4568 /* JSContext+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = ED0534FF207F4DEB007B4568 /* JSContext+Weex.m */; };
+		F75C58EB2313C03C002FFF94 /* WXTimerModule.h in Headers */ = {isa = PBXBuildFile; fileRef = D3FC0DF51C508B2A002B9E31 /* WXTimerModule.h */; };
+		F75C591C2313C1FC002FFF94 /* WXStreamModule.h in Headers */ = {isa = PBXBuildFile; fileRef = 74A4BAA41CB4F98300195969 /* WXStreamModule.h */; settings = {ATTRIBUTES = (Public, ); }; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -2410,8 +2410,8 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				F75C591C2313C1FC002FFF94 /* WXStreamModule.h in Headers */,
 				74A4BA9E1CB3C0A100195969 /* WXHandlerFactory.h in Headers */,
-				74A4BAA61CB4F98300195969 /* WXStreamModule.h in Headers */,
 				59A583081CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h in Headers */,
 				2A837AB61CD9DE9200AEDF03 /* WXRefreshComponent.h in Headers */,
 				2A919DA61E321F1F006EB6B5 /* WXBridgeMethod.h in Headers */,
@@ -2466,7 +2466,6 @@
 				DC6836E61EBB12B200AD2D84 /* WXConfigCenterProtocol.h in Headers */,
 				DC7764941F3C2CA300B5727E /* WXRecyclerDragController.h in Headers */,
 				77788B712229252D000D5102 /* render_page_custom.h in Headers */,
-				74A4BAA61CB4F98300195969 /* WXStreamModule.h in Headers */,
 				B8D66CB321255730003960BD /* make_copyable.h in Headers */,
 				740451EA1E14BB26004157CB /* WXServiceFactory.h in Headers */,
 				744BEA591D0520F300452B5D /* WXComponent+Layout.h in Headers */,
@@ -2484,6 +2483,7 @@
 				591DD3321D23AD5800BE8709 /* WXErrorView.h in Headers */,
 				B8D66C8D21255730003960BD /* render_creator.h in Headers */,
 				17C74F0B2072145100AB4CAB /* WXAnalyzerCenter+Transfer.h in Headers */,
+				F75C58EB2313C03C002FFF94 /* WXTimerModule.h in Headers */,
 				D362F94F1C83EDA20003F546 /* WXWebViewModule.h in Headers */,
 				C4F012861E150307003378D0 /* WXWebSocketLoader.h in Headers */,
 				77D161381C02DE940010B15B /* WXBridgeManager.h in Headers */,
@@ -2552,7 +2552,6 @@
 				B8D66C5B21255730003960BD /* render_action_add_element.h in Headers */,
 				745B2D701E5A8E1E0092D38A /* WXSectionDataController.h in Headers */,
 				745B2D6E1E5A8E1E0092D38A /* WXRecyclerUpdateController.h in Headers */,
-				D3FC0DF71C508B2A002B9E31 /* WXTimerModule.h in Headers */,
 				D312CE3B1C730DEB00046D68 /* WXWebComponent.h in Headers */,
 				741081261CEDB4EC001BC6E5 /* WXComponent_internal.h in Headers */,
 				77E65A191C155F25008B8775 /* WXScrollerComponent.h in Headers */,
@@ -2992,11 +2991,14 @@
 					};
 					74C8963C1D2AC2210043B82A = {
 						CreatedOnToolsVersion = 8.0;
+						DevelopmentTeam = 5783442933;
 						DevelopmentTeamName = "Nanjing Taobao Software Co., Ltd.";
-						ProvisioningStyle = Manual;
+						ProvisioningStyle = Automatic;
 					};
 					77D160FC1C02DBE70010B15B = {
 						CreatedOnToolsVersion = 7.1.1;
+						DevelopmentTeam = 5783442933;
+						ProvisioningStyle = Automatic;
 					};
 					DCA445241EFA555400D0CFA8 = {
 						CreatedOnToolsVersion = 8.3.3;
@@ -3562,7 +3564,9 @@
 				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-				DEVELOPMENT_TEAM = "";
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = 5783442933;
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/WeexSDK/Dependency",
@@ -3578,6 +3582,7 @@
 				OTHER_LDFLAGS = "-ObjC";
 				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.weex.WeexSDKTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 			};
 			name = Debug;
 		};
@@ -3587,7 +3592,9 @@
 				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
-				DEVELOPMENT_TEAM = "";
+				CODE_SIGN_IDENTITY = "iPhone Developer";
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = 5783442933;
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/WeexSDK/Dependency",
@@ -3603,6 +3610,7 @@
 				OTHER_LDFLAGS = "-ObjC";
 				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.weex.WeexSDKTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 			};
 			name = Release;
 		};
@@ -3735,9 +3743,10 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				CODE_SIGN_STYLE = Automatic;
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
 				DEFINES_MODULE = YES;
-				DEVELOPMENT_TEAM = "";
+				DEVELOPMENT_TEAM = 5783442933;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -3775,6 +3784,7 @@
 				PODS_ROOT = "";
 				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexSDK;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 				SKIP_INSTALL = YES;
 				VALID_ARCHS = "arm64 armv7 x86_64 i386";
 				WARNING_CFLAGS = "";
@@ -3792,8 +3802,9 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+				CODE_SIGN_STYLE = Automatic;
 				DEFINES_MODULE = YES;
-				DEVELOPMENT_TEAM = "";
+				DEVELOPMENT_TEAM = 5783442933;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -3831,6 +3842,7 @@
 				PODS_ROOT = "";
 				PRODUCT_BUNDLE_IDENTIFIER = com.taobao.WeexSDK;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				PROVISIONING_PROFILE_SPECIFIER = "";
 				SKIP_INSTALL = YES;
 				VALID_ARCHS = "arm64 armv7 x86_64 i386";
 				WARNING_CFLAGS = "";
diff --git a/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme b/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme
index 5b77be4..d098707 100644
--- a/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme
+++ b/ios/sdk/WeexSDK.xcodeproj/xcshareddata/xcschemes/WeexSDKTests.xcscheme
@@ -8,7 +8,7 @@
       <BuildActionEntries>
          <BuildActionEntry
             buildForTesting = "YES"
-            buildForRunning = "YES"
+            buildForRunning = "NO"
             buildForProfiling = "NO"
             buildForArchiving = "NO"
             buildForAnalyzing = "NO">
@@ -39,6 +39,15 @@
             </BuildableReference>
          </TestableReference>
       </Testables>
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
+            BuildableName = "WeexSDKTests.xctest"
+            BlueprintName = "WeexSDKTests"
+            ReferencedContainer = "container:WeexSDK.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
       <AdditionalOptions>
       </AdditionalOptions>
    </TestAction>
@@ -52,15 +61,6 @@
       debugDocumentVersioning = "YES"
       debugServiceExtension = "internal"
       allowLocationSimulation = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
-            BuildableName = "WeexSDKTests.xctest"
-            BlueprintName = "WeexSDKTests"
-            ReferencedContainer = "container:WeexSDK.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <AdditionalOptions>
       </AdditionalOptions>
    </LaunchAction>
@@ -70,15 +70,6 @@
       savedToolIdentifier = ""
       useCustomWorkingDirectory = "NO"
       debugDocumentVersioning = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "74C8963C1D2AC2210043B82A"
-            BuildableName = "WeexSDKTests.xctest"
-            BlueprintName = "WeexSDKTests"
-            ReferencedContainer = "container:WeexSDK.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
    </ProfileAction>
    <AnalyzeAction
       buildConfiguration = "Debug">
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/JSContext+Weex.h b/ios/sdk/WeexSDK/Sources/Bridge/JSContext+Weex.h
index 3d1c378..683d42b 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/JSContext+Weex.h
+++ b/ios/sdk/WeexSDK/Sources/Bridge/JSContext+Weex.h
@@ -19,8 +19,12 @@
 
 #import <JavaScriptCore/JavaScriptCore.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface JSContext (Weex)
 
-@property (nonatomic, strong) NSString *instanceId;
+@property (nonatomic, strong) NSString * _Nullable instanceId;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index 89287e5..922986b 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -792,26 +792,7 @@
     }
     
     WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
-    if (sdkInstance.dataRender) {
-        if (_dataRenderHandler) {
-            WXPerformBlockOnComponentThread(^{
-                [_dataRenderHandler destroyDataRenderInstance:instance];
-                WXPerformBlockOnBridgeThreadForInstance(^{
-                    [self callJSMethod:@"destroyInstance" args:@[instance]];
-                }, instance);
-            });
-        }
-        else {
-            WXComponentManager *manager = sdkInstance.componentManager;
-            if (manager.isValid) {
-                WXSDKErrCode errorCode = WX_KEY_EXCEPTION_DEGRADE_EAGLE_RENDER_ERROR;
-                NSError *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:errorCode userInfo:@{@"message":@"No data render handler found!"}];
-                WXPerformBlockOnComponentThread(^{
-                    [manager renderFailed:error];
-                });
-            }
-        }
-    } else {
+    if (!sdkInstance.wlasmRender) {
         [self callJSMethod:@"destroyInstance" args:@[instance]];
     }
 }
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.h b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.h
index 40c9f9a..a6f25e6 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.h
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeMethod.h
@@ -18,6 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
 @class WXSDKInstance;
 
 @interface WXBridgeMethod : NSObject
@@ -27,10 +30,11 @@
 @property (nonatomic, weak, readonly) WXSDKInstance *instance;
 
 - (instancetype)initWithMethodName:(NSString *)methodName
-                         arguments:(NSArray *)arguments
+                         arguments:(NSArray * _Nullable)arguments
                           instance:(WXSDKInstance *)instance;
 
 - (NSInvocation *)invocationWithTarget:(id)target selector:(SEL)selector;
 
 @end
 
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
index 44cd38b..e241609 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -1538,11 +1538,14 @@
         env->AddOption("scale", "1");
         env->AddOption("pixel_scale", std::to_string([[UIScreen mainScreen] scale]));
         
+        // Here we initialize weex device width and height using portrait by default.
         CGSize screenSize = [UIScreen mainScreen].bounds.size;
-        env->SetDeviceWidth(std::to_string(screenSize.width));
-        env->SetDeviceHeight(std::to_string(screenSize.height));
-        env->AddOption("screen_width_pixels", std::to_string(screenSize.width));
-        env->AddOption("screen_height_pixels", std::to_string(screenSize.height));
+        CGFloat w = MIN(screenSize.width, screenSize.height);
+        CGFloat h = MAX(screenSize.width, screenSize.height);
+        env->SetDeviceWidth(std::to_string(w));
+        env->SetDeviceHeight(std::to_string(h));
+        env->AddOption("screen_width_pixels", std::to_string(w));
+        env->AddOption("screen_height_pixels", std::to_string(h));
         
         weex::base::LogImplement::getLog()->setLogImplement(new WeexCore::LogBridgeIOS());
         
@@ -1552,8 +1555,6 @@
         weex::base::LogImplement::getLog()->setDebugMode(false);
 #endif
         
-        
-        
         platformBridge = new WeexCore::PlatformBridge();
         platformBridge->set_platform_side(new WeexCore::IOSSide());
         platformBridge->set_core_side(new WeexCore::CoreSideInPlatform());
@@ -1650,6 +1651,7 @@
 + (void)closePage:(NSString*)pageId
 {
     if (platformBridge) {
+        platformBridge->core_side()->DestroyInstance([pageId UTF8String]);
         platformBridge->core_side()->OnInstanceClose([pageId UTF8String] ?: "");
     }
 }
diff --git a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.h b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.h
index 5a25efd..e0fa57d 100644
--- a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.h
@@ -17,8 +17,12 @@
  * under the License.
  */
 
-#import "WXScrollerComponent.h"
+#import <WeexSDK/WXScrollerComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXRecyclerComponent : WXScrollerComponent
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXAComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXAComponent.h
index 76fb1b5..f707999 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXAComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXAComponent.h
@@ -17,8 +17,12 @@
  * under the License.
  */
 
-#import "WXComponent.h"
+#import <WeexSDK/WXComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXAComponent : WXComponent <UIGestureRecognizerDelegate>
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.h
index f95080c..06ec71e 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXIndicatorComponent.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXComponent.h"
+#import <WeexSDK/WXComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 typedef enum
 {
@@ -50,3 +52,5 @@
 @property (nonatomic, weak) id<WXIndicatorComponentDelegate> delegate;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXListComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXListComponent.h
index f2b75fa..563e622 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXListComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXListComponent.h
@@ -17,8 +17,12 @@
  * under the License.
  */
 
-#import "WXScrollerComponent.h"
+#import <WeexSDK/WXScrollerComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXListComponent : WXScrollerComponent
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.h
index 8b22816..f34ed94 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXComponent.h"
+#import <WeexSDK/WXComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 #define  REFRESH_DISTANCE_Y                 @"dy"
 #define  REFRESH_PULLINGDISTANCE            @"pullingDistance"
@@ -36,3 +38,5 @@
 - (void)setDisplay;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXRichText.h b/ios/sdk/WeexSDK/Sources/Component/WXRichText.h
index 7beb8a5..e8cdaa8 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXRichText.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXRichText.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXComponent.h"
+#import <WeexSDK/WXComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXRichText : WXComponent<UITextViewDelegate>
 - (void)addChildNode:(NSString *)type ref:(NSString*)ref styles:(NSDictionary*)styles attributes:(NSDictionary*)attributes  toSuperNodeRef:(NSString *)superNodeRef;
@@ -25,3 +27,5 @@
 - (void)updateChildNodeStyles:(NSDictionary *)styles ref:(NSString*)ref parentRef:(NSString*)parentRef;
 - (void)removeChildNode:(NSString*)ref superNodeRef:(NSString *)superNodeRef;
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
index ff27871..687aa80 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
@@ -17,14 +17,16 @@
  * under the License.
  */
 
-#import "WXScrollerProtocol.h"
-#import "WXComponent.h"
+#import <WeexSDK/WXScrollerProtocol.h>
+#import <WeexSDK/WXComponent.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXScrollerComponent : WXComponent <WXScrollerProtocol, UIScrollViewDelegate>
 
 @property (nonatomic, copy) void (^onScroll)(UIScrollView *scrollView);
 
-@property (nonatomic, copy) void (^scrollEventListener)(WXScrollerComponent* sender, NSString* event, NSDictionary* params);
+@property (nonatomic, copy) void (^scrollEventListener)(WXScrollerComponent* sender, NSString* event, NSDictionary* _Nullable params);
 
 @property (nonatomic, assign) NSUInteger loadmoreretry;
 
@@ -36,3 +38,4 @@
 
 @end
 
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm
index ee20118..4d3f4c9 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm
@@ -226,7 +226,11 @@
         //may be list
         if ([@"scroller" isEqualToString:type]) {
             [weexInstance.apmInstance updateDiffStats:KEY_PAGE_STATS_SCROLLER_NUM withDiffValue:1];
-        }        
+        }
+
+        if (weexInstance.instanceCallback) {
+            weexInstance.instanceCallback(weexInstance, WXScrollerComponentCreatedCallback, self);
+        }
     }
     
     return self;
diff --git a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.h b/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.h
index 221c6c8..fe1d4df 100644
--- a/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.h
+++ b/ios/sdk/WeexSDK/Sources/Controller/WXBaseViewController.h
@@ -19,6 +19,8 @@
 
 #import <UIKit/UIKit.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 /**
  * The WXBaseViewController class provides the infrastructure for managing the weex view in your app. It is 
  * responsible for creating a weex instance or rendering the weex view, for observing the lifecycle of the
@@ -44,3 +46,5 @@
 - (void)refreshWeex;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Controller/WXRootViewController.h b/ios/sdk/WeexSDK/Sources/Controller/WXRootViewController.h
index 6fb6cb8..6cf8143 100644
--- a/ios/sdk/WeexSDK/Sources/Controller/WXRootViewController.h
+++ b/ios/sdk/WeexSDK/Sources/Controller/WXRootViewController.h
@@ -19,6 +19,8 @@
 
 #import <UIKit/UIKit.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 /**
  * The WXRootViewController class inherited from UINavigationController class which implements a specialized
  * view controller that manages the navigation of hierarchical content. Developing an iOS application, you
@@ -42,3 +44,5 @@
 - (id)initWithSourceURL:(NSURL *)sourceURL;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.h b/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.h
index f2e0430..5fb9c38 100644
--- a/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.h
+++ b/ios/sdk/WeexSDK/Sources/Debug/WXDebugTool.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXDebugTool : NSObject<WXModuleProtocol>
 
@@ -42,7 +44,7 @@
 
 + (NSString*)getReplacedJSFramework;
 
-+ (BOOL) cacheJsService: (NSString *)name withScript: (NSString *)script withOptions: (NSDictionary *) options;
++ (BOOL) cacheJsService: (NSString *)name withScript: (NSString *)script withOptions: (NSDictionary * _Nullable) options;
 
 + (BOOL) removeCacheJsService: (NSString *)name;
 
@@ -53,3 +55,5 @@
 + (void)setRemoteTracing:(BOOL)isRemoteTracing;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Eagle/WXDataRenderHandler.h b/ios/sdk/WeexSDK/Sources/Eagle/WXDataRenderHandler.h
index 08bb818..b54b401 100644
--- a/ios/sdk/WeexSDK/Sources/Eagle/WXDataRenderHandler.h
+++ b/ios/sdk/WeexSDK/Sources/Eagle/WXDataRenderHandler.h
@@ -19,11 +19,13 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @protocol WXDataRenderHandler <NSObject>
     
-- (void)createPage:(NSString *)pageId template:(NSString *)jsBundleString options:(NSDictionary *)options  data:(id)data;
+- (void)createPage:(NSString *)pageId template:(NSString *)jsBundleString options:(NSDictionary * _Nullable)options  data:(id)data;
 
-- (void)createPage:(NSString *)pageId contents:(NSData *)contents options:(NSDictionary *)options data:(id)data;
+- (void)createPage:(NSString *)pageId contents:(NSData *)contents options:(NSDictionary * _Nullable)options data:(id)data;
 
 - (void)callUpdateComponentData:(NSString*)pageId componentId:(NSString*)componentId jsonData:(NSString*)jsonData;
 
@@ -31,14 +33,16 @@
 
 - (void)refreshDataRenderInstance:(NSString *)pageId data:(NSString *)data;
 
-- (void)fireEvent:(NSString *)pageId ref:(NSString *)ref event:(NSString *)event args:(NSDictionary *)args domChanges:(NSDictionary *)domChanges;
+- (void)fireEvent:(NSString *)pageId ref:(NSString *)ref event:(NSString *)event args:(NSDictionary * _Nullable)args domChanges:(NSDictionary * _Nullable)domChanges;
 
 - (void)registerModules:(NSDictionary *)modules;
     
 - (void)registerComponents:(NSArray *)components;
     
-- (void)invokeCallBack:(NSString *)pageId function:(NSString *)funcId args:(NSDictionary *)args keepAlive:(BOOL)keepAlive;
+- (void)invokeCallBack:(NSString *)pageId function:(NSString *)funcId args:(NSDictionary * _Nullable)args keepAlive:(BOOL)keepAlive;
 
 - (void)DispatchPageLifecycle:(NSString *)pageId;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
index 9d70c9d..25cbd79 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKEngine.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @class WXSDKInstance;
 
 @interface WXSDKEngine : NSObject
@@ -68,7 +70,7 @@
  * @param properties properties to apply to the component
  *
  */
-+ (void)registerComponent:(NSString *)name withClass:(Class)clazz withProperties:(NSDictionary *)properties;
++ (void)registerComponent:(NSString *)name withClass:(Class)clazz withProperties:(NSDictionary * _Nullable)properties;
 
 /**
  * @abstract Registers a component for a given name, options and js code
@@ -80,7 +82,7 @@
  * @param serviceScript service js code to invoke
  *
  */
-+ (void)registerService:(NSString *)name withScript:(NSString *)serviceScript withOptions:(NSDictionary *)options;
++ (void)registerService:(NSString *)name withScript:(NSString *)serviceScript withOptions:(NSDictionary * _Nullable)options;
 
 /**
  * @abstract Registers a component for a given name, options and js code
@@ -94,7 +96,7 @@
  * @param completion Completion callback. JS is executed in asynchronously.
  *
  */
-+ (void)registerService:(NSString *)name withScript:(NSString *)serviceScript withOptions:(NSDictionary *)options completion:(void(^)(BOOL result))completion;
++ (void)registerService:(NSString *)name withScript:(NSString *)serviceScript withOptions:(NSDictionary * _Nullable)options completion:(nullable void(^)(BOOL result))completion;
 
 /**
  * @abstract Registers a component for a given name, options and js url
@@ -106,7 +108,7 @@
  * @param serviceScriptUrl The service url to register
  *
  */
-+ (void)registerService:(NSString *)name withScriptUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary *)options;
++ (void)registerService:(NSString *)name withScriptUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary * _Nullable)options;
 
 /**
  * @abstract Registers a component for a given name, options and js url
@@ -120,7 +122,7 @@
  * @param completion Completion callback. JS is executed in asynchronously.
  *
  */
-+ (void)registerService:(NSString *)name withScriptUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary *)options completion:(void(^)(BOOL result))completion;
++ (void)registerService:(NSString *)name withScriptUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary * _Nullable)options completion:(nullable void (^)(BOOL result))completion;
 
 /**
  * @abstract Registers a component for a given name, options and js code
@@ -238,3 +240,5 @@
 + (void)initSDKEnviroment:(NSString *)script DEPRECATED_MSG_ATTRIBUTE("To fix typo,  use initSDKEnvironment: method instead.");
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
index ddbfc19..b628b06 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXSDKInstance.h"
+#import <WeexSDK/WXSDKInstance.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 #define WX_ERROR_GROUP_NATIVE   @"NATIVE"
 #define WX_ERROR_GROUP_JS       @"JS"
@@ -137,3 +139,4 @@
 
 @end
 
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m
index 28302b9..07ccbe1 100644
--- a/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m
+++ b/ios/sdk/WeexSDK/Sources/Engine/WXSDKError.m
@@ -92,7 +92,7 @@
                 @(WX_KEY_EXCEPTION_DEGRADE):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NATIVE),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE)},
                 @(WX_KEY_EXCEPTION_DEGRADE_CHECK_CONTENT_LENGTH_FAILED):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NET),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_CHECK_CONTENT_LENGTH_FAILED)},
                 @(WX_KEY_EXCEPTION_DEGRADE_BUNDLE_CONTENTTYPE_ERROR):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NET), ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_BUNDLE_CONTENTTYPE_ERROR)},
-                @(WX_KEY_EXCEPTION_DEGRADE_EAGLE_RENDER_ERROR):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_JS),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_EAGLE_RENDER_ERROR)},
+                @(WX_KEY_EXCEPTION_DEGRADE_EAGLE_RENDER_ERROR):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NATIVE),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_EAGLE_RENDER_ERROR)},
                 @(WX_KEY_EXCEPTION_DEGRADE_OTHER_CAUSE):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NATIVE),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_OTHER_CAUSE)},
                 @(WX_KEY_EXCEPTION_DEGRADE_NET_CODE_CAUSE):@{ERROR_TYPE:@(WX_DEGRADE_ERROR),ERROR_GROUP:@(WX_NET),ERROR_ALIAS:@(WX_UNI_KEY_EXCEPTION_DEGRADE_NET_CODE_CAUSE)},
                 
diff --git a/ios/sdk/WeexSDK/Sources/Handler/WXNavigationDefaultImpl.h b/ios/sdk/WeexSDK/Sources/Handler/WXNavigationDefaultImpl.h
index 7cd156d..48efb7a 100644
--- a/ios/sdk/WeexSDK/Sources/Handler/WXNavigationDefaultImpl.h
+++ b/ios/sdk/WeexSDK/Sources/Handler/WXNavigationDefaultImpl.h
@@ -18,8 +18,12 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXNavigationProtocol.h"
+#import <WeexSDK/WXNavigationProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXNavigationDefaultImpl : NSObject <WXNavigationProtocol>
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h
index 4b883f0..6b6c9f1 100644
--- a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h
@@ -17,9 +17,9 @@
  * under the License.
  */
 
-#import "WXComponent.h"
-#import "WXSDKInstance.h"
-#import "WXUtility.h"
+#import <WeexSDK/WXComponent.h>
+#import <WeexSDK/WXSDKInstance.h>
+#import <WeexSDK/WXUtility.h>
 
 #define FlexUndefined NAN
 
diff --git a/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h b/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h
index 869bc7f..8356ef2 100644
--- a/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h
+++ b/ios/sdk/WeexSDK/Sources/Loader/WXResourceLoader.h
@@ -18,9 +18,10 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXResourceRequest.h"
-#import "WXResourceResponse.h"
+#import <WeexSDK/WXResourceRequest.h>
+#import <WeexSDK/WXResourceResponse.h>
 
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXResourceLoader : NSObject
 
@@ -39,3 +40,5 @@
 - (void)cancel:(NSError **)error;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
index 253cc95..3b1d2a4 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.h
@@ -20,6 +20,8 @@
 #import <Foundation/Foundation.h>
 #import <JavaScriptCore/JavaScriptCore.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @class WXBridgeMethod;
 @class WXSDKInstance;
 
@@ -52,8 +54,8 @@
  **/
 - (void)createInstanceForJS:(NSString *)instance
               template:(NSString *)temp
-               options:(NSDictionary *)options
-                  data:(id)data;
+               options:(NSDictionary * _Nullable)options
+                  data:(id _Nullable)data;
 
 /**
  *  Create Instance Method
@@ -64,8 +66,8 @@
  **/
 - (void)createInstance:(NSString *)instance
               template:(NSString *)temp
-               options:(NSDictionary *)options
-                  data:(id)data;
+               options:(NSDictionary * _Nullable)options
+                  data:(id _Nullable)data;
 
 /**
  *  Create Instance with opcode
@@ -76,8 +78,8 @@
  **/
 - (void)createInstance:(NSString *)instance
               contents:(NSData *)contents
-               options:(NSDictionary *)options
-                  data:(id)data;
+               options:(NSDictionary * _Nullable)options
+                  data:(id _Nullable)data;
 
 /**
  * @abstract return currentInstanceId
@@ -100,7 +102,7 @@
  *  @param instance  :   instance id
  *  @param data      :   external data
  **/
-- (void)refreshInstance:(NSString *)instance data:(id)data;
+- (void)refreshInstance:(NSString *)instance data:(id _Nullable)data;
 
 /**
  *  Unload
@@ -112,7 +114,7 @@
  *  @param instance  :   instance id
  *  @param data      :   parameters
  **/
-- (void)updateState:(NSString *)instance data:(id)data;
+- (void)updateState:(NSString *)instance data:(id _Nullable)data;
 
 /**
  *  Execute JSFramework Script
@@ -134,7 +136,7 @@
  *  @param options   :   service options
  *  @param completion : completion callback
  **/
-- (void)registerService:(NSString *)name withService:(NSString *)serviceScript withOptions:(NSDictionary *)options completion:(void(^)(BOOL result))completion;
+- (void)registerService:(NSString *)name withService:(NSString *)serviceScript withOptions:(NSDictionary * _Nullable)options completion:(nullable void(^)(BOOL result))completion;
 
 
 /**
@@ -144,7 +146,7 @@
  *  @param options      :   service options
  *  @param completion : completion callback
  **/
--(void)registerService:(NSString *)name withServiceUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary *)options completion:(void(^)(BOOL result))completion;
+-(void)registerService:(NSString *)name withServiceUrl:(NSURL *)serviceScriptUrl withOptions:(NSDictionary * _Nullable)options completion:(nullable void(^)(BOOL result))completion;
 
 /**
  *  Unregister JS service Script
@@ -172,7 +174,7 @@
  *  @param params    :   parameters in event object
  *  @param domChanges   dom value changes, used for two-way data binding
  **/
-- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary *)params domChanges:(NSDictionary *)domChanges;
+- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary * _Nullable)params domChanges:(NSDictionary * _Nullable)domChanges;
 
 /**
  *  FireEvent
@@ -183,9 +185,9 @@
  *  @param domChanges   dom value changes, used for two-way data binding
  *  @param handlerArguments : arguments passed to event handler
  **/
-- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary *)params domChanges:(NSDictionary *)domChanges handlerArguments:(NSArray *)handlerArguments;
+- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary * _Nullable)params domChanges:(NSDictionary * _Nullable)domChanges handlerArguments:(NSArray * _Nullable)handlerArguments;
 
-- (JSValue *)fireEventWithResult:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary *)params domChanges:(NSDictionary *)domChanges;
+- (JSValue *)fireEventWithResult:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary * _Nullable)params domChanges:(NSDictionary * _Nullable)domChanges;
 
 /**
  * componentHook
@@ -194,7 +196,7 @@
  * @param type        : component hook Type, such as life-cycle
  * @param hookPhase   : hook phase
  */
-- (void)callComponentHook:(NSString*)instanceId componentId:(NSString*)componentId type:(NSString*)type hook:(NSString*)hookPhase args:(NSArray*)args competion:(void (^)(JSValue * value))complection;
+- (void)callComponentHook:(NSString*)instanceId componentId:(NSString*)componentId type:(NSString*)type hook:(NSString*)hookPhase args:(NSArray* _Nullable)args competion:(nullable void (^)(JSValue * value))complection;
 /**
  *  callBack
  *
@@ -203,7 +205,7 @@
  *  @param params     params
  *  @param keepAlive     indicate that whether this func will be reused
  */
-- (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id)params keepAlive:(BOOL)keepAlive;
+- (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id _Nullable)params keepAlive:(BOOL)keepAlive;
 
 /**
  *  Connect To WebSocket for devtool debug
@@ -217,7 +219,7 @@
  *  @param funcId    :   callback id
  *  @param params    :   parameters
  **/
-- (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id)params;
+- (void)callBack:(NSString *)instanceId funcId:(NSString *)funcId params:(id _Nullable)params;
 
 /**
  *  Connect To WebSocket for collecting log
@@ -237,7 +239,7 @@
  **/
 - (void)resetEnvironment;
 
-- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary *)params DEPRECATED_MSG_ATTRIBUTE("Use fireEvent:ref:type:params:domChanges: method instead.");
+- (void)fireEvent:(NSString *)instanceId ref:(NSString *)ref type:(NSString *)type params:(NSDictionary * _Nullable)params DEPRECATED_MSG_ATTRIBUTE("Use fireEvent:ref:type:params:domChanges: method instead.");
 - (void)executeJsMethod:(WXBridgeMethod *)method DEPRECATED_MSG_ATTRIBUTE();
 
 - (void)callJSMethod:(NSString *)method args:(NSArray *)args;
@@ -245,3 +247,5 @@
 - (void)executeJSTaskQueue;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index c53229d..ff89cfc 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -69,7 +69,7 @@
     self = [super init];
     if (self) {
         _bridgeCtx = [[WXBridgeContext alloc] init];
-        _supportMultiJSThread = YES;
+        _supportMultiJSThread = NO;
         _jsTaskQueue = [NSMutableArray array];
     }
     return self;
@@ -530,6 +530,8 @@
 
 - (void)registerService:(NSString *)name withService:(NSString *)serviceScript withOptions:(NSDictionary *)options completion:(void(^)(BOOL result))completion
 {
+    WXLogInfo(@"Register service: %@, options: %@", name, options);
+    
     if (!name || !serviceScript || !options) {
         if (completion) {
             completion(NO);
@@ -557,6 +559,7 @@
 {
     if (!name) return;
     
+    WXLogInfo(@"Unregister service: %@", name);
     NSString *script = [WXServiceFactory unregisterServiceScript:name];
     
     __weak typeof(self) weakSelf = self;
@@ -575,6 +578,7 @@
     if (!modules) return;
     
     modules = [WXUtility convertContainerToImmutable:modules];
+    WXLogInfo(@"Register modules: %@", modules);
     
     __weak typeof(self) weakSelf = self;
     WXPerformBlockOnBridgeThread(^(){
@@ -590,6 +594,7 @@
     if (!components) return;
     
     components = [WXUtility convertContainerToImmutable:components];
+    WXLogInfo(@"Register components: %@", components);
     
     __weak typeof(self) weakSelf = self;
     WXPerformBlockOnBridgeThread(^(){
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.h b/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.h
index 8e77636..a4bb775 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentFactory.h
@@ -18,13 +18,15 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXInvocationConfig.h"
+#import <WeexSDK/WXInvocationConfig.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXComponentConfig : WXInvocationConfig
 
-@property (nonatomic, strong) NSDictionary *properties;
+@property (nonatomic, strong) NSDictionary * _Nullable properties;
 
-- (instancetype)initWithName:(NSString *)name class:(NSString *)clazz pros:(NSDictionary *)pros;
+- (instancetype)initWithName:(NSString *)name class:(NSString *)clazz pros:(NSDictionary * _Nullable)pros;
 
 @end
 
@@ -48,7 +50,7 @@
  * @param clazz The WXComponent subclass to register
  * @param pros The component properties to register
  */
-+ (void)registerComponent:(NSString *)name withClass:(Class)clazz withPros:(NSDictionary *)pros;
++ (void)registerComponent:(NSString *)name withClass:(Class)clazz withPros:(NSDictionary * _Nullable)pros;
 
 /**
  * @abstract Register a list of components
@@ -84,3 +86,5 @@
 
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
index 9e74572..a939921 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
@@ -20,6 +20,8 @@
 #import <CoreGraphics/CoreGraphics.h>
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @class WXBridgeMethod;
 @class WXSDKInstance;
 @class WXComponent;
@@ -281,3 +283,5 @@
 - (void)performBatchEnd;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
index cd1aa31..f4b29a8 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
@@ -694,8 +694,9 @@
     [component _updateStylesOnMainThread:normalStyles resetStyles:resetStyles];
     [component readyToRender];
     
+    NSDictionary* dupStyles = [NSDictionary dictionaryWithDictionary:normalStyles];
     WXPerformBlockOnComponentThread(^{
-        [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
+        [component _updateStylesOnComponentThread:dupStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
     });
 }
 
@@ -711,8 +712,10 @@
     NSMutableArray *resetStyles = [NSMutableArray new];
     [self filterStyles:styles normalStyles:normalStyles resetStyles:resetStyles];
     [component _updateStylesOnComponentThread:normalStyles resetStyles:resetStyles isUpdateStyles:isUpdateStyles];
+    
+    NSDictionary* dupStyles = [NSDictionary dictionaryWithDictionary:normalStyles];
     [self _addUITask:^{
-        [component _updateStylesOnMainThread:normalStyles resetStyles:resetStyles];
+        [component _updateStylesOnMainThread:dupStyles resetStyles:resetStyles];
         [component readyToRender];
     }];
 }
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.h b/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.h
index a733c6d..1bc8471 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXHandlerFactory.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface WXHandlerFactory : NSObject
 
 /**
@@ -43,3 +45,5 @@
 + (NSDictionary *)handlerConfigs;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h b/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
index ba3f014..7a990e4 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXInvocationConfig.h
@@ -18,8 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
+#import <WeexSDK/WXBridgeMethod.h>
 
-#import "WXBridgeMethod.h"
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXInvocationConfig : NSObject
 
@@ -35,3 +36,5 @@
 - (void)registerMethods;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
index 9f8e454..3887b74 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXSDKManager.h
@@ -18,8 +18,10 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXSDKInstance.h"
-#import "WXBridgeManager.h"
+#import <WeexSDK/WXSDKInstance.h>
+#import <WeexSDK/WXBridgeManager.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @class WXModuleManager;
 
@@ -60,3 +62,5 @@
 + (WXModuleManager *)moduleMgr DEPRECATED_MSG_ATTRIBUTE();
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
index d96aae5..0528b1d 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.h
@@ -18,7 +18,7 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXType.h"
+#import <WeexSDK/WXType.h>
 
 @class WXSDKInstance;
 
@@ -182,7 +182,7 @@
  *
  *  @return A block that takes component, callbackType and a result.
  **/
-@property (nonatomic, copy) void (^componentCallback)(WXComponent *component, WXComponentCallbackType callbackType, id result);
+@property (nonatomic, copy) void (^componentCallback)(WXComponent *component, WXComponentCallbackType callbackType, id _Nullable result);
 
 /**
  * @abstract Called on main thread when the component has just laid out.
@@ -486,3 +486,4 @@
 @end
 
 NS_ASSUME_NONNULL_END
+
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h b/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h
index c5b14ab..9c8952c 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface WXJSExceptionInfo : NSObject
 /**
  * instance id
@@ -66,7 +68,9 @@
                          bundleUrl:(NSString *)bundleUrl
                          errorCode:(NSString *)errorCode
                       functionName:(NSString *)functionName
-                         exception:(NSString *)exception
-                          userInfo:(NSMutableDictionary *)userInfo;
+                         exception:(NSString * _Nullable)exception
+                          userInfo:(NSMutableDictionary * _Nullable)userInfo;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
index c28a2d6..c6cf521 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
@@ -18,13 +18,15 @@
  */
 
 #import <UIKit/UIKit.h>
-#import "WXComponent.h"
-#import "WXJSExceptionInfo.h"
-#import "WXResourceResponse.h"
-#import "WXResourceRequest.h"
-#import "WXBridgeProtocol.h"
-#import "WXApmForInstance.h"
-#import "WXComponentManager.h"
+#import <WeexSDK/WXComponent.h>
+#import <WeexSDK/WXJSExceptionInfo.h>
+#import <WeexSDK/WXResourceResponse.h>
+#import <WeexSDK/WXResourceRequest.h>
+#import <WeexSDK/WXBridgeProtocol.h>
+#import <WeexSDK/WXApmForInstance.h>
+#import <WeexSDK/WXComponentManager.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 extern NSString *const bundleUrlOptionKey;
 
@@ -151,6 +153,11 @@
     FrameworkVersionErrorCode,
 };
 
+typedef enum : NSUInteger {
+    WXScrollerComponentCreatedCallback,
+    WXTabbarComponentCreatedCallback
+} WXSDKInstanceCallbackType;
+
 
 @property (nonatomic, assign) WXState state;
 
@@ -226,6 +233,15 @@
 @property (nonatomic, copy) void (^onScroll)(CGPoint contentOffset);
 
 /**
+ *  The callback of the instance
+ *
+ *  When the callbackType is WXScrollerComponentCreatedCallback, the result type is WXScrollerComponent.
+ *
+ *  @return A block that takes instance, callbackType and a result.
+ **/
+@property (nonatomic, copy) void (^instanceCallback)(WXSDKInstance* instance, WXSDKInstanceCallbackType callbackType, id result);
+
+/**
  * the callback to be run repeatedly while the instance is rendering.
  *
  * @return A block that takes a CGRect argument, which is the rect rendered
@@ -236,13 +252,13 @@
  * The callback triggered when the bundleJS request finished in the renderWithURL.
  * @return A block that takes response which the server response,request which send to server,data which the server returned and an error
  */
-@property (nonatomic, copy) void(^onJSDownloadedFinish)(WXResourceResponse *response,WXResourceRequest *request,NSData *data, NSError* error);
+@property (nonatomic, copy) void(^onJSDownloadedFinish)(WXResourceResponse *response,WXResourceRequest *request,NSData* _Nullable data, NSError* _Nullable error);
 
 /**
  * The callback triggered when the bundleJS request finished in the renderWithURL. If the callback returns YES, the render process will terminate.
  * @return A block that takes response which the server response,request which send to server,data which the server returned and an error
  */
-@property (nonatomic, copy) BOOL (^onRenderTerminateWhenJSDownloadedFinish)(WXResourceResponse *response,WXResourceRequest *request,NSData *data, NSError* error);
+@property (nonatomic, copy) BOOL (^onRenderTerminateWhenJSDownloadedFinish)(WXResourceResponse *response,WXResourceRequest *request,NSData* _Nullable data, NSError* _Nullable error);
 
 @property(nonatomic,strong) NSDictionary* continerInfo;
 
@@ -281,7 +297,7 @@
  *
  * @param data The data the bundle needs when rendered.  Defalut is nil.
  **/
-- (void)renderWithURL:(NSURL *)url options:(NSDictionary *)options data:(id)data;
+- (void)renderWithURL:(NSURL *)url options:(NSDictionary * _Nullable)options data:(id _Nullable)data;
 
 ///**
 // * Renders weex view with resource request.
@@ -301,7 +317,7 @@
  *
  * @param data The data the bundle needs when rendered. Defalut is nil.
  **/
-- (void)renderView:(id)source options:(NSDictionary *)options data:(id)data;
+- (void)renderView:(id)source options:(NSDictionary * _Nullable)options data:(id _Nullable)data;
 
 /**
  * Reload the js bundle from the current URL and rerender.
@@ -365,12 +381,12 @@
  * @param eventName the event name
  * @param params event params
  */
-- (void)fireModuleEvent:(Class)module eventName:(NSString *)eventName params:(NSDictionary*)params;
+- (void)fireModuleEvent:(Class)module eventName:(NSString *)eventName params:(NSDictionary* _Nullable)params;
 
 /**
  * fire global event
  */
-- (void)fireGlobalEvent:(NSString *)eventName params:(NSDictionary *)params;
+- (void)fireGlobalEvent:(NSString *)eventName params:(NSDictionary * _Nullable)params;
 
 /**
  * complete url based with bundle url
@@ -380,7 +396,7 @@
 /**
  * jsbundle str ,may be nil (weak)
  */
-- (NSString*) bundleTemplate;
+- (NSString* _Nullable) bundleTemplate;
 
 /**
  * application performance statistics
@@ -425,6 +441,12 @@
  */
 - (void)setViewportWidth:(CGFloat)width;
 
+/**
+ * @abstract Get information about the last rendered page.
+ Useful fot debugging and fixing online bugs.
+ */
++ (NSDictionary*)lastPageInfo;
+
 /** 
  * Deprecated 
  */
@@ -441,3 +463,5 @@
 - (void)creatFinish DEPRECATED_MSG_ATTRIBUTE();
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index 0bcda66..1a09028 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -60,6 +60,9 @@
 
 NSTimeInterval JSLibInitTime = 0;
 
+static NSString* lastPageInfoLock = @"";
+static NSDictionary* lastPageInfo = nil;
+
 typedef enum : NSUInteger {
     WXLoadTypeNormal,
     WXLoadTypeBack,
@@ -124,6 +127,8 @@
             }
         }
         
+        WXLogInfo(@"Create instance: %@, render type: %@", _instanceId, _renderType);
+        
         // TODO self is retained here.
         [WXSDKManager storeInstance:self forID:_instanceId];
         
@@ -206,6 +211,12 @@
     return [NSString stringWithFormat:@"<%@: %p; id = %@; rootView = %p; url= %@>", NSStringFromClass([self class]), self, _instanceId, (__bridge void*)_rootView, _scriptURL];
 }
 
+- (void)setParentInstance:(WXSDKInstance *)parentInstance
+{
+    WXLogInfo(@"Embed instance %@ into parent instance %@", _instanceId, parentInstance.instanceId);
+    _parentInstance = parentInstance;
+}
+
 #pragma mark Public Mehtods
 
 - (UIView *)rootView
@@ -307,6 +318,12 @@
         WXLogError(@"Url must be passed if you use renderWithURL");
         return;
     }
+    WXLogInfo(@"pageid: %@ renderWithURL: %@", _instanceId, url.absoluteString);
+    
+    @synchronized (lastPageInfoLock) {
+        lastPageInfo = @{@"pageId": [_instanceId copy], @"url": [url absoluteString] ?: @""};
+    }
+    
     [WXCoreBridge install];
     if (_useBackupJsThread) {
         [[WXSDKManager bridgeMgr] executeJSTaskQueue];
@@ -329,6 +346,12 @@
 {
     _options = [options isKindOfClass:[NSDictionary class]] ? options : nil;
     _jsData = data;
+    WXLogInfo(@"pageid: %@ renderView pageNmae: %@  options: %@", _instanceId, _pageName, options);
+    
+    @synchronized (lastPageInfoLock) {
+        lastPageInfo = @{@"pageId": [_instanceId copy], @"options": options ? [options description] : @""};
+    }
+
     [WXCoreBridge install];
     if (_useBackupJsThread) {
         [[WXSDKManager bridgeMgr] executeJSTaskQueue];
@@ -710,12 +733,13 @@
     };
     
     _mainBundleLoader.onFailed = ^(NSError *loadError) {
+        WXLogError(@"Request failed with error: %@", loadError);
+        
         NSString *errorMessage = [NSString stringWithFormat:@"Request to %@ occurs an error:%@, info:%@", request.URL, loadError.localizedDescription, loadError.userInfo];
         long wxErrorCode = [loadError.domain isEqualToString:NSURLErrorDomain] && loadError.code == NSURLErrorNotConnectedToInternet ? WX_ERR_NOT_CONNECTED_TO_INTERNET : WX_ERR_JSBUNDLE_DOWNLOAD;
 
         WX_MONITOR_FAIL_ON_PAGE(WXMTJSDownload, wxErrorCode, errorMessage, weakSelf.pageName);
         
-    
         NSMutableDictionary *allUserInfo = [[NSMutableDictionary alloc] initWithDictionary:error.userInfo];
         [allUserInfo addEntriesFromDictionary:loadError.userInfo];
         NSError *errorWithReportMsg = [NSError errorWithDomain:error.domain
@@ -766,6 +790,8 @@
 
 - (void)destroyInstance
 {
+    WXLogInfo(@"Destroy instance: %@", _instanceId);
+    
     [self.apmInstance endRecord];
     NSString *url = @"";
     if ([WXPrerenderManager isTaskExist:[self.scriptURL absoluteString]]) {
@@ -784,7 +810,11 @@
 
     [WXPrerenderManager removePrerenderTaskforUrl:[self.scriptURL absoluteString]];
     [WXPrerenderManager destroyTask:self.instanceId];
-    [[WXSDKManager bridgeMgr] destroyInstance:self.instanceId];
+    BOOL dataRender = self.dataRender;
+    BOOL wlasmRender = self.wlasmRender;
+    if (!dataRender) {
+        [[WXSDKManager bridgeMgr] destroyInstance:self.instanceId];
+    }
     
     WXComponentManager* componentManager = self.componentManager;
     NSString* instanceId = self.instanceId;
@@ -802,6 +832,10 @@
         // Destroy weexcore c++ page and objects.
         [WXCoreBridge closePage:instanceId];
         
+        if (dataRender && !wlasmRender) {
+            [[WXSDKManager bridgeMgr] destroyInstance:instanceId];
+        }
+
         // Destroy heron render target page
         if ([WXCustomPageBridge isCustomPage:instanceId]) {
             [[WXCustomPageBridge sharedInstance] removePage:instanceId];
@@ -810,6 +844,7 @@
         // Reading config from orange for Release instance in Main Thread or not, for Bug #15172691 +{
         dispatch_async(dispatch_get_main_queue(), ^{
             [WXSDKManager removeInstanceforID:instanceId];
+            WXLogInfo(@"Finally remove instance: %@", instanceId);
         });
         //+}
     });
@@ -1118,6 +1153,15 @@
     }
 }
 
++ (NSDictionary*)lastPageInfo
+{
+    NSDictionary* result;
+    @synchronized (lastPageInfoLock) {
+        result = [lastPageInfo copy];
+    }
+    return result;
+}
+
 @end
 
 @implementation WXSDKInstance (Deprecated)
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
index 36a80f9..4a11f4a 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
@@ -132,7 +132,14 @@
     [targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_EXECUTE_JS_TIME curMaxValue:self.callJsTime];
     [targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_CREATE_COMPONENT_TIME curMaxValue:self.componentCreateTime];
     [targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_CREATE_VIEW_TIME curMaxValue:self.viewCreateTime];
-    [targetComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_LAYOUT_TIME curMaxValue:[WXCoreBridge getLayoutTime:targetComponent.weexInstance.instanceId]];
+    __weak WXComponent* weakComponent = targetComponent;
+    WXPerformBlockOnComponentThread(^{
+         __strong WXComponent* strongComponent = weakComponent;
+        if (!strongComponent) {
+            return;
+        }
+        [strongComponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_LAYOUT_TIME curMaxValue:[WXCoreBridge getLayoutTime:strongComponent.weexInstance.instanceId]];
+    });
 
     self.interactionTime = self.interactionTime < diff ? diff :self.interactionTime;
 }
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
index a1d78b3..8ee1591 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
@@ -355,6 +355,21 @@
 
 - (void)animation:(WXComponent *)targetComponent args:(NSDictionary *)args callback:(WXModuleKeepAliveCallback)callback
 {
+    /* Check if view of targetComponent is created, if not, we do not do animation and
+     simulate delay of 'duration' and callback.
+     For a view in list, the view migth be recycled, and if view is not attached to a window,
+     the CATransaction completion block will be called immediately, which may cause CPU overload
+     problem if JS code do any logic in the completion callback.
+     */
+    
+    BOOL shouldDoAnimation = NO;
+    if ([targetComponent isViewLoaded]) {
+        UIView* view = targetComponent.view;
+        if ([view window] != nil) {
+            shouldDoAnimation = YES;
+        }
+    }
+    
     /**
        UIView-style animation functions support the standard timing functions,
        but they don’t allow you to specify your own cubic Bézier curve. 
@@ -362,21 +377,31 @@
      **/
     [CATransaction begin];
     [CATransaction setAnimationTimingFunction:[WXConvert CAMediaTimingFunction:args[@"timingFunction"]]];
-    [CATransaction setCompletionBlock:^{
-        if (callback) {
-            NSDictionary *message;
-            if (_isAnimationedSuccess) {
-                message = @{@"result":@"Success",
-                            @"message":@"Success"};
+    
+    if (shouldDoAnimation) {
+        [CATransaction setCompletionBlock:^{
+            if (callback) {
+                NSDictionary *message;
+                if (_isAnimationedSuccess) {
+                    message = @{@"result":@"Success",
+                                @"message":@"Success"};
+                }
+                else
+                {
+                    message = @{@"result":@"Fail",
+                                @"message":@"Animation did not complete"};
+                }
+                callback(message, NO);
             }
-            else
-            {
-                message = @{@"result":@"Fail",
-                            @"message":@"Animation did not complete"};
-            }
-            callback(message,NO);
-        }
-    }];
+        }];
+    }
+    else if (callback) {
+        double duration = [[args objectForKey:@"duration"] doubleValue] / 1000.f;
+        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
+            callback(@{@"result":@"Success",
+                       @"message":@"Success"}, NO);
+        });
+    }
     
     BOOL needLayout = NO;
     WXTransition* transition = nil;
@@ -387,6 +412,7 @@
     }
     
     [CATransaction commit];
+    
     if (needLayout && transition) {
         WXPerformBlockOnComponentThread(^{
             [transition _handleTransitionWithStyles:transitionDic resetStyles:nil target:targetComponent];
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXInstanceWrap.h b/ios/sdk/WeexSDK/Sources/Module/WXInstanceWrap.h
index 6f0e0d9..681b8aa 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXInstanceWrap.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXInstanceWrap.h
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
 
 @interface WXInstanceWrap : NSObject <WXModuleProtocol>
 
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXModalUIModule.h b/ios/sdk/WeexSDK/Sources/Module/WXModalUIModule.h
index 41582f2..5267233 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXModalUIModule.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXModalUIModule.h
@@ -18,8 +18,12 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXModalUIModule : NSObject <WXModuleProtocol>
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h
index 3f04e46..6157132 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @class WXModuleMethod;
 
@@ -36,7 +38,7 @@
  *  @param callback  the module method callback
  *
  **/
-+ (void) addTask:(NSString *) url instanceId:(NSString *)instanceId callback:(WXModuleKeepAliveCallback)callback;
++ (void) addTask:(NSString *) url instanceId:(NSString *)instanceId callback:(WXModuleKeepAliveCallback _Nullable)callback;
 
 /**
  *  @abstract add prerender task
@@ -46,7 +48,7 @@
  *  @param callback  the module method callback
  *
  **/
-+ (void) addGlobalTask:(NSString *) url callback:(WXModuleKeepAliveCallback)callback;
++ (void) addGlobalTask:(NSString *) url callback:(WXModuleKeepAliveCallback _Nullable)callback;
 
 /**
  *  @abstract Returns true if url is exist in task .
@@ -108,3 +110,5 @@
  **/
 + (void)destroyTask:(NSString *)parentInstanceId;
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
index 41aef2b..e41fd4e 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXStreamModule.h
@@ -18,11 +18,15 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXStreamModule : NSObject <WXModuleProtocol>
 
-- (void)fetch:(NSDictionary *)options callback:(WXModuleKeepAliveCallback)callback progressCallback:(WXModuleKeepAliveCallback)progressCallback;
+- (void)fetch:(NSDictionary *)options callback:(WXModuleKeepAliveCallback)callback progressCallback:(nullable WXModuleKeepAliveCallback)progressCallback;
 - (void)sendHttp:(NSDictionary*)param callback:(WXModuleKeepAliveCallback)callback DEPRECATED_MSG_ATTRIBUTE("Use fetch method instead.");
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTimerModule.h b/ios/sdk/WeexSDK/Sources/Module/WXTimerModule.h
index dab8601..25bef9a 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTimerModule.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTimerModule.h
@@ -18,7 +18,7 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
 
 @interface WXTimerModule : NSObject <WXModuleProtocol>
 
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm b/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm
index 15a9e11..8bb616d 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm
@@ -170,8 +170,9 @@
     }
     [targetComponent _updateCSSNodeStyles:styles];
     [targetComponent _resetCSSNodeStyles:resetStyles];
+    NSDictionary* dupStyles = [NSDictionary dictionaryWithDictionary:styles];
     WXPerformBlockOnMainThread(^{
-        [targetComponent _updateViewStyles:styles];
+        [targetComponent _updateViewStyles:dupStyles];
     });
 }
 
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXVoiceOverModule.h b/ios/sdk/WeexSDK/Sources/Module/WXVoiceOverModule.h
index 274c310..2b1bbeb 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXVoiceOverModule.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXVoiceOverModule.h
@@ -18,8 +18,12 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXVoiceOverModule : NSObject<WXModuleProtocol>
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h
index 4b5a61b..0927989 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXAnalyzerCenter.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXAnalyzerProtocol.h"
+#import <WeexSDK/WXAnalyzerProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXAnalyzerCenter : NSObject
 
@@ -35,3 +37,5 @@
 +(BOOL) isInteractionLogOpen;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h
index ee4d52c..3bb5bcb 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXExceptionUtils.h
@@ -18,11 +18,13 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXJSExceptionInfo.h"
+#import <WeexSDK/WXJSExceptionInfo.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXExceptionUtils : NSObject
 
-+ (void)commitCriticalExceptionRT:(NSString *)instanceId errCode:(NSString *)errCode function:(NSString *)function exception:(NSString *)exception extParams:(NSDictionary *)extParams;
++ (void)commitCriticalExceptionRT:(NSString *)instanceId errCode:(NSString *)errCode function:(NSString *)function exception:(NSString *)exception extParams:(NSDictionary * _Nullable)extParams;
 
 + (void)commitCriticalExceptionRT:(WXJSExceptionInfo*)jsExceptionInfo;
 
@@ -30,3 +32,4 @@
 
 @end
 
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h b/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
index 395535d..83b9a7c 100644
--- a/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
+++ b/ios/sdk/WeexSDK/Sources/Monitor/WXMonitor.h
@@ -19,8 +19,10 @@
 
 
 #import <Foundation/Foundation.h>
-#import "WXDefine.h"
-#import "WXSDKError.h"
+#import <WeexSDK/WXDefine.h>
+#import <WeexSDK/WXSDKError.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @class WXSDKInstance;
 
@@ -99,15 +101,17 @@
 //DEPRECATED_ATTRIBUTE
 @interface WXMonitor : NSObject
 
-+ (void)performancePoint:(WXPerformanceTag)tag willStartWithInstance:(WXSDKInstance *)instance;
-+ (void)performancePoint:(WXPerformanceTag)tag didEndWithInstance:(WXSDKInstance *)instance;
-+ (void)performancePoint:(WXPerformanceTag)tag didSetValue:(double)value withInstance:(WXSDKInstance *)instance;
-+ (BOOL)performancePoint:(WXPerformanceTag)tag isRecordedWithInstance:(WXSDKInstance *)instance;
++ (void)performancePoint:(WXPerformanceTag)tag willStartWithInstance:(WXSDKInstance * _Nullable)instance;
++ (void)performancePoint:(WXPerformanceTag)tag didEndWithInstance:(WXSDKInstance * _Nullable)instance;
++ (void)performancePoint:(WXPerformanceTag)tag didSetValue:(double)value withInstance:(WXSDKInstance * _Nullable)instance;
++ (BOOL)performancePoint:(WXPerformanceTag)tag isRecordedWithInstance:(WXSDKInstance * _Nullable)instance;
 + (void)performanceFinish:(WXSDKInstance *)instance;
 
-+ (void)monitoringPointDidSuccess:(WXMonitorTag)tag onPage:(NSString *)pageName;
-+ (void)monitoringPoint:(WXMonitorTag)tag didFailWithError:(NSError *)error onPage:(NSString *)pageName;
++ (void)monitoringPointDidSuccess:(WXMonitorTag)tag onPage:(NSString * _Nullable)pageName;
++ (void)monitoringPoint:(WXMonitorTag)tag didFailWithError:(NSError * _Nullable)error onPage:(NSString * _Nullable)pageName;
 
-+ (void)performanceFinishWithState:(CommitState) state instance:(WXSDKInstance *)instance;
++ (void)performanceFinishWithState:(CommitState) state instance:(WXSDKInstance * _Nullable)instance;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h
index 8719350..2212571 100644
--- a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequest.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 typedef enum : NSUInteger {
     WXResourceTypeMainBundle,
     WXResourceTypeServiceBundle,
@@ -40,7 +42,9 @@
 
 + (instancetype)requestWithURL:(NSURL *)url
                   resourceType:(WXResourceType)type
-                      referrer:(NSString *)referrer
+                      referrer:(NSString * _Nullable)referrer
                    cachePolicy:(NSURLRequestCachePolicy)cachePolicy;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h
index 6230f7f..336080c 100644
--- a/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceRequestHandler.h
@@ -19,8 +19,10 @@
 
 
 #import <Foundation/Foundation.h>
-#import "WXResourceRequest.h"
-#import "WXResourceResponse.h"
+#import <WeexSDK/WXResourceRequest.h>
+#import <WeexSDK/WXResourceResponse.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @protocol WXResourceRequestDelegate <NSObject>
 
@@ -28,16 +30,16 @@
 - (void)request:(WXResourceRequest *)request didSendData:(unsigned long long)bytesSent totalBytesToBeSent:(unsigned long long)totalBytesToBeSent;
 
 // Tells the delegate that the request received the initial reply (headers) from the server.
-- (void)request:(WXResourceRequest *)request didReceiveResponse:(WXResourceResponse *)response;
+- (void)request:(WXResourceRequest *)request didReceiveResponse:(WXResourceResponse * _Nullable)response;
 
 // Tells the delegate that the request has received some of the expected data.
-- (void)request:(WXResourceRequest *)request didReceiveData:(NSData *)data;
+- (void)request:(WXResourceRequest *)request didReceiveData:(NSData * _Nullable)data;
 
 // Tells the delegate that the request finished transferring data.
 - (void)requestDidFinishLoading:(WXResourceRequest *)request;
 
 // Tells the delegate that the request failed to load successfully.
-- (void)request:(WXResourceRequest *)request didFailWithError:(NSError *)error;
+- (void)request:(WXResourceRequest *)request didFailWithError:(NSError * _Nullable)error;
     
 // Tells the delegate that when complete statistics information has been collected for the task.
 #ifdef __IPHONE_10_0
@@ -58,4 +60,4 @@
 
 @end
 
-
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h b/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h
index b20fb95..877ec49 100644
--- a/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h
+++ b/ios/sdk/WeexSDK/Sources/Network/WXResourceResponse.h
@@ -20,6 +20,10 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface WXResourceResponse : NSHTTPURLResponse
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h
index b843c64..990f7a0 100644
--- a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h
+++ b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXJSExceptionInfo.h"
+#import <WeexSDK/WXJSExceptionInfo.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 #pragma mark - const static string
 
@@ -123,6 +125,8 @@
 @property (nonatomic, assign) BOOL isDownLoadFailed;
 @property (nonatomic, assign) BOOL forceStopRecordInteractionTime;
 @property (nonatomic,assign) double pageRatio;
+@property (nonatomic,strong) NSMutableDictionary<NSString*,NSNumber*>* recordStatsMap;
+@property (nonatomic,strong) NSMutableDictionary<NSString*,NSNumber*>* recordStageMap;
 
 #pragma mark - basic method
 
@@ -148,11 +152,11 @@
 #pragma mark - called by IWXHttpAdapter implementer
 
 - (void) actionNetRequest;
-- (void) actionNetRequestResult:(bool)succeed withErrorCode:(NSString*)errorCode;
+- (void) actionNetRequestResult:(bool)succeed withErrorCode:(nullable NSString*)errorCode;
 
 #pragma mark - called by IWXImgLoaderAdapter implementer
 - (void) actionImgLoad;
-- (void) actionImgLoadResult:(bool)succeed withErrorCode:(NSString*)errorCode;
+- (void) actionImgLoadResult:(bool)succeed withErrorCode:(nullable NSString*)errorCode;
 
 #pragma mark record top5 errorMsg
 - (void) recordErrorMsg:(WXJSExceptionInfo *)exception;
@@ -161,3 +165,5 @@
 #pragma mark templateinfo
 - (NSString*) templateInfo;
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m
index 33d6b4b..ad9f01b 100644
--- a/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Performance/WXApmForInstance.m
@@ -134,8 +134,6 @@
 
 @property (nonatomic,strong) id<WXApmProtocol> apmProtocolInstance;
 @property (nonatomic,strong) NSString* instanceId;
-@property (nonatomic,strong) NSMutableDictionary<NSString*,NSNumber*>* recordStatsMap;
-@property (nonatomic,strong) NSMutableDictionary<NSString*,NSNumber*>* recordStageMap;
 @property (nonatomic,strong) NSMutableArray<NSNumber*>* recordUpdateComponentDataTimestamp;
 @property (nonatomic,strong) NSMutableArray<NSNumber*>* recordUpdateComponentDataTime;
 
@@ -259,6 +257,7 @@
 }
 
 - (void)printRecordStageMap {
+    // These logs are for performance auto-test platforms.
     __weak typeof(self) weakSelf = self;
     WXPerformBlockOnComponentThread(^{
         if (!weakSelf) {
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXAnalyzerProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXAnalyzerProtocol.h
index 6663c80..2e2c9b3 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXAnalyzerProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXAnalyzerProtocol.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXAppMonitorProtocol.h"
+#import <WeexSDK/WXAppMonitorProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 #define GROUP_ANALYZER          @"WXAnalyzer"
 #define MODULE_PERFORMANCE      @"WXPerformance"
@@ -42,3 +44,5 @@
 - (void)transfer:(NSDictionary *) value;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXApmProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXApmProtocol.h
index 42643f0..ab93534 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXApmProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXApmProtocol.h
@@ -19,6 +19,7 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
 
 @protocol WXApmProtocol <NSObject>
 
@@ -100,3 +101,5 @@
 @required
 - (id<WXApmProtocol>)gengratorApmInstance:(NSString *) type;
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXAppMonitorProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXAppMonitorProtocol.h
index 7112097..402fd8d 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXAppMonitorProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXAppMonitorProtocol.h
@@ -19,6 +19,8 @@
 
 #import "WXModuleProtocol.h"
 
+NS_ASSUME_NONNULL_BEGIN
+
 /**  dimenValue  */
 #define BIZTYPE             @"bizType"
 #define PAGENAME            @"pageName"
@@ -74,10 +76,12 @@
 
 - (void)commitAppMonitorArgs:(NSDictionary *)args;
 
-- (void)commitAppMonitorAlarm:(NSString *)pageName monitorPoint:(NSString *)monitorPoint success:(BOOL)success errorCode:(NSString *)errorCode errorMsg:(NSString *)errorMsg arg:(NSString *)arg;
+- (void)commitAppMonitorAlarm:(NSString *)pageName monitorPoint:(NSString *)monitorPoint success:(BOOL)success errorCode:(NSString *)errorCode errorMsg:(NSString *)errorMsg arg:(NSString * _Nullable)arg;
 
 @optional
 
-- (void)commitMonitorWithPage:(NSString *)pageName monitorPoint:(NSString *)monitorPoint args:(NSDictionary *)args;
+- (void)commitMonitorWithPage:(NSString *)pageName monitorPoint:(NSString *)monitorPoint args:(NSDictionary * _Nullable)args;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
index b3d1019..a34f2db 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
@@ -19,6 +19,8 @@
 
 #import <JavaScriptCore/JavaScriptCore.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 typedef NSInteger(^WXJSCallNative)(NSString *instance, NSArray *tasks, NSString *callback);
 typedef NSInteger(^WXJSCallAddElement)(NSString *instanceId,  NSString *parentRef, NSDictionary *elementData, NSInteger index);
 typedef NSInteger(^WXJSCallCreateBody)(NSString *instanceId, NSDictionary *bodyData);
@@ -31,7 +33,7 @@
 typedef NSInteger(^WXJSCallCreateFinish)(NSString *instanceId);
 typedef NSInteger(^WXJSCallRefreshFinish)(NSString *instanceId);
 typedef NSInteger(^WXJSCallUpdateFinish)(NSString *instanceId);
-typedef NSInvocation *(^WXJSCallNativeModule)(NSString *instanceId, NSString *moduleName, NSString *methodName, NSArray *args, NSDictionary *options);
+typedef NSInvocation *_Nullable(^WXJSCallNativeModule)(NSString *instanceId, NSString *moduleName, NSString *methodName, NSArray *args, NSDictionary *options);
 typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componentRef, NSString *methodName, NSArray *args, NSDictionary *options);
 typedef NSInteger(^WXJSCallUpdateComponentData)(NSString *instanceId, NSString *componentId, NSString *jsonData);
 
@@ -54,7 +56,7 @@
 /**
  * Executes global js method with specific arguments
  */
-- (JSValue *)callJSMethod:(NSString *)method args:(NSArray*)args;
+- (JSValue *)callJSMethod:(NSString *)method args:(NSArray* _Nullable)args;
 
 /**
  * Reset js engine environment, called when any environment variable is changed.
@@ -160,7 +162,7 @@
  @param sourceURL A URL to be considered as the script’s origin.
  @return ReturnsThe last value generated by the script. Note that a script can result in the JavaScript value undefined.
  */
-- (JSValue *)executeJavascript:(NSString *)script withSourceURL:(NSURL*)sourceURL;
+- (JSValue *)executeJavascript:(NSString *)script withSourceURL:(NSURL* _Nullable)sourceURL;
 
 
 @property (nonatomic, strong) NSString* weexInstanceId;
@@ -176,3 +178,5 @@
 - (JSContext*)javaScriptContext;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXConfigCenterProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXConfigCenterProtocol.h
index d6210f4..1af35ab 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXConfigCenterProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXConfigCenterProtocol.h
@@ -17,6 +17,10 @@
  * under the License.
  */
 
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
 @protocol WXConfigCenterProtocol <NSObject>
 
 /**
@@ -26,7 +30,7 @@
  @param isDefault whether the value is default value
  @return the value for config key
  */
-- (id)configForKey:(NSString*)key defaultValue:(id)defaultValue isDefault:(BOOL*)isDefault;
+- (id)configForKey:(NSString*)key defaultValue:(id _Nullable)defaultValue isDefault:(BOOL* _Nullable)isDefault;
 
 @optional
 /**
@@ -37,3 +41,5 @@
 - (id)configForGroup:(NSString*)group;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXEventModuleProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXEventModuleProtocol.h
index ea20753..465a4e1 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXEventModuleProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXEventModuleProtocol.h
@@ -17,10 +17,14 @@
  * under the License.
  */
 
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @protocol WXEventModuleProtocol<WXModuleProtocol>
 
 - (void)openURL:(NSString *)url;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXExtendCallNativeProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXExtendCallNativeProtocol.h
index c920b73..0f54d71 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXExtendCallNativeProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXExtendCallNativeProtocol.h
@@ -20,6 +20,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @protocol WXExtendCallNativeProtocol <NSObject>
 
 @required
@@ -45,3 +47,5 @@
 + (id)excuteCallNative:(NSDictionary *)parameters;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXImgLoaderProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXImgLoaderProtocol.h
index d2b6f51..db8c414 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXImgLoaderProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXImgLoaderProtocol.h
@@ -17,8 +17,10 @@
  * under the License.
  */
 
-#import "WXModuleProtocol.h"
-#import "WXType.h"
+#import <WeexSDK/WXModuleProtocol.h>
+#import <WeexSDK/WXType.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @protocol WXImageOperationProtocol <NSObject>
 
@@ -57,7 +59,7 @@
  *                 error : the error which has happened in download.
  *              finished : a Boolean value indicating whether download action has finished.
  */
-- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary *)options completed:(void(^)(UIImage *image,  NSError *error, BOOL finished))completedBlock;
+- (id<WXImageOperationProtocol>)downloadImageWithURL:(NSString *)url imageFrame:(CGRect)imageFrame userInfo:(NSDictionary * _Nullable)options completed:(void(^)(UIImage * _Nullable image,  NSError * _Nullable error, BOOL finished))completedBlock;
 
 @optional
 
@@ -81,10 +83,10 @@
  */
 - (void)setImageViewWithURL:(UIImageView*)imageView
                         url:(NSURL *)url
-           placeholderImage:(UIImage *)placeholder
-                    options:(NSDictionary*)options
-                   progress:(void(^)(NSInteger receivedSize, NSInteger expectedSize))progressBlock
-                  completed:(void(^)(UIImage *image, NSError *error, WXImageLoaderCacheType cacheType, NSURL *imageURL))completedBlock;
+           placeholderImage:(UIImage * _Nullable)placeholder
+                    options:(NSDictionary* _Nullable)options
+                   progress:(nullable void (^)(NSInteger receivedSize, NSInteger expectedSize))progressBlock
+                  completed:(nullable void(^)(UIImage *_Nullable image, NSError *_Nullable error, WXImageLoaderCacheType cacheType, NSURL *imageURL))completedBlock;
 
 /**
  * Cancel the current download image
@@ -92,3 +94,5 @@
 - (void)cancelCurrentImageLoad:(UIImageView*)imageView;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXJSExceptionProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXJSExceptionProtocol.h
index dd91aed..fec7406 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXJSExceptionProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXJSExceptionProtocol.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXJSExceptionInfo.h"
+#import <WeexSDK/WXJSExceptionInfo.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 typedef WXJSExceptionInfo WXRuntimeCheckException;
 
@@ -40,3 +42,5 @@
 - (void)onRuntimeCheckException:(WXRuntimeCheckException*)exception;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXJSFrameworkLoadProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXJSFrameworkLoadProtocol.h
index b8df2d7..6e93e4f 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXJSFrameworkLoadProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXJSFrameworkLoadProtocol.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 typedef void (^WXJSFrameworkLoadBlock)(NSString *path, NSString *script);
 
 @protocol WXJSFrameworkLoadProtocol <NSObject>
@@ -27,3 +29,5 @@
 - (void)loadPolyfillFramework:(WXJSFrameworkLoadBlock)block;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
index 4c8f877..e0fc06f 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXModuleProtocol.h
@@ -18,8 +18,10 @@
  */
 
 #import <UIKit/UIKit.h>
-#import "WXDefine.h"
-#import "WXSDKInstance.h"
+#import <WeexSDK/WXDefine.h>
+#import <WeexSDK/WXSDKInstance.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 #define MSG_SUCCESS     @"WX_SUCCESS"
 #define MSG_NO_HANDLER  @"WX_NO_HANDLER"
@@ -34,14 +36,14 @@
  * @abstract the module callback , result can be string or dictionary.
  * @discussion callback data to js, the id of callback function will be removed to save memory.
  */
-typedef void (^WXModuleCallback)(id result);
+typedef void (^WXModuleCallback)(id _Nullable result);
 //DEPRECATED_MSG_ATTRIBUTE("use WXModuleKeepAliveCallback, you can specify keep the callback or not, if keeped, it can be called multi times, or it will be removed after called.")
 
 /**
  * @abstract the module callback , result can be string or dictionary.
  * @discussion callback data to js, you can specify the keepAlive parameter to keep callback function id keepalive or not. If the keepAlive is true, it won't be removed until instance destroyed, so you can call it repetitious.
  */
-typedef void (^WXModuleKeepAliveCallback)(id result, BOOL keepAlive);
+typedef void (^WXModuleKeepAliveCallback)(id _Nullable result, BOOL keepAlive);
 
 #define WX_EXPORT_MODULE(module) 
 
@@ -76,3 +78,5 @@
 @property (nonatomic, weak) WXSDKInstance *weexInstance;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
index 22ad3e9..58d75b7 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXNavigationProtocol.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 /**
  * This enum is used to define the position of navbar item.
@@ -82,7 +84,7 @@
  */
 - (void)setNavigationItemWithParam:(NSDictionary *)param
                           position:(WXNavigationItemPosition)position
-                        completion:(WXNavigationResultBlock)block
+                        completion:(nullable WXNavigationResultBlock)block
                      withContainer:(UIViewController *)container;
 
 /**
@@ -99,7 +101,7 @@
  */
 - (void)clearNavigationItemWithParam:(NSDictionary *)param
                             position:(WXNavigationItemPosition)position
-                          completion:(WXNavigationResultBlock)block
+                          completion:(nullable WXNavigationResultBlock)block
                        withContainer:(UIViewController *)container;
 
 /**
@@ -113,7 +115,7 @@
  *
  */
 - (void)pushViewControllerWithParam:(NSDictionary *)param
-                         completion:(WXNavigationResultBlock)block
+                         completion:(nullable WXNavigationResultBlock)block
                       withContainer:(UIViewController *)container;
 
 /**
@@ -127,7 +129,7 @@
  *
  */
 - (void)popViewControllerWithParam:(NSDictionary *)param
-                        completion:(WXNavigationResultBlock)block
+                        completion:(nullable WXNavigationResultBlock)block
                      withContainer:(UIViewController *)container;
 
     
@@ -145,8 +147,8 @@
  * @param container The target controller.
  *
  */
-- (void)open:(NSDictionary *)param success:(WXModuleCallback)success
-                                   failure:(WXModuleCallback)failure
+- (void)open:(NSDictionary *)param success:(nullable WXModuleCallback)success
+                                   failure:(nullable WXModuleCallback)failure
                              withContainer:(UIViewController *)container;
 
 
@@ -162,7 +164,9 @@
   * @param container The target controller.
   *
   */
-- (void)close:(NSDictionary *)param success:(WXModuleCallback)success
-                                   failure:(WXModuleCallback)failure
+- (void)close:(NSDictionary *)param success:(nullable WXModuleCallback)success
+                                   failure:(nullable WXModuleCallback)failure
                              withContainer:(UIViewController *)container;
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
index 18256da..474cfbf 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXNetworkProtocol.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 __attribute__ ((deprecated("Use WXResourceRequestHandler instead")))
 @protocol WXNetworkProtocol <NSObject>
@@ -36,9 +38,11 @@
  *
  * @param completionCallback This block is called when the last message related to a specific task is sent.
  */
-- (id)sendRequest:(NSURLRequest *)request withSendingData:(void (^)(int64_t bytesSent, int64_t totalBytes))sendDataCallback
-                                             withResponse:(void (^)(NSURLResponse *response))responseCallback
-                                          withReceiveData:(void (^)(NSData *data))receiveDataCallback
-                                          withCompeletion:(void (^)(NSData *totalData, NSError *error))completionCallback;
+- (id)sendRequest:(NSURLRequest *)request withSendingData:(nullable void (^)(int64_t bytesSent, int64_t totalBytes))sendDataCallback
+                                             withResponse:(nullable void (^)(NSURLResponse *response))responseCallback
+                                          withReceiveData:(nullable void (^)(NSData *data))receiveDataCallback
+                                          withCompeletion:(nullable void (^)(NSData *totalData, NSError *error))completionCallback;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXPageEventNotifyEvent.h b/ios/sdk/WeexSDK/Sources/Protocol/WXPageEventNotifyEvent.h
index d21633d..60d6794 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXPageEventNotifyEvent.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXPageEventNotifyEvent.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXJSExceptionInfo.h"
+#import <WeexSDK/WXJSExceptionInfo.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @protocol WXPageEventNotifyEventProtocol <NSObject>
 
@@ -30,3 +32,5 @@
 - (void)pageDestroy:(NSString*)instanceId;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXScrollerProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXScrollerProtocol.h
index 002c0f9..80b04df 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXScrollerProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXScrollerProtocol.h
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-#import "WXType.h"
+#import <WeexSDK/WXType.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @class WXComponent;
 @protocol WXScrollerProtocol <NSObject>
@@ -84,3 +86,4 @@
 
 @end
 
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
index b17dbd7..bc13848 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXURLRewriteProtocol.h
@@ -18,7 +18,9 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXResourceRequest.h"
+#import <WeexSDK/WXResourceRequest.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @class WXSDKInstance;
 
@@ -47,3 +49,5 @@
 - (NSURL *)rewriteURL:(NSString *)url withResourceType:(WXResourceType)resourceType withInstance:(WXSDKInstance *)instance;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXValidateProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXValidateProtocol.h
index 4284f18..b38f32e 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXValidateProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXValidateProtocol.h
@@ -18,13 +18,14 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXSDKInstance.h"
+#import <WeexSDK/WXSDKInstance.h>
 
+NS_ASSUME_NONNULL_BEGIN
 
 @interface WXValidateResult : NSObject
 
-@property(nonatomic,assign)BOOL            isSuccess;
-@property(nonatomic,strong)NSError*        error;
+@property(nonatomic,assign) BOOL            isSuccess;
+@property(nonatomic,strong) NSError* _Nullable    error;
 
 @end
 
@@ -43,8 +44,10 @@
 
 -(BOOL)needValidate:(NSURL*) bundleUrl;
 
--(WXModuleValidateResult *)validateWithWXSDKInstance:(WXSDKInstance *)wxsdkInstance module:(NSString*) moduel method:(NSString *)method args:(NSArray *)args options:(NSDictionary *)options;
+-(WXModuleValidateResult *)validateWithWXSDKInstance:(WXSDKInstance *)wxsdkInstance module:(NSString*) moduel method:(NSString *)method args:(nullable NSArray *)args options:(nullable NSDictionary *)options;
 
--(WXComponentValidateResult *)validateWithWXSDKInstance:(WXSDKInstance *)wxsdkInstance component:(NSString *)componentName supercomponent:(WXComponent *)supercomponent;
+-(WXComponentValidateResult *)validateWithWXSDKInstance:(WXSDKInstance *)wxsdkInstance component:(NSString *)componentName supercomponent:(nullable WXComponent *)supercomponent;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Utility/NSObject+WXSwizzle.h b/ios/sdk/WeexSDK/Sources/Utility/NSObject+WXSwizzle.h
index 3c11c3a..14fd006 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/NSObject+WXSwizzle.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/NSObject+WXSwizzle.h
@@ -20,8 +20,12 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface NSObject (WXSwizzle)
 
 + (BOOL)weex_swizzle:(Class)originalClass Method:(SEL)originalSelector withMethod:(SEL)swizzledSelector;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXAppConfiguration.h b/ios/sdk/WeexSDK/Sources/Utility/WXAppConfiguration.h
index c7c6854..bd189bb 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXAppConfiguration.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXAppConfiguration.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface WXAppConfiguration : NSObject
 
 /**
@@ -64,3 +66,5 @@
 + (void)setCustomizeProtocolClasses:(NSArray*)customizeProtocolClasses;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
index 3b83f5c..c57f4b1 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
@@ -19,8 +19,10 @@
 
 #import <UIKit/UIKit.h>
 #import <objc/runtime.h>
-#import "WXLog.h"
-#import "WXType.h"
+#import <WeexSDK/WXLog.h>
+#import <WeexSDK/WXType.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @class WXLength;
 @class WXBoxShadow;
@@ -103,3 +105,5 @@
 + (WXPixelType)WXPixelType:(id)value DEPRECATED_MSG_ATTRIBUTE("Use [WXConvert WXPixelType:scaleFactor:] instead");
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXConvertUtility.h b/ios/sdk/WeexSDK/Sources/Utility/WXConvertUtility.h
index 33b5f59..a5e64f5 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXConvertUtility.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXConvertUtility.h
@@ -50,3 +50,4 @@
 #endif
 
 #endif
+
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXLog.h b/ios/sdk/WeexSDK/Sources/Utility/WXLog.h
index e6fa666..10fe0b0 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXLog.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXLog.h
@@ -19,6 +19,8 @@
 
 #import <Foundation/Foundation.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 #define WXLogLevel WeexLogLevel
 
 typedef NS_ENUM(NSInteger, WXLogFlag) {
@@ -125,3 +127,5 @@
 #define WXLogInfo(format, ...)          WX_LOG(WXLogFlagInfo, format, ##__VA_ARGS__)
 #define WXLogWarning(format, ...)       WX_LOG(WXLogFlagWarning, format ,##__VA_ARGS__)
 #define WXLogError(format, ...)         WX_LOG(WXLogFlagError, format, ##__VA_ARGS__)
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXType.h b/ios/sdk/WeexSDK/Sources/Utility/WXType.h
index 2ef5c84..e1dafc6 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXType.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXType.h
@@ -20,6 +20,8 @@
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 typedef NS_ENUM(NSUInteger, WXLayoutDirection) {
     WXLayoutDirectionLTR,
     WXLayoutDirectionRTL,
@@ -88,3 +90,5 @@
     WXGradientTypeToTopleft,
     WXGradientTypeToBottomright,
 };
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
index d3636ec..61eeccd 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.h
@@ -19,10 +19,11 @@
 
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
-#import "WXDefine.h"
-#import "WXType.h"
-#import "WXLog.h"
-#import "WXSDKInstance.h"
+
+#import <WeexSDK/WXDefine.h>
+#import <WeexSDK/WXType.h>
+#import <WeexSDK/WXLog.h>
+#import <WeexSDK/WXSDKInstance.h>
 
 // The default screen width which helps us to calculate the real size or scale in different devices.
 static const CGFloat WXDefaultScreenWidth = 750.0;
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXVersion.m b/ios/sdk/WeexSDK/Sources/Utility/WXVersion.m
index 96df48d..b283b3a 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXVersion.m
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXVersion.m
@@ -20,8 +20,10 @@
 #import "WXVersion.h"
 #import "WXDefine.h"
 
-static const char* WeexSDKBuildTime = "2019-07-21 09:08:41 UTC";
-static const unsigned long WeexSDKBuildTimestamp = 1563700121;
+
+static const char* WeexSDKBuildTime = "2019-08-26 08:28:24 UTC";
+static const unsigned long WeexSDKBuildTimestamp = 1566808104;
+
 
 NSString* GetWeexSDKVersion(void)
 {
diff --git a/ios/sdk/WeexSDK/Sources/View/WXErrorView.h b/ios/sdk/WeexSDK/Sources/View/WXErrorView.h
index 80f3954..269e67c 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXErrorView.h
+++ b/ios/sdk/WeexSDK/Sources/View/WXErrorView.h
@@ -19,6 +19,8 @@
 
 #import <UIKit/UIKit.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @protocol WXErrorViewDelegate <NSObject>
 
 - (void)onclickErrorView;
@@ -30,3 +32,5 @@
 @property (nonatomic, weak) id<WXErrorViewDelegate>  delegate;
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/View/WXView.h b/ios/sdk/WeexSDK/Sources/View/WXView.h
index c7f0afd..a1758df 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXView.h
+++ b/ios/sdk/WeexSDK/Sources/View/WXView.h
@@ -19,6 +19,10 @@
 
 #import <UIKit/UIKit.h>
 
+NS_ASSUME_NONNULL_BEGIN
+
 @interface WXView : UIView
 
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h
index 5ac21e1..ae4bf14 100644
--- a/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h
+++ b/ios/sdk/WeexSDK/Sources/WebSocket/WXWebSocketHandler.h
@@ -18,20 +18,24 @@
  */
 
 #import <Foundation/Foundation.h>
-#import "WXModuleProtocol.h"
+#import <WeexSDK/WXModuleProtocol.h>
+
+NS_ASSUME_NONNULL_BEGIN
 
 @protocol WXWebSocketDelegate<NSObject>
 - (void)didOpen;
 - (void)didFailWithError:(NSError *)error;
 - (void)didReceiveMessage:(id)message;
-- (void)didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
+- (void)didCloseWithCode:(NSInteger)code reason:(nullable NSString *)reason wasClean:(BOOL)wasClean;
 @end
 
 @protocol WXWebSocketHandler<NSObject>
 
-- (void)open:(NSString *)url protocol:(NSString *)protocol identifier:(NSString *)identifier withDelegate:(id<WXWebSocketDelegate>)delegate;
+- (void)open:(NSString *)url protocol:(NSString *)protocol identifier:(nullable NSString *)identifier withDelegate:(id<WXWebSocketDelegate>)delegate;
 - (void)send:(NSString *)identifier data:(NSString *)data;
 - (void)close:(NSString *)identifier;
-- (void)close:(NSString *)identifier code:(NSInteger)code reason:(NSString *)reason;
+- (void)close:(NSString *)identifier code:(NSInteger)code reason:(nullable NSString *)reason;
 - (void)clear:(NSString *)identifier;
 @end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/sdk/WeexSDK/Sources/WeexSDK.h b/ios/sdk/WeexSDK/Sources/WeexSDK.h
index 5215c02..8e5f6f4 100644
--- a/ios/sdk/WeexSDK/Sources/WeexSDK.h
+++ b/ios/sdk/WeexSDK/Sources/WeexSDK.h
@@ -17,77 +17,80 @@
 * under the License.
  */
 
-#ifdef __OBJC__
+#import <UIKit/UIKit.h>
 
-#import "style.h"
-#import "layout.h"
-#import "flex_enum.h"
-#import "eagle_bridge.h"
-#import "WXWebSocketHandler.h"
-#import "WXVoiceOverModule.h"
-#import "WXView.h"
-#import "WXValidateProtocol.h"
-#import "WXUtility.h"
-#import "WXURLRewriteProtocol.h"
-#import "WXType.h"
-#import "WXStreamModule.h"
-#import "WXScrollerProtocol.h"
-#import "WXScrollerComponent.h"
-#import "WXSDKManager.h"
-#import "WXSDKInstance.h"
-#import "WXSDKError.h"
-#import "WXSDKEngine.h"
-#import "WXRootViewController.h"
-#import "WXRichText.h"
-#import "WXResourceResponse.h"
-#import "WXResourceRequestHandler.h"
-#import "WXResourceRequest.h"
-#import "WXResourceLoader.h"
-#import "WXRefreshComponent.h"
-#import "WXRecyclerComponent.h"
-#import "WXPrerenderManager.h"
-#import "WXPageEventNotifyEvent.h"
-#import "WXNetworkProtocol.h"
-#import "WXNavigationProtocol.h"
-#import "WXNavigationDefaultImpl.h"
-#import "WXMonitor.h"
-#import "WXModuleProtocol.h"
-#import "WXModalUIModule.h"
-#import "WXLog.h"
-#import "WXListComponent.h"
-#import "WXJSFrameworkLoadProtocol.h"
-#import "WXJSExceptionProtocol.h"
-#import "WXJSExceptionInfo.h"
-#import "WXInvocationConfig.h"
-#import "WXIndicatorComponent.h"
-#import "WXImgLoaderProtocol.h"
-#import "WXHandlerFactory.h"
-#import "WXExtendCallNativeProtocol.h"
-#import "WXExceptionUtils.h"
-#import "WXEventModuleProtocol.h"
-#import "WXErrorView.h"
-#import "WXDefine.h"
-#import "WXDebugTool.h"
-#import "WXDataRenderHandler.h"
-#import "WXConvertUtility.h"
-#import "WXConvert.h"
-#import "WXConfigCenterProtocol.h"
-#import "WXComponentManager.h"
-#import "WXComponentFactory.h"
-#import "WXComponent.h"
-#import "WXComponent+Layout.h"
-#import "WXBridgeProtocol.h"
-#import "WXBridgeMethod.h"
-#import "WXBridgeManager.h"
-#import "WXBaseViewController.h"
-#import "WXAppMonitorProtocol.h"
-#import "WXAppConfiguration.h"
-#import "WXApmProtocol.h"
-#import "WXApmForInstance.h"
-#import "WXAnalyzerProtocol.h"
-#import "WXAnalyzerCenter.h"
-#import "WXAComponent.h"
-#import "NSObject+WXSwizzle.h"
-#import "JSContext+Weex.h"
+FOUNDATION_EXPORT double WeexSDKVersionNumber;
 
-#endif /* __OBJC__ */
+FOUNDATION_EXPORT const unsigned char WeexSDKVersionString[];
+
+#import <WeexSDK/style.h>
+#import <WeexSDK/layout.h>
+#import <WeexSDK/flex_enum.h>
+#import <WeexSDK/eagle_bridge.h>
+#import <WeexSDK/WXWebSocketHandler.h>
+#import <WeexSDK/WXVoiceOverModule.h>
+#import <WeexSDK/WXView.h>
+#import <WeexSDK/WXValidateProtocol.h>
+#import <WeexSDK/WXUtility.h>
+#import <WeexSDK/WXURLRewriteProtocol.h>
+#import <WeexSDK/WXType.h>
+#import <WeexSDK/WXStreamModule.h>
+#import <WeexSDK/WXScrollerProtocol.h>
+#import <WeexSDK/WXScrollerComponent.h>
+#import <WeexSDK/WXSDKManager.h>
+#import <WeexSDK/WXSDKInstance.h>
+#import <WeexSDK/WXSDKError.h>
+#import <WeexSDK/WXSDKEngine.h>
+#import <WeexSDK/WXRootViewController.h>
+#import <WeexSDK/WXRichText.h>
+#import <WeexSDK/WXResourceResponse.h>
+#import <WeexSDK/WXResourceRequestHandler.h>
+#import <WeexSDK/WXResourceRequest.h>
+#import <WeexSDK/WXResourceLoader.h>
+#import <WeexSDK/WXRefreshComponent.h>
+#import <WeexSDK/WXRecyclerComponent.h>
+#import <WeexSDK/WXPrerenderManager.h>
+#import <WeexSDK/WXPageEventNotifyEvent.h>
+#import <WeexSDK/WXNetworkProtocol.h>
+#import <WeexSDK/WXNavigationProtocol.h>
+#import <WeexSDK/WXNavigationDefaultImpl.h>
+#import <WeexSDK/WXMonitor.h>
+#import <WeexSDK/WXModuleProtocol.h>
+#import <WeexSDK/WXModalUIModule.h>
+#import <WeexSDK/WXLog.h>
+#import <WeexSDK/WXListComponent.h>
+#import <WeexSDK/WXJSFrameworkLoadProtocol.h>
+#import <WeexSDK/WXJSExceptionProtocol.h>
+#import <WeexSDK/WXJSExceptionInfo.h>
+#import <WeexSDK/WXInvocationConfig.h>
+#import <WeexSDK/WXIndicatorComponent.h>
+#import <WeexSDK/WXImgLoaderProtocol.h>
+#import <WeexSDK/WXHandlerFactory.h>
+#import <WeexSDK/WXExtendCallNativeProtocol.h>
+#import <WeexSDK/WXExceptionUtils.h>
+#import <WeexSDK/WXEventModuleProtocol.h>
+#import <WeexSDK/WXErrorView.h>
+#import <WeexSDK/WXDefine.h>
+#import <WeexSDK/WXDebugTool.h>
+#import <WeexSDK/WXDataRenderHandler.h>
+#import <WeexSDK/WXConvertUtility.h>
+#import <WeexSDK/WXConvert.h>
+#import <WeexSDK/WXConfigCenterProtocol.h>
+#import <WeexSDK/WXComponentManager.h>
+#import <WeexSDK/WXComponentFactory.h>
+#import <WeexSDK/WXComponent.h>
+#import <WeexSDK/WXComponent+Layout.h>
+#import <WeexSDK/WXBridgeProtocol.h>
+#import <WeexSDK/WXBridgeMethod.h>
+#import <WeexSDK/WXBridgeManager.h>
+#import <WeexSDK/WXBaseViewController.h>
+#import <WeexSDK/WXAppMonitorProtocol.h>
+#import <WeexSDK/WXAppConfiguration.h>
+#import <WeexSDK/WXApmProtocol.h>
+#import <WeexSDK/WXApmForInstance.h>
+#import <WeexSDK/WXAnalyzerProtocol.h>
+#import <WeexSDK/WXAnalyzerCenter.h>
+#import <WeexSDK/WXAComponent.h>
+#import <WeexSDK/NSObject+WXSwizzle.h>
+#import <WeexSDK/JSContext+Weex.h>
+
diff --git a/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m b/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
index d2af216..8b5ae6a 100644
--- a/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
+++ b/ios/sdk/WeexSDKTests/WXAnimationModuleTests.m
@@ -18,10 +18,7 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXSDKInstance.h"
-#import "WXComponent.h"
-#import "WXConvert.h"
-#import "WXComponent_internal.h"
+#import <WeexSDK/WeexSDK.h>
 #import "WXAnimationModule.h"
 #import "TestSupportUtils.h"
 
diff --git a/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m b/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
index e8fbc93..e2fc622 100644
--- a/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
+++ b/ios/sdk/WeexSDKTests/WXBridgeMethodTests.m
@@ -18,9 +18,8 @@
  */
 
 #import <XCTest/XCTest.h>
+#import <WeexSDK/WeexSDK.h>
 #import "WXCallJSMethod.h"
-#import "WXSDKInstance.h"
-#import "WXTestBridgeMethodDummy.h"
 
 @interface WXBridgeMethodTests : XCTestCase
 
diff --git a/ios/sdk/WeexSDKTests/WXComponentTests.m b/ios/sdk/WeexSDKTests/WXComponentTests.m
index eba7fef..792d4c3 100644
--- a/ios/sdk/WeexSDKTests/WXComponentTests.m
+++ b/ios/sdk/WeexSDKTests/WXComponentTests.m
@@ -18,10 +18,8 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXSDKInstance.h"
-#import "WXComponent.h"
-#import "WXComponent_internal.h"
-#import "WXUtility.h"
+#import <WeexSDK/WeexSDK.h>
+
 
 @interface WXTestComponent : WXComponent
 
@@ -110,27 +108,6 @@
     XCTAssertTrue(1 == component.retainCount);
 }
 
-- (void)testLazyCreatView
-{
-    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-        WXSDKInstance *instance = [[WXSDKInstance alloc] init];
-        WXComponent *component = [[WXComponent alloc] initWithRef:@"0" type:@"div" styles:@{} attributes:@{} events:@[] weexInstance:instance];
-        WXComponent *subcomponent = [[WXComponent alloc] initWithRef:@"1" type:@"div" styles:@{} attributes:@{} events:@[] weexInstance:instance];
-        WXComponent *subSubcomponent = [[WXComponent alloc] initWithRef:@"2" type:@"div" styles:@{} attributes:@{} events:@[] weexInstance:instance];
-        subcomponent->_lazyCreateView = YES;
-        [component _insertSubcomponent:subcomponent atIndex:0];
-        [subcomponent _insertSubcomponent:subSubcomponent atIndex:0];
-        dispatch_async(dispatch_get_main_queue(), ^{
-            __unused UIView *view = component.view;
-            XCTAssertFalse([subcomponent isViewLoaded], @"Component which has lazyCreateView should create view when used");
-            XCTAssertFalse([subSubcomponent isViewLoaded], @"Component which has lazyCreateView should create view when used");
-            __unused UIView *subView = subcomponent.view;
-            XCTAssertTrue([subSubcomponent isViewLoaded], @"Component's lazyCreateView can not create subview.");
-            XCTAssertEqual(subSubcomponent.view.superview, subcomponent.view, @"Component's lazyCreateView can not add subcomponent's view to subview");
-        });
-    });
-}
-
 #define XCTAssertEqualCGFloat(expression1, expression2, ...) \
     XCTAssertEqualWithAccuracy(expression1, expression2, 0.00001)
 
diff --git a/ios/sdk/WeexSDKTests/WXConvertTests.m b/ios/sdk/WeexSDKTests/WXConvertTests.m
index 6385c5d..36a055c 100644
--- a/ios/sdk/WeexSDKTests/WXConvertTests.m
+++ b/ios/sdk/WeexSDKTests/WXConvertTests.m
@@ -18,7 +18,7 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXConvert.h"
+#import <WeexSDK/WeexSDK.h>
 
 @interface WXConvertTests : XCTestCase
 
diff --git a/ios/sdk/WeexSDKTests/WXFloatCompareTests.m b/ios/sdk/WeexSDKTests/WXFloatCompareTests.m
index 261699b..b74b554 100644
--- a/ios/sdk/WeexSDKTests/WXFloatCompareTests.m
+++ b/ios/sdk/WeexSDKTests/WXFloatCompareTests.m
@@ -18,7 +18,7 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXUtility.h"
+#import <WeexSDK/WeexSDK.h>
 
 @interface WXFloatCompareTests : XCTestCase
 
diff --git a/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m b/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
index 806674d..830fb06 100644
--- a/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
+++ b/ios/sdk/WeexSDKTests/WXInstanceWrapTests.m
@@ -18,8 +18,8 @@
  */
 
 #import <XCTest/XCTest.h>
+#import <WeexSDK/WeexSDK.h>
 #import "WXInstanceWrap.h"
-#import "WXSDKInstance.h"
 
 @interface WXInstanceWrapTests : XCTestCase
 
diff --git a/ios/sdk/WeexSDKTests/WXRootViewTests.m b/ios/sdk/WeexSDKTests/WXRootViewTests.m
index 3f3fa58..4a26a3e 100644
--- a/ios/sdk/WeexSDKTests/WXRootViewTests.m
+++ b/ios/sdk/WeexSDKTests/WXRootViewTests.m
@@ -18,11 +18,9 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXSDKInstance.h"
+#import <WeexSDK/WeexSDK.h>
 #import "TestSupportUtils.h"
-#import "WXSDKEngine.h"
-#import "WXLog.h"
-#import "WXUtility.h"
+
 
 @interface WXRootViewTests : XCTestCase
 
diff --git a/ios/sdk/WeexSDKTests/WXSDKEngineTests.m b/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
index b1bd414..a28230f 100644
--- a/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
+++ b/ios/sdk/WeexSDKTests/WXSDKEngineTests.m
@@ -18,11 +18,8 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXSDKEngine.h"
+#import <WeexSDK/WeexSDK.h>
 #import "WXModuleFactory.h"
-#import "WXComponentFactory.h"
-#import "WXHandlerFactory.h"
-#import "WXResourceRequest.h"
 #import "WXResourceRequestHandlerDefaultImpl.h"
 
 @interface WXSDKEngineTests : XCTestCase
diff --git a/ios/sdk/WeexSDKTests/WXSDKManagerTests.m b/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
index 33b9b63..4c6101c 100644
--- a/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
+++ b/ios/sdk/WeexSDKTests/WXSDKManagerTests.m
@@ -18,9 +18,7 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXSDKManager.h"
-#import "WXSDKInstance.h"
-#import "TestSupportUtils.h"
+#import <WeexSDK/WeexSDK.h>
 
 @interface WXSDKManagerTests : XCTestCase
 
diff --git a/ios/sdk/WeexSDKTests/WXStorageTests.m b/ios/sdk/WeexSDKTests/WXStorageTests.m
index b14ada1..25eeb8c 100644
--- a/ios/sdk/WeexSDKTests/WXStorageTests.m
+++ b/ios/sdk/WeexSDKTests/WXStorageTests.m
@@ -18,7 +18,6 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WeexSDK.h"
 #import "WXStorageModule.h"
 
 @interface WXStorageTests : XCTestCase
diff --git a/ios/sdk/WeexSDKTests/WXStreamModuleTests.m b/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
index 40c32a8..7bdd9b6 100644
--- a/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
+++ b/ios/sdk/WeexSDKTests/WXStreamModuleTests.m
@@ -18,10 +18,11 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXStreamModule.h"
-#import "WeexSDK.h"
+#import <WeexSDK/WeexSDK.h>
 #import "WXResourceRequestHandlerDefaultImpl.h"
 
+
+
 @interface WXStreamModuleTests : XCTestCase
 @property (nonatomic, strong)  WXStreamModule *streamModule;
 @property (nonatomic, strong)XCTestExpectation *exp;
diff --git a/ios/sdk/WeexSDKTests/WXTimerModuleTests.m b/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
index e4ebb40..23f040a 100644
--- a/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
+++ b/ios/sdk/WeexSDKTests/WXTimerModuleTests.m
@@ -18,6 +18,7 @@
  */
 
 #import <XCTest/XCTest.h>
+#import <WeexSDK/WeexSDK.h>
 #import "WXTimerModule.h"
 #import "TestSupportUtils.h"
 
diff --git a/ios/sdk/WeexSDKTests/WXURLRewriteTests.m b/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
index f1111e3..49c6c4a 100644
--- a/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
+++ b/ios/sdk/WeexSDKTests/WXURLRewriteTests.m
@@ -18,10 +18,7 @@
  */
 
 #import <XCTest/XCTest.h>
-#import "WXURLRewriteProtocol.h"
-#import "WXHandlerFactory.h"
-#import "WXSDKInstance.h"
-#import "WXSDKEngine.h"
+#import <WeexSDK/WeexSDK.h>
 
 @interface WXURLRewriteTests : XCTestCase
 
diff --git a/ios/sdk/buildScripts.sh b/ios/sdk/buildScripts.sh
index fba15da..add76b1 100644
--- a/ios/sdk/buildScripts.sh
+++ b/ios/sdk/buildScripts.sh
@@ -28,8 +28,12 @@
 * under the License.' >> $headerFilePath
 	echo ' */' >> $headerFilePath
 	echo '' >> $headerFilePath
-	echo '#ifdef __OBJC__' >> $headerFilePath
+	echo '#import <UIKit/UIKit.h>' >> $headerFilePath
 	echo '' >> $headerFilePath
+    echo 'FOUNDATION_EXPORT double WeexSDKVersionNumber;' >> $headerFilePath
+    echo '' >> $headerFilePath
+    echo 'FOUNDATION_EXPORT const unsigned char WeexSDKVersionString[];' >> $headerFilePath
+    echo '' >> $headerFilePath
 	return 0;
 }
 
@@ -38,7 +42,7 @@
 function generateFileFooter() {
 	headerFilePath=$1
 	echo '' >> $headerFilePath
-	echo '#endif /* __OBJC__ */' >> $headerFilePath
+#    echo '#endif /* __OBJC__ */' >> $headerFilePath
 	return 0;
 }
 
@@ -96,7 +100,7 @@
 			if [ "$exclude" = "yes" ]; then
 				continue
 			fi
-			echo "#import \"$header\"" >> $headerFilePath
+			echo "#import <WeexSDK/$header>" >> $headerFilePath
 		fi
 	done
 	return 0;
diff --git a/weex-playground b/weex-playground
index b93e553..1f536fa 160000
--- a/weex-playground
+++ b/weex-playground
@@ -1 +1 @@
-Subproject commit b93e553ebf434baffa7d7f2f71f0a9f1e8cc9de1
+Subproject commit 1f536fa83893520568bccdefffdeb469c7e957cf
diff --git a/weex_core/Source/android/bridge/multi_so_initializer.cpp b/weex_core/Source/android/bridge/multi_so_initializer.cpp
index 7014f3d..de463eb 100644
--- a/weex_core/Source/android/bridge/multi_so_initializer.cpp
+++ b/weex_core/Source/android/bridge/multi_so_initializer.cpp
@@ -43,7 +43,7 @@
     soPath = SoUtils::FindLibJssSoPath();
   }
 
-  LOGE("final executablePath:%s", soPath.c_str());
+  LOGD("final executablePath:%s", soPath.c_str());
   SoUtils::updateSoLinkPath(SoUtils::lib_ld_path());
   void *handle = dlopen(soPath.c_str(), RTLD_NOW);
   if (!handle) {
diff --git a/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp b/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
index 7cc4ec6..4a3dbff 100644
--- a/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
+++ b/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
@@ -1001,14 +1001,14 @@
   std::unique_ptr<MultiProcessAndSoInitializer> initializer(
       new MultiProcessAndSoInitializer);
 
-  LOGE("ScriptBridgeInMultiProcess");
+  LOGD("ScriptBridgeInMultiProcess");
   bool passable = initializer->Init(
       [this](IPCHandler *handler) { RegisterIPCCallback(handler); },
       [this](std::unique_ptr<WeexJSConnection> connection) {
         static_cast<bridge::script::ScriptSideInMultiProcess *>(script_side())
             ->set_sender(connection->sender());
         connection_ = std::move(connection);
-        LOGE("ScriptBridgeInMultiProcess finish");
+        LOGD("ScriptBridgeInMultiProcess finish");
         return true;
       },
       [this](const char *page_id, const char *func,
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
index fa4cb02..fc4a1f8 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
@@ -101,6 +101,7 @@
 namespace weex {
     namespace bridge {
         namespace js {
+            bool ScriptBridgeInMultiProcess::has_read_alarm_config = false;
 
             static inline const char* GetUTF8StringFromIPCArg(IPCArguments* arguments, size_t index) {
                 return arguments->getByteArray(index)->length == 0 ? nullptr : arguments->getByteArray(index)->content;
@@ -275,6 +276,20 @@
                             WeexEnv::getEnv()->set_m_cache_task_(enable);
                         }
                     }
+                    if (!has_read_alarm_config){
+#ifdef USE_JS_RUNTIME
+                        std::string type = init_framework_params->type->content;
+                        std::string value = init_framework_params->value->content;
+#else
+                        auto type = String::fromUTF8(init_framework_params->type->content);
+                        auto value = String::fromUTF8(init_framework_params->value->content);
+#endif
+                        if (type == "enableAlarmSignal"){
+                            has_read_alarm_config = true;
+                            auto enable = value =="true";
+                            WeexEnv::getEnv()->enableHandleAlarmSignal(enable);
+                        }
+                    }
 
                     params.push_back(init_framework_params);
                 }
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h
index c0163c8..7190ef3 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h
+++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h
@@ -71,6 +71,7 @@
  private:
   static ScriptBridgeInMultiProcess* g_instance;
   DISALLOW_COPY_AND_ASSIGN(ScriptBridgeInMultiProcess);
+  static bool has_read_alarm_config;
 };
 }  // namespace js
 }  // namespace bridge
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp b/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp
index ea0f6ac..67054ea 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp
@@ -58,7 +58,7 @@
 
     if(WeexEnv::getEnv()->can_m_cache_task_()) {
       WeexEnv::getEnv()->m_task_cache_.push_back(new InitFrameworkTask(String::fromUTF8(script), params));
-      LOGE("cache initFramework %d", WeexEnv::getEnv()->m_task_cache_.size());
+      LOGD("cache initFramework %d", WeexEnv::getEnv()->m_task_cache_.size());
     } else {
       weexTaskQueue_bk_ = new WeexTaskQueue(weexTaskQueue_->isMultiProgress);
       weexTaskQueue_bk_->addTask(new InitFrameworkTask(String::fromUTF8(script), params));
@@ -136,7 +136,7 @@
     ExeJsServicesTask *task = new ExeJsServicesTask(String::fromUTF8(source));
     if(WeexEnv::getEnv()->can_m_cache_task_() && weexTaskQueue_bk_ == nullptr){
       WeexEnv::getEnv()->m_task_cache_.push_back(task);
-      LOGE("cache ExecJsService %d", WeexEnv::getEnv()->m_task_cache_.size());
+      LOGD("cache ExecJsService %d", WeexEnv::getEnv()->m_task_cache_.size());
     } else {
       weexTaskQueue_bk_->addTask(task);
     }
@@ -171,7 +171,7 @@
     if (WeexEnv::getEnv()->enableBackupThread()) {
       if(WeexEnv::getEnv()->can_m_cache_task_() && weexTaskQueue_bk_ == nullptr){
         WeexEnv::getEnv()->m_task_cache_.push_back(task->clone());
-        LOGE("cache ExecJS %d", WeexEnv::getEnv()->m_task_cache_.size());
+        LOGD("cache ExecJS %d", WeexEnv::getEnv()->m_task_cache_.size());
       } else {
         weexTaskQueue_bk_->addTask(task->clone());
       }
@@ -278,7 +278,7 @@
       //don't need wait. just run js.
     std::unique_ptr<WeexJSResult> returnResult;
     returnResult.reset(new WeexJSResult());
-    LOGE("test-> return default result");
+    LOGD("test-> return default result");
     return returnResult;
   }
   auto future = std::unique_ptr<WeexTask::Future>(new WeexTask::Future());
diff --git a/weex_core/Source/android/jsengine/object/weex_env.h b/weex_core/Source/android/jsengine/object/weex_env.h
index 4793735..053c727 100644
--- a/weex_core/Source/android/jsengine/object/weex_env.h
+++ b/weex_core/Source/android/jsengine/object/weex_env.h
@@ -97,6 +97,9 @@
     bool enableBackupThread() {
         return enableBackupThread__;
     }
+    inline void enableHandleAlarmSignal(bool enable){
+        crashHandler->setEnableAlarmSignal(enable);
+    }
 
     void jsc_init_finished() { isJscInitOk_ = true; };
 
diff --git a/weex_core/Source/android/jsengine/task/timer_queue.cpp b/weex_core/Source/android/jsengine/task/timer_queue.cpp
index 38a9a8c..f4a7aca 100644
--- a/weex_core/Source/android/jsengine/task/timer_queue.cpp
+++ b/weex_core/Source/android/jsengine/task/timer_queue.cpp
@@ -44,12 +44,12 @@
 void TimerQueue::start() {
     while (true) {
         auto pTask = getTask();
-        LOGE("getTask return task");
+        LOGD("getTask return task");
 
         if(pTask->global_object_ != nullptr && weexTaskQueue->weexRuntime->hasInstanceId(pTask->instanceID)) {
             weexTaskQueue->addTimerTask(pTask->instanceID, pTask->m_function, pTask->taskId,pTask->global_object_, !pTask->repeat);
             if (pTask->repeat && pTask->global_object_ != nullptr && weexTaskQueue->weexRuntime->hasInstanceId(pTask->instanceID)) {
-                LOGE("repreat");
+                LOGD("repreat");
                 addTimerTask(new TimerTask(pTask));
             }
         }
diff --git a/weex_core/Source/android/jsengine/weex_runtime.cpp b/weex_core/Source/android/jsengine/weex_runtime.cpp
index eb1b3dd..5468834 100644
--- a/weex_core/Source/android/jsengine/weex_runtime.cpp
+++ b/weex_core/Source/android/jsengine/weex_runtime.cpp
@@ -493,7 +493,7 @@
 }
 
 std::unique_ptr<WeexJSResult> WeexRuntime::exeJSOnInstance(const String &instanceId, const String &script) {
-    LOGE("test-> [runtime] beofore exeJSOnInstance");
+    LOGD("test-> [runtime] beofore exeJSOnInstance");
     std::unique_ptr<WeexJSResult> returnResult;
     returnResult.reset(new WeexJSResult);
 
@@ -526,7 +526,7 @@
     char *buf = new char[returnResult->length + 1];
     strcpy(buf, data);
     returnResult->data.reset(buf);
-    LOGE("test-> [runtime] end exeJSOnInstance");
+    LOGD("test-> [runtime] end exeJSOnInstance");
     return returnResult;
 }
 
diff --git a/weex_core/Source/android/multiprocess/weex_js_connection.cpp b/weex_core/Source/android/multiprocess/weex_js_connection.cpp
index e4aefa8..51d25d9 100644
--- a/weex_core/Source/android/multiprocess/weex_js_connection.cpp
+++ b/weex_core/Source/android/multiprocess/weex_js_connection.cpp
@@ -163,6 +163,7 @@
         int _errno = errno;
         //throw IPCException("failed to map ashmem region: %s", strerror(_errno));
         newThreadStatus = ERROR;
+        base::android::DetachFromVM();
         return nullptr;
     }
 
@@ -173,15 +174,24 @@
     std::unique_ptr<IPCSender> sender(createIPCSender(futexPageQueue.get(), handler));
     std::unique_ptr<IPCListener> listener =std::move(createIPCListener(futexPageQueue.get(), handler)) ;
     newThreadStatus = SUCCESS;
+    WeexCore::WeexCoreManager::Instance()->server_queue_=futexPageQueue.get();
 
     try {
       futexPageQueue->spinWaitPeer();
       listener->listen();
     } catch (IPCException &e) {
         LOGE("IPCException server died %s",e.msg());
+        WeexCore::WeexCoreManager::Instance()->server_queue_= nullptr;
+        if (WeexCoreManager::Instance()->do_release_map()){
+            futexPageQueue.reset();
+        }
         base::android::DetachFromVM();
         pthread_exit(NULL);
     }
+    WeexCore::WeexCoreManager::Instance()->server_queue_= nullptr;
+    if (WeexCoreManager::Instance()->do_release_map()){
+        futexPageQueue.reset();
+    }
     return nullptr;
 }
 
@@ -206,6 +216,7 @@
   m_impl->serverSender = std::move(sender);
   m_impl->futexPageQueue = std::move(futexPageQueue);
 
+  WeexCore::WeexCoreManager::Instance()->client_queue_=m_impl->futexPageQueue.get();
   pthread_attr_t threadAttr;
   newThreadStatus = UNFINISH;
 
@@ -294,6 +305,7 @@
 
 void WeexJSConnection::end() {
   try {
+    WeexCoreManager::Instance()->client_queue_ = nullptr;
     m_impl->serverSender.reset();
     m_impl->futexPageQueue.reset();
   } catch (IPCException &e) {
@@ -334,11 +346,11 @@
   fseek(f,0L,SEEK_END);
   int size=ftell(f);
 
-    LOGE("file size is %d",size);
+    LOGD("file size is %d",size);
     struct stat statbuf;
     stat("/proc/self/maps",&statbuf);
     int size1=statbuf.st_size;
-    LOGE("file size1 is %d",size1);
+    LOGD("file size1 is %d",size1);
   char buffer[256];
   char *line;
   while ((line = fgets(buffer, 256, f))) {
@@ -401,7 +413,7 @@
   std::string executablePath;
   std::string icuDataPath;
   if(SoUtils::jss_icu_path() != nullptr) {
-    LOGE("jss_icu_path not null %s",SoUtils::jss_icu_path());
+    LOGD("jss_icu_path not null %s",SoUtils::jss_icu_path());
     icuDataPath = SoUtils::jss_icu_path();
   } else {
     s_in_find_icu = true;
@@ -529,7 +541,7 @@
       const char *argv[] = {executableName.c_str(), fdStr, fdServerStr, traceEnable ? "1" : "0", g_crashFileName.c_str(), nullptr};
       if (-1 == execve(argv[0], const_cast<char *const *>(&argv[0]),
                        const_cast<char *const *>(envp.get()))) {
-          LOGE("bbbbbbbbbbbb execve failed errno %s \n", strerror(errno));
+          LOGE("execve failed errno %s \n", strerror(errno));
 #if PRINT_LOG_CACHEFILE
         mcfile << "execve failed:" << strerror(errno) << std::endl;
 #endif
diff --git a/weex_core/Source/android/utils/params_utils.cpp b/weex_core/Source/android/utils/params_utils.cpp
index e79ed1a..abeaa86 100644
--- a/weex_core/Source/android/utils/params_utils.cpp
+++ b/weex_core/Source/android/utils/params_utils.cpp
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+#include <core/manager/weex_core_manager.h>
 #include "android/utils/params_utils.h"
 #include "android/base/string/string_utils.h"
 #include "android/utils/so_utils.h"
@@ -221,6 +222,15 @@
     }
   }
 
+  jmethodID m_release_map =  env->GetMethodID(c_params, "getReleaseMap", "()Z");
+  if (m_release_map == nullptr) {
+    WeexCoreManager::Instance()->set_release_map(false);
+    LOGE("m_release_map method is missing");
+  } else {
+    jboolean j_release_map_bool = env->CallBooleanMethod(params,m_release_map);
+    WeexCoreManager::Instance()->set_release_map(j_release_map_bool==JNI_TRUE);
+  }
+
   jmethodID m_get_jsc_so_path =
           env->GetMethodID(c_params, "getLibJscPath", "()Ljava/lang/String;");
   if (m_get_jsc_so_path != nullptr) {
@@ -280,7 +290,7 @@
     if (j_get_jsb_so_path != nullptr) {
       SoUtils::set_jsb_so_path(const_cast<char*>(
                                     env->GetStringUTFChars((jstring)(j_get_jsb_so_path), nullptr)));
-      LOGE("g_jsbSoPath is %s ", SoUtils::jsb_so_path());
+      LOGD("g_jsbSoPath is %s ", SoUtils::jsb_so_path());
       env->DeleteLocalRef(j_get_jsb_so_path);
     }
   }
@@ -294,7 +304,7 @@
     if (j_get_lib_ld_path != nullptr) {
       SoUtils::set_lib_ld_path(const_cast<char*>(
                                         env->GetStringUTFChars((jstring)(j_get_lib_ld_path), nullptr)));
-      LOGE("lib_ld_path is %s ", SoUtils::lib_ld_path());
+      LOGD("lib_ld_path is %s ", SoUtils::lib_ld_path());
       env->DeleteLocalRef(j_get_lib_ld_path);
     }
   }
diff --git a/weex_core/Source/android/wrap/wx_bridge.cpp b/weex_core/Source/android/wrap/wx_bridge.cpp
index d0e7466..21ba6fc 100755
--- a/weex_core/Source/android/wrap/wx_bridge.cpp
+++ b/weex_core/Source/android/wrap/wx_bridge.cpp
@@ -48,6 +48,7 @@
 #include "third_party/json11/json11.hpp"
 #include "core/moniter/render_performance.h"
 #include "core/render/page/render_page_base.h"
+#include "third_party/IPC/IPCFutexPageQueue.h"
 
 using namespace WeexCore;
 jlongArray jFirstScreenRenderTime = nullptr;
@@ -287,6 +288,24 @@
       ->SetLogType(l, flag);
 }
 
+static jstring nativeDumpIpcPageQueueInfo(JNIEnv* env, jobject jcaller){
+    std::string client_quene_msg;
+    if (WeexCoreManager::Instance()->client_queue_ != nullptr){
+        WeexCoreManager::Instance()->client_queue_->dumpPageInfo(client_quene_msg);
+    }
+    std::string server_quene_msg;
+    if (WeexCoreManager::Instance()->server_queue_ != nullptr){
+        WeexCoreManager::Instance()->server_queue_->dumpPageInfo(server_quene_msg);
+    }
+    std::string result ;
+    result = "{client:"+client_quene_msg+"}\n"+"{server:"+server_quene_msg+"}";
+    return env->NewStringUTF(result.c_str());
+}
+static void ReloadPageLayout(JNIEnv *env, jobject jcaller,
+                              jstring instanceId){
+  WeexCoreManager::Instance()->getPlatformBridge()->core_side()->RelayoutUsingRawCssStyles(jString2StrFast(env,instanceId));
+}
+
 static void SetPageArgument(JNIEnv* env, jobject jcaller,
                             jstring instanceId,
                             jstring key,
@@ -296,6 +315,10 @@
             ->core_side()->SetPageArgument(jString2StrFast(env, instanceId),
                                            jString2StrFast(env, key), jString2StrFast(env, value));
 }
+static void SetDeviceDisplayOfPage(JNIEnv *env, jobject jcaller,
+                                   jstring instanceId,jfloat width,jfloat height){
+  WeexCoreManager::Instance()->getPlatformBridge()->core_side()->SetDeviceDisplayOfPage(jString2StrFast(env,instanceId),width,height);
+}
 
 static void SetDeviceDisplay(JNIEnv* env, jobject jcaller, jstring instanceId,
                            jfloat value, float height, float scale) {
diff --git a/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h b/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h
index c059a6f..f7955cd 100755
--- a/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h
+++ b/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h
@@ -210,6 +210,13 @@
 static void SetLogType(JNIEnv* env, jobject jcaller, jfloat type,
                        jfloat isPerf);
 
+static jstring nativeDumpIpcPageQueueInfo(JNIEnv* env, jobject jcaller);
+static void ReloadPageLayout(JNIEnv *env, jobject jcaller,
+                             jstring instanceId);
+static void SetDeviceDisplayOfPage(JNIEnv *env, jobject jcaller,
+                                   jstring instanceId,jfloat width,jfloat height);
+
+
 // Step 2: method stubs.
 
 static intptr_t g_WXBridge_onReceivedResult = 0;
@@ -1390,6 +1397,22 @@
      "F"
      ")"
      "V", reinterpret_cast<void *>(SetLogType)},
+    { "nativeDumpIpcPageQueueInfo",
+    "("
+    ")"
+    "Ljava/lang/String;", reinterpret_cast<void*>(nativeDumpIpcPageQueueInfo) },
+    {"nativeReloadPageLayout",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V",reinterpret_cast<void *>(ReloadPageLayout)},
+    {"nativeSetDeviceDisplayOfPage",
+    "("
+    "Ljava/lang/String;"
+    "F"
+    "F"
+    ")"
+    "V",reinterpret_cast<void *>(SetDeviceDisplayOfPage)}
 };
 
 static bool RegisterNativesImpl(JNIEnv *env) {
diff --git a/weex_core/Source/base/crash/crash_handler.cpp b/weex_core/Source/base/crash/crash_handler.cpp
index 15197ca..46f90b7 100644
--- a/weex_core/Source/base/crash/crash_handler.cpp
+++ b/weex_core/Source/base/crash/crash_handler.cpp
@@ -57,6 +57,8 @@
 { 0, nullptr }
 };
 
+volatile sig_atomic_t is_sig_after_crash = 0;
+
 /* static functions */
 static bool isFileAccess(const char* file)
 {
@@ -71,6 +73,12 @@
     return true;
 }
 
+static void handleExitAlarm(int num, siginfo_t* info, void* ucontext){
+    if (is_sig_after_crash){
+        _exit(0);
+    }
+}
+
 static void crashSigAction(int num, siginfo_t* info, void* ucontext)
 {
     bool handled = false;
@@ -163,6 +171,28 @@
     //signal
 
     m_crash_occurs = true;
+
+    if (handle_alarm_signal){
+        //handleSignal maybe cause sig delivered deadLock,and maybe block weexCoreThread on ipc,then cause whiteScreen or other issue unless restart app
+        //cause 1:async-signal-safe http://man7.org/linux/man-pages/man7/signal-safety.7.html#top_of_page
+        //cause 2:other logic crash or dl.
+        //solution: google breakPad dump crash on a new process to avoid bugs.
+        //tmp solution: setTimeout 1s,force exit on handleExitAlarm(if has deadLock)
+
+
+        is_sig_after_crash =1;
+
+        struct sigaction alarmSigaction = { 0 };
+        alarmSigaction.sa_sigaction = handleExitAlarm;
+        alarmSigaction.sa_flags = SA_SIGINFO;
+
+
+        if (-1 == sigaction(SIGALRM, &alarmSigaction, nullptr)) {
+            _exit(0);
+        }
+        alarm(1);
+    }
+
     LOG(INFO) << "CrashHandlerInfo::handleSignal";
     const char* signalName = nullptr;
     for (int i = 0; s_hookSignals[i].signum; ++i) {
diff --git a/weex_core/Source/base/crash/crash_handler.h b/weex_core/Source/base/crash/crash_handler.h
index 9d76d67..0b695da 100644
--- a/weex_core/Source/base/crash/crash_handler.h
+++ b/weex_core/Source/base/crash/crash_handler.h
@@ -39,6 +39,7 @@
         int signum;
         const char* signame;
     };
+    void setEnableAlarmSignal(bool handle){handle_alarm_signal = handle;}
 
 private:
     void printContext();
@@ -67,6 +68,7 @@
     std::string m_fileContent;
     mcontext_t m_mcontext;
     volatile bool m_crash_occurs;
+    volatile bool handle_alarm_signal = true;
 };
 }
 #endif /* CRASHHANDLER_H */
diff --git a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp
index e27d847..710ce35 100644
--- a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp
+++ b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp
@@ -388,10 +388,9 @@
              }}
         }
     };
-
-    auto final_json_str = final_json.dump().c_str();
-    auto utf16_key = weex::base::to_utf16(const_cast<char*>(final_json_str),
-                                          strlen(final_json_str));
+    std::string out = final_json.dump();
+    auto utf16_key = weex::base::to_utf16(const_cast<char*>(out.c_str()),
+                                          out.length());
     args->value.string = genWeexString(
         reinterpret_cast<const uint16_t*>(utf16_key.c_str()), utf16_key.size());
     msg.push_back(args);
@@ -600,13 +599,17 @@
 
 int CoreSideInPlatform::DestroyInstance(const char *instanceId) {
     auto handler = EagleBridge::GetInstance()->data_render_handler();
-    if(handler!=nullptr){
+    if (handler != nullptr) {
       handler->DestroyInstance(instanceId);
     }
     if (JsonRenderManager::GetInstance()->ClosePage(instanceId)) {
       return true;
     }
-    return WeexCoreManager::Instance()->script_bridge()->script_side()->DestroyInstance(instanceId);
+    auto script_side = WeexCoreManager::Instance()->script_bridge()->script_side();
+    if (script_side) {
+        return script_side->DestroyInstance(instanceId);
+    }
+    return true;
 }
 
 int CoreSideInPlatform::UpdateGlobalConfig(const char *config) {
diff --git a/weex_core/Source/core/bridge/script_bridge.h b/weex_core/Source/core/bridge/script_bridge.h
index c1eea10..bcb43e0 100644
--- a/weex_core/Source/core/bridge/script_bridge.h
+++ b/weex_core/Source/core/bridge/script_bridge.h
@@ -175,7 +175,6 @@
   inline ScriptSide *script_side() { return script_side_.get(); }
 
   inline void set_core_side(CoreSide *core_side) {
-    LOGE("xxx set_core_side is runing and %p", core_side);
     core_side_.reset(core_side);
     core_side_->set_bridge(this);
   }
diff --git a/weex_core/Source/core/manager/weex_core_manager.h b/weex_core/Source/core/manager/weex_core_manager.h
index 1996e46..e2b5fee 100644
--- a/weex_core/Source/core/manager/weex_core_manager.h
+++ b/weex_core/Source/core/manager/weex_core_manager.h
@@ -27,6 +27,8 @@
 #include "core/bridge/script_bridge.h"
 #include "base/message_loop/message_loop.h"
 
+class IPCFutexPageQueue;
+
 namespace WeexCore {
 class WeexCoreManager {
  public:
@@ -46,7 +48,12 @@
   inline ScriptBridge *script_bridge() { return script_bridge_; }
 
   inline void set_script_bridge(ScriptBridge *script_bridge) {
+    ScriptBridge* pre_script_bridge  =  script_bridge_;
     script_bridge_ = script_bridge;
+    if (nullptr != pre_script_bridge && do_release_map()){
+        delete pre_script_bridge;
+        pre_script_bridge = nullptr;
+    }
   }
 
   inline void set_measure_function_adapter(MeasureFunctionAdapter *adapter) {
@@ -70,19 +77,29 @@
 
   inline weex::base::Thread *script_thread() { return script_thread_; }
 
+  inline bool do_release_map() { return release_map_; }
+  inline void set_release_map(bool release) {  release_map_ = release; }
+
+  IPCFutexPageQueue* client_queue_;
+  IPCFutexPageQueue* server_queue_;
+
  private:
   PlatformBridge *platform_bridge_;
   MeasureFunctionAdapter *measure_function_adapter_;
   ScriptBridge *script_bridge_;
   ProjectMode project_mode_;
   weex::base::Thread *script_thread_;
+  volatile bool release_map_;
 
   WeexCoreManager()
       : platform_bridge_(nullptr),
         measure_function_adapter_(nullptr),
         script_bridge_(nullptr),
         project_mode_(COMMON),
-        script_thread_(nullptr){};
+        script_thread_(nullptr),
+        client_queue_(nullptr),
+        server_queue_(nullptr),
+        release_map_(false){};
   ~WeexCoreManager(){};
 };
 }  // namespace WeexCore
diff --git a/weex_core/Source/core/render/action/render_action_createfinish.cpp b/weex_core/Source/core/render/action/render_action_createfinish.cpp
index a2b63ef..1147045 100644
--- a/weex_core/Source/core/render/action/render_action_createfinish.cpp
+++ b/weex_core/Source/core/render/action/render_action_createfinish.cpp
@@ -23,7 +23,6 @@
 namespace WeexCore {
 
 RenderActionCreateFinish::RenderActionCreateFinish(const std::string &page_id) {
-  LOGE("RenderActionCreateFinish::RenderActionCreateFinish");
   this->page_id_ = page_id;
 }
 
diff --git a/weex_core/Source/core/render/manager/render_manager.cpp b/weex_core/Source/core/render/manager/render_manager.cpp
index 35ad5f8..3162469 100644
--- a/weex_core/Source/core/render/manager/render_manager.cpp
+++ b/weex_core/Source/core/render/manager/render_manager.cpp
@@ -48,6 +48,8 @@
   LOGD("[RenderManager] CreatePage >>>> pageId: %s, dom data: %s",
        pageId.c_str(), parser.toStringUTF8().c_str());
 #endif
+  
+  LOGI("RenderManager::CreatePage, id: %s", page_id.c_str());
     
   std::string targetName = RenderTargetManager::getRenderTargetName(page_id);
   if (!targetName.empty()) {
@@ -95,6 +97,8 @@
   LOGD("[RenderManager] CreatePage >>>> pageId: %s, dom data: %s",
        pageId.c_str(), parser.toStringUTF8().c_str());
 #endif
+  
+  LOGI("RenderManager::CreatePage, id: %s", page_id.c_str());
 
   RenderPage *page = new RenderPage(page_id);
   this->pages_.insert(std::pair<std::string, RenderPage *>(page_id, page));
@@ -108,23 +112,27 @@
 #if RENDER_LOG
     LOGD("[RenderManager] CreatePage >>>> pageId: %s", pageId.c_str());
 #endif
+  
+  LOGI("RenderManager::CreatePage, id: %s", page_id.c_str());
     
-    RenderPage *page = new RenderPage(page_id);
-    this->pages_.insert(std::pair<std::string, RenderPage *>(page_id, page));
+  RenderPage *page = new RenderPage(page_id);
+  this->pages_.insert(std::pair<std::string, RenderPage *>(page_id, page));
 
-    initDeviceConfig(page, page_id);
-    
-    int64_t start_time = getCurrentTime();
-    RenderObject *root = constructRoot(page);
-    page->ParseJsonTime(getCurrentTime() - start_time);
-    
-    return page->CreateRootRender(root);
+  initDeviceConfig(page, page_id);
+  
+  int64_t start_time = getCurrentTime();
+  RenderObject *root = constructRoot(page);
+  page->ParseJsonTime(getCurrentTime() - start_time);
+  
+  return page->CreateRootRender(root);
 }
 
 RenderPageCustom* RenderManager::CreateCustomPage(const std::string& page_id, const std::string& page_type) {
 #if RENDER_LOG
     LOGD("[RenderManager] CreateCustomPage >>>> pageId: %s, pageType: %s", pageId.c_str(), page_type.c_str());
 #endif
+  
+  LOGI("RenderManager::CreateCustomPage, id: %s, type: %s", page_id.c_str(), page_type.c_str());
     
     RenderPageCustom::PageOptions options;
     
@@ -382,7 +390,7 @@
   RenderPageBase *page = GetPage(page_id);
   if (page == nullptr) return false;
 
-  LOGE("RenderManager::CreateFinish %s", page_id.data());
+  LOGI("RenderManager::CreateFinish, id: %s", page_id.data());
 
 #if RENDER_LOG
   LOGD("[RenderManager] CreateFinish >>>> pageId: %s", pageId.c_str());
diff --git a/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp b/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp
index 3699192..7f11493 100644
--- a/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp
+++ b/weex_core/Source/third_party/IPC/IPCFutexPageQueue.cpp
@@ -63,6 +63,7 @@
     } catch (IPCException& e) {
         IPC_LOGE("%s", e.msg());
     }
+    IPC_LOGE("do munmap")
     munmap(m_sharedMemory, m_pageSize << 2);
 }
 
@@ -214,3 +215,16 @@
     pageRead[1] = 0;
     __atomic_thread_fence(__ATOMIC_SEQ_CST);
 }
+
+void IPCFutexPageQueue::dumpPageInfo(std::string &info) {
+    std::string builder;
+
+    for (size_t i = 0; i < m_pagesCount ; ++i) {
+        uint32_t* pageStart = static_cast<uint32_t*>(getPage(i));
+        auto tmp = new IPCException("[%zu,%zu,%zu]",*pageStart,*(pageStart+1),*(pageStart+2));
+        builder+= tmp->msg();
+        delete(tmp);
+    }
+    auto msg = new IPCException("tid:%d,readId:%zu,writeId:%zu,info:%s",m_tid,m_currentRead,m_currentWrite,builder.c_str());
+    info.assign(msg->msg());
+}
diff --git a/weex_core/Source/third_party/IPC/IPCFutexPageQueue.h b/weex_core/Source/third_party/IPC/IPCFutexPageQueue.h
index df62700..ea99bb3 100644
--- a/weex_core/Source/third_party/IPC/IPCFutexPageQueue.h
+++ b/weex_core/Source/third_party/IPC/IPCFutexPageQueue.h
@@ -26,6 +26,7 @@
 #define IPCFUTEXPAGEQUEUE_H
 
 #include <stdint.h>
+#include <string>
 
 // shared memory page layout:
 // futex uint32_t
@@ -50,6 +51,7 @@
     inline size_t getPageSize() const { return m_pageSize - sizeof(uint32_t) * 2; }
 
     static const size_t ipc_size = 2 * 1024 * 1024;
+    void dumpPageInfo(std::string& info);
 
 private:
     void unlock(size_t id);