You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@weex.apache.org by GitBox <gi...@apache.org> on 2018/09/12 04:23:49 UTC

[GitHub] YorkShen closed pull request #1510: refector code, Make jsengine can run on multi thread environment

YorkShen closed pull request #1510: refector code, Make jsengine can run on multi thread environment
URL: https://github.com/apache/incubator-weex/pull/1510
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/Gemfile.lock b/Gemfile.lock
index a6558843c8..137360b03b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,110 +1,115 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    CFPropertyList (2.3.4)
-    activesupport (4.2.7.1)
+    CFPropertyList (3.0.0)
+    activesupport (4.2.10)
       i18n (~> 0.7)
-      json (~> 1.7, >= 1.7.7)
       minitest (~> 5.1)
       thread_safe (~> 0.3, >= 0.3.4)
       tzinfo (~> 1.1)
-    addressable (2.5.0)
-      public_suffix (~> 2.0, >= 2.0.2)
-    claide (1.0.1)
+    addressable (2.5.2)
+      public_suffix (>= 2.0.2, < 4.0)
+    atomos (0.1.2)
+    claide (1.0.2)
     claide-plugins (0.9.2)
       cork
       nap
       open4 (~> 1.3)
-    cocoapods (1.1.1)
+    cocoapods (1.5.3)
       activesupport (>= 4.0.2, < 5)
-      claide (>= 1.0.1, < 2.0)
-      cocoapods-core (= 1.1.1)
-      cocoapods-deintegrate (>= 1.0.1, < 2.0)
-      cocoapods-downloader (>= 1.1.2, < 2.0)
+      claide (>= 1.0.2, < 2.0)
+      cocoapods-core (= 1.5.3)
+      cocoapods-deintegrate (>= 1.0.2, < 2.0)
+      cocoapods-downloader (>= 1.2.0, < 2.0)
       cocoapods-plugins (>= 1.0.0, < 2.0)
       cocoapods-search (>= 1.0.0, < 2.0)
       cocoapods-stats (>= 1.0.0, < 2.0)
-      cocoapods-trunk (>= 1.1.1, < 2.0)
+      cocoapods-trunk (>= 1.3.0, < 2.0)
       cocoapods-try (>= 1.1.0, < 2.0)
-      colored (~> 1.2)
+      colored2 (~> 3.1)
       escape (~> 0.0.4)
       fourflusher (~> 2.0.1)
       gh_inspector (~> 1.0)
-      molinillo (~> 0.5.1)
+      molinillo (~> 0.6.5)
       nap (~> 1.0)
-      xcodeproj (>= 1.3.3, < 2.0)
-    cocoapods-core (1.1.1)
-      activesupport (>= 4.0.2, < 5)
+      ruby-macho (~> 1.1)
+      xcodeproj (>= 1.5.7, < 2.0)
+    cocoapods-core (1.5.3)
+      activesupport (>= 4.0.2, < 6)
       fuzzy_match (~> 2.0.4)
       nap (~> 1.0)
-    cocoapods-deintegrate (1.0.1)
-    cocoapods-downloader (1.1.3)
+    cocoapods-deintegrate (1.0.2)
+    cocoapods-downloader (1.2.1)
     cocoapods-plugins (1.0.0)
       nap
     cocoapods-search (1.0.0)
     cocoapods-stats (1.0.0)
-    cocoapods-trunk (1.1.2)
+    cocoapods-trunk (1.3.0)
       nap (>= 0.8, < 2.0)
-      netrc (= 0.7.8)
+      netrc (~> 0.11)
     cocoapods-try (1.1.0)
-    colored (1.2)
-    cork (0.2.0)
-      colored (~> 1.2)
-    danger (4.0.5)
+    colored2 (3.1.2)
+    concurrent-ruby (1.0.5)
+    cork (0.3.0)
+      colored2 (~> 3.1)
+    danger (5.6.2)
       claide (~> 1.0)
       claide-plugins (>= 0.9.2)
-      colored (~> 1.2)
+      colored2 (~> 3.1)
       cork (~> 0.1)
       faraday (~> 0.9)
       faraday-http-cache (~> 1.0)
       git (~> 1)
       kramdown (~> 1.5)
-      octokit (~> 4.2)
+      no_proxy_fix
+      octokit (~> 4.7)
       terminal-table (~> 1)
     danger-plugin-api (1.0.0)
       danger (> 2.0)
-    danger-xcode_summary (0.1.0)
+    danger-xcode_summary (0.5.0)
       danger-plugin-api (~> 1.0)
     escape (0.0.4)
-    faraday (0.11.0)
+    faraday (0.15.2)
       multipart-post (>= 1.2, < 3)
     faraday-http-cache (1.3.1)
       faraday (~> 0.8)
     fourflusher (2.0.1)
     fuzzy_match (2.0.4)
-    gh_inspector (1.0.3)
-    git (1.3.0)
-    i18n (0.7.0)
-    json (1.8.3)
-    kramdown (1.13.2)
-    minitest (5.10.1)
-    molinillo (0.5.5)
+    gh_inspector (1.1.3)
+    git (1.4.0)
+    i18n (0.9.5)
+      concurrent-ruby (~> 1.0)
+    kramdown (1.17.0)
+    minitest (5.11.3)
+    molinillo (0.6.5)
     multipart-post (2.0.0)
-    nanaimo (0.2.3)
+    nanaimo (0.2.5)
     nap (1.1.0)
-    netrc (0.7.8)
-    octokit (4.6.2)
+    netrc (0.11.0)
+    no_proxy_fix (0.1.2)
+    octokit (4.9.0)
       sawyer (~> 0.8.0, >= 0.5.3)
     open4 (1.3.4)
-    public_suffix (2.0.5)
-    rouge (1.11.1)
+    public_suffix (3.0.2)
+    rouge (2.0.7)
+    ruby-macho (1.2.0)
     sawyer (0.8.1)
       addressable (>= 2.3.5, < 2.6)
       faraday (~> 0.8, < 1.0)
-    terminal-table (1.7.3)
-      unicode-display_width (~> 1.1.1)
-    thread_safe (0.3.5)
-    tzinfo (1.2.2)
+    terminal-table (1.8.0)
+      unicode-display_width (~> 1.1, >= 1.1.1)
+    thread_safe (0.3.6)
+    tzinfo (1.2.5)
       thread_safe (~> 0.1)
-    unicode-display_width (1.1.3)
-    xcodeproj (1.4.2)
-      CFPropertyList (~> 2.3.3)
-      activesupport (>= 3)
-      claide (>= 1.0.1, < 2.0)
-      colored (~> 1.2)
-      nanaimo (~> 0.2.3)
-    xcpretty (0.2.4)
-      rouge (~> 1.8)
+    unicode-display_width (1.4.0)
+    xcodeproj (1.5.9)
+      CFPropertyList (>= 2.3.3, < 4.0)
+      atomos (~> 0.1.2)
+      claide (>= 1.0.2, < 2.0)
+      colored2 (~> 3.1)
+      nanaimo (~> 0.2.5)
+    xcpretty (0.2.8)
+      rouge (~> 2.0.7)
     xcpretty-json-formatter (0.1.0)
       xcpretty (~> 0.2, >= 0.0.7)
 
@@ -119,4 +124,4 @@ DEPENDENCIES
   xcpretty-json-formatter!
 
 BUNDLED WITH
-   1.13.7
+   1.16.2
diff --git a/WeexSDK.podspec b/WeexSDK.podspec
index 5fe38eae3a..42c1bac40b 100644
--- a/WeexSDK.podspec
+++ b/WeexSDK.podspec
@@ -19,29 +19,41 @@ Pod::Spec.new do |s|
     LICENSE
   }
   s.authors      = { "cxfeng1"      => "cxfeng1@gmail.com",
-                     "boboning"     => "ningli928@163.com",
                      "yangshengtao" => "yangshengtao1314@163.com",
-                     "kfeagle"      => "sunjjbobo@163.com",
-                     "acton393"     => "zhangxing610321@gmail.com"
+                     "kfeagle"      => "sunjjbobo@163.com"
                    }
   s.platform     = :ios
   s.ios.deployment_target = '8.0'
   s.source =  { :path => '.' }
-  s.source_files = 'ios/sdk/WeexSDK/Sources/**/*.{h,m,mm,c,cpp}'
+  s.source_files = 'ios/sdk/WeexSDK/Sources/**/*.{h,m,mm,c,cpp,cc}'
   s.resources = 'pre-build/*.js','ios/sdk/WeexSDK/Resources/wx_load_error@3x.png'
 
   s.user_target_xcconfig  = { 'FRAMEWORK_SEARCH_PATHS' => "'$(PODS_ROOT)/WeexSDK'" }
   s.requires_arc = true
   s.prefix_header_file = 'ios/sdk/WeexSDK/Sources/Supporting Files/WeexSDK-Prefix.pch'
 
-#  s.xcconfig = { "GCC_PREPROCESSOR_DEFINITIONS" => '$(inherited) DEBUG=1' }
-
   s.private_header_files = 'ios/sdk/WeexSDK/Sources/Component/RecycleList/WXJSASTParser.h',
-                           'ios/sdk/WeexSDK/Sources/Layout/WXScrollerComponent+Layout.h'
+                           'ios/sdk/WeexSDK/Sources/Layout/WXScrollerComponent+Layout.h',
+                           'weex_core/Source/**/*.{h,hpp}'
+
+  s.xcconfig = { "OTHER_LINK_FLAG" => '$(inherited) -ObjC', 'GCC_PREPROCESSOR_DEFINITIONS' => 'OS_IOS=1' }
+
+  s.frameworks = 'CoreMedia','MediaPlayer','AVFoundation','AVKit','JavaScriptCore','GLKit','OpenGLES','CoreText','QuartzCore','CoreGraphics'
+  
+  s.default_subspec='WeexCore'
+
+  s.subspec 'WeexCore' do |w|
+    w.source_files = 'weex_core/Source/base/**/*.{h,hpp,m,mm,c,cpp,cc}',
+                    'weex_core/Source/core/**/*.{h,hpp,m,mm,c,cpp,cc}',
+                    'weex_core/Source/wson/**/*.{h,hpp,m,mm,c,cpp,cc}',
+                    'weex_core/Source/third_party/**/*.{h,hpp,m,mm,c,cpp,cc}',
+                    'weex_core/Source/include/**/*.{h,hpp,m,mm,c,cpp,cc}'
+    w.exclude_files = 'weex_core/Source/**/*android.{h,hpp,m,mm,c,cpp,cc}'
 
-  s.xcconfig = { "OTHER_LINK_FLAG" => '$(inherited) -ObjC'}
+    w.xcconfig = { 'USER_HEADER_SEARCH_PATHS' => ['${PODS_ROOT}/Headers/Public/WeexSDK/core/**'] }
+    w.header_mappings_dir = 'weex_core/Source'
 
-  s.frameworks = 'CoreMedia','MediaPlayer','AVFoundation','AVKit','JavaScriptCore', 'GLKit', 'OpenGLES', 'CoreText', 'QuartzCore', 'CoreGraphics'
-  s.libraries = "stdc++"
+    w.libraries = "stdc++"
+  end
 
 end
diff --git a/android/playground/app/src/main/AndroidManifest.xml b/android/playground/app/src/main/AndroidManifest.xml
index 40f2105330..de7c3dbc1f 100755
--- a/android/playground/app/src/main/AndroidManifest.xml
+++ b/android/playground/app/src/main/AndroidManifest.xml
@@ -119,6 +119,11 @@ under the License.
         <activity android:name="com.alibaba.weex.BenchmarkActivity"
                   android:screenOrientation="portrait"/>
 
+        <activity android:name=".SliceTestActivity"
+                  android:exported="true"
+                  android:screenOrientation="portrait">
+        </activity>
+
         <service
             android:name=".update.UpdateService"
             android:exported="false" />
diff --git a/android/playground/app/src/main/assets/lite_template/case.json b/android/playground/app/src/main/assets/lite_template/case.json
new file mode 100644
index 0000000000..bbc8a82e3f
--- /dev/null
+++ b/android/playground/app/src/main/assets/lite_template/case.json
@@ -0,0 +1,419 @@
+{
+  "styles": {
+    "wrapper": {
+      "justifyContent": "center",
+      "alignItems": "center"
+    },
+    "logo": {
+      "width": "424px",
+      "height": "200px"
+    },
+    "greeting": {
+      "textAlign": "center",
+      "marginTop": "70px",
+      "fontSize": "50px",
+      "color": "#41b883"
+    },
+    "message": {
+      "margin": "30px",
+      "fontSize": "32px",
+      "color": "#727272"
+    },
+    "listContainer": {
+      "width": "750",
+      "backgroundColor": "#ffffff",
+      "flexDirection": "column",
+      "alignItems": "stretch",
+      "marginTop": "17",
+      "marginBottom": "17"
+    },
+    "wfContainer": {
+      "width": "345",
+      "backgroundColor": "#ffffff",
+      "flexDirection": "column",
+      "alignItems": "stretch",
+      "borderRadius": "12",
+      "overflow": "hidden"
+    },
+    "listContentContainer": {
+      "flexDirection": "row",
+      "marginTop": "13",
+      "marginLeft": "24",
+      "marginRight": "24",
+      "marginBottom": "24",
+      "justifyContent": "space-between"
+    },
+    "wfContentContainer": {
+      "paddingBottom": "17",
+      "flexDirection": "column"
+    },
+    "titleContainer": {
+      "flexDirection": "row",
+      "alignItems": "center",
+      "justifyContent": "center",
+      "marginLeft": "32",
+      "marginRight": "32",
+      "height": "78"
+    },
+    "titleText": {
+      "fontSize": "28",
+      "color": "#333333",
+      "marginLeft": "12",
+      "marginRight": "12",
+      "paddingTop": "27",
+      "paddingBottom": "27"
+    },
+    "titleLine": {
+      "height": "2",
+      "backgroundColor": "#9b9b9b",
+      "width": "28"
+    },
+    "tagItem": {
+      "flexDirection": "column",
+      "alignItems": "center"
+    },
+    "tagImage": {
+      "width": "142",
+      "height": "110",
+      "borderRadius": "55"
+    },
+    "tagImageMask": {
+      "width": "142",
+      "height": "110",
+      "borderRadius": "55",
+      "backgroundColor": "rgba(0, 0, 0, 0.04)",
+      "position": "absolute",
+      "left": "0",
+      "top": "0"
+    },
+    "tagText": {
+      "fontSize": "24",
+      "marginTop": "12",
+      "lineHeight": "37",
+      "maxWidth": "145",
+      "color": "#4b4b4b"
+    },
+    "tagLine": {
+      "flexDirection": "row",
+      "marginLeft": "18",
+      "marginRight": "18",
+      "marginTop": "20",
+      "justifyContent": "space-between"
+    }
+  },
+  "data": {},
+  "body": {
+    "tagName": "div",
+    "nodeId": "1",
+    "classList": [
+      "wrapper"
+    ],
+    "childNodes": [
+      {
+        "tagName": "div",
+        "nodeId": "2",
+        "control": {
+          "match": "status.layoutStyle < 0.5"
+        },
+        "classList": [
+          "listContainer"
+        ],
+        "childNodes": [
+          {
+            "tagName": "div",
+            "nodeId": "3",
+            "classList": [
+              "titleContainer"
+            ],
+            "childNodes": [
+              {
+                "tagName": "div",
+                "nodeId": "4",
+                "classList": [
+                  "titleLine"
+                ]
+              },
+              {
+                "tagName": "text",
+                "nodeId": "5",
+                "classList": [
+                  "titleText"
+                ],
+                "attributes": {
+                  "value": {
+                    "@binding": "model.topic"
+                  }
+                }
+              },
+              {
+                "tagName": "div",
+                "nodeId": "6",
+                "classList": [
+                  "titleLine"
+                ]
+              }
+            ]
+          },
+          {
+            "tagName": "div",
+            "nodeId": "7",
+            "control": {
+              "match": "sizeof(model.tips) >= 4"
+            },
+            "classList": [
+              "listContentContainer"
+            ],
+            "childNodes": [
+              {
+                "tagName": "a",
+                "nodeId": "8",
+                "control": {
+                  "repeat": {
+                    "for": "slice(model.tips,0,4)",
+                    "alias": "tag",
+                    "iterator1": "i"
+                  }
+                },
+                "attributes": {
+                  "key": {
+                    "@binding": "i"
+                  },
+                  "href": {
+                    "@binding": "appendUrlParam(\"http://market.m.taobao.com/app/nx3/tmall_discovery?apiInfo=%7B%22apiName%22%3A%22mtop.taobao.wsearch.appsearch%22%2C%22apiVersion%22%3A%221.0%22%7D\",tag.params)"
+                  }
+                },
+                "classList": [
+                  "tagItem"
+                ],
+                "childNodes": [
+                  {
+                    "tagName": "img",
+                    "nodeId": "9",
+                    "classList": [
+                      "tagImage"
+                    ],
+                    "attributes": {
+                      "src": {
+                        "@binding": "tag.picUrl"
+                      }
+                    }
+                  },
+                  {
+                    "tagName": "div",
+                    "nodeId": "10",
+                    "classList": [
+                      "tagImageMask"
+                    ]
+                  },
+                  {
+                    "tagName": "text",
+                    "nodeId": "11",
+                    "classList": [
+                      "tagText"
+                    ],
+                    "attributes": {
+                      "lines": "1",
+                      "value": {
+                        "@binding": "tag.show"
+                      }
+                    }
+                  }
+                ]
+              }
+            ]
+          }
+        ]
+      },
+      {
+        "tagName": "div",
+        "nodeId": "12",
+        "control": {
+          "match": "status.layoutStyle > 0.5"
+        },
+        "classList": [
+          "wfContainer"
+        ],
+        "childNodes": [
+          {
+            "tagName": "div",
+            "nodeId": "13",
+            "classList": [
+              "titleContainer"
+            ],
+            "childNodes": [
+              {
+                "tagName": "div",
+                "nodeId": "14",
+                "classList": [
+                  "titleLine"
+                ]
+              },
+              {
+                "tagName": "text",
+                "nodeId": "15",
+                "classList": [
+                  "titleText"
+                ],
+                "attributes": {
+                  "value": {
+                    "@binding": "model.topic"
+                  }
+                }
+              },
+              {
+                "tagName": "div",
+                "nodeId": "16",
+                "classList": [
+                  "titleLine"
+                ]
+              }
+            ]
+          },
+          {
+            "tagName": "div",
+            "nodeId": "17",
+            "control": {
+              "match": "sizeof(model.tips) >= 4"
+            },
+            "classList": [
+              "wfContentContainer"
+            ],
+            "childNodes": [
+              {
+                "tagName": "div",
+                "nodeId": "18",
+                "classList": [
+                  "tagLine"
+                ],
+                "childNodes": [
+                  {
+                    "tagName": "a",
+                    "nodeId": "19",
+                    "control": {
+                      "repeat": {
+                        "for": "slice(model.tips,0,2)",
+                        "alias": "tag",
+                        "iterator1": "i"
+                      }
+                    },
+                    "attributes": {
+                      "key": {
+                        "@binding": "i"
+                      },
+                      "href": {
+                        "@binding": "appendUrlParam(\"http://market.m.taobao.com/app/nx3/tmall_discovery?apiInfo=%7B%22apiName%22%3A%22mtop.taobao.wsearch.appsearch%22%2C%22apiVersion%22%3A%221.0%22%7D\",tag.params)"
+                      }
+                    },
+                    "classList": [
+                      "tagItem"
+                    ],
+                    "childNodes": [
+                      {
+                        "tagName": "img",
+                        "nodeId": "20",
+                        "classList": [
+                          "tagImage"
+                        ],
+                        "attributes": {
+                          "src": {
+                            "@binding": "tag.picUrl"
+                          }
+                        }
+                      },
+                      {
+                        "tagName": "div",
+                        "nodeId": "21",
+                        "classList": [
+                          "tagImageMask"
+                        ]
+                      },
+                      {
+                        "tagName": "text",
+                        "nodeId": "22",
+                        "classList": [
+                          "tagText"
+                        ],
+                        "attributes": {
+                          "lines": "1",
+                          "value": {
+                            "@binding": "tag.show"
+                          }
+                        }
+                      }
+                    ]
+                  }
+                ]
+              },
+              {
+                "tagName": "div",
+                "nodeId": "23",
+                "classList": [
+                  "tagLine"
+                ],
+                "childNodes": [
+                  {
+                    "tagName": "a",
+                    "nodeId": "24",
+                    "control": {
+                      "repeat": {
+                        "for": "slice(model.tips,2,4)",
+                        "alias": "tag",
+                        "iterator1": "i"
+                      }
+                    },
+                    "attributes": {
+                      "key": {
+                        "@binding": "i"
+                      },
+                      "href": {
+                        "@binding": "appendUrlParam(\"http://market.m.taobao.com/app/nx3/tmall_discovery?apiInfo=%7B%22apiName%22%3A%22mtop.taobao.wsearch.appsearch%22%2C%22apiVersion%22%3A%221.0%22%7D\",tag.params)"
+                      }
+                    },
+                    "classList": [
+                      "tagItem"
+                    ],
+                    "childNodes": [
+                      {
+                        "tagName": "img",
+                        "nodeId": "25",
+                        "classList": [
+                          "tagImage"
+                        ],
+                        "attributes": {
+                          "src": {
+                            "@binding": "tag.picUrl"
+                          }
+                        }
+                      },
+                      {
+                        "tagName": "div",
+                        "nodeId": "26",
+                        "classList": [
+                          "tagImageMask"
+                        ]
+                      },
+                      {
+                        "tagName": "text",
+                        "nodeId": "27",
+                        "classList": [
+                          "tagText"
+                        ],
+                        "attributes": {
+                          "lines": "1",
+                          "value": {
+                            "@binding": "tag.show"
+                          }
+                        }
+                      }
+                    ]
+                  }
+                ]
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  },
+  "components": []
+}
\ No newline at end of file
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
index feaf5ae1ea..752f8e3391 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
@@ -85,6 +85,7 @@ public void onCreate(Bundle savedInstanceState) {
 
     if (TextUtils.equals(sCurrentIp, DEFAULT_IP)) {
       renderPage(WXFileUtils.loadAsset("landing.weex.js", this), getIndexUrl());
+//      renderPageByURL("http://dotwe.org/raw/dist/2bbe1860da4669a68595c1aed01d7fd2.bundle.wx");
     } else {
       renderPageByURL(getIndexUrl());
     }
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java b/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java
new file mode 100644
index 0000000000..c9b1229e13
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/SliceTestActivity.java
@@ -0,0 +1,577 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.alibaba.weex;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.DividerItemDecoration;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import com.taobao.weex.IWXRenderListener;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXRenderStrategy;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class SliceTestActivity extends AppCompatActivity {
+  private static final String LOG_TAG = "SliceTestActivity";
+  private RecyclerView mRecyclerView;
+  private TextView mReportTextView;
+
+  private final List<String> mData = new ArrayList<>();
+  private WXInstanceAdapter mAdapter;
+  private final Set<WXSDKInstance> mInstances = new HashSet<>();
+
+  @Override
+  protected void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+    setContentView(R.layout.activity_slice_test);
+    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
+    mReportTextView = (TextView) findViewById(R.id.report_text);
+
+    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+    mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
+    mAdapter = new WXInstanceAdapter();
+    mRecyclerView.setAdapter(mAdapter);
+  }
+
+  static int i = 0;
+
+  public void addCellClick(View view) {
+    if (i++ % 2 == 0) {
+      mData.add("{\n" +
+          "    \"model\": {\n" +
+          "      \"src\": \"tmall_rec\",\n" +
+          "      \"pos\": 3,\n" +
+          "      \"topic\": \"你可能想看\",\n" +
+          "      \"type\": \"tmall_rec\",\n" +
+          "      \"tShowTmpl\": \"wx_tmall_discovery\",\n" +
+          "      \"tItemType\": \"wx_tmall_discovery\",\n" +
+          "      \"tips\": [\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/imgextra/i1/2985924572/TB2EL5XnDnI8KJjy0FfXXcdoVXa_!!2985924572.jpg\",\n" +
+          "          \"show\": \"职场范儿\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%220%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1001\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        },\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/tfs/TB1.3ctnvDH8KJjy1XcXXcpdXXa-1125-390.png\",\n" +
+          "          \"show\": \"国际大牌\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1007\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        },\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2STDSnwLD8KJjSszeXXaGRpXa-263817957.jpg\",\n" +
+          "          \"show\": \"优雅淑女\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1002\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        },\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2_JnCnBHH8KJjy0FbXXcqlpXa-263817957.jpg\",\n" +
+          "          \"show\": \"活力少女\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1005\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        }\n" +
+          "      ]\n" +
+          "    },\n" +
+          "    \"status\": {\n" +
+          "      \"layoutStyle\": 0\n" +
+          "    }\n" +
+          "  }");
+    } else {
+      mData.add("{\n" +
+          "    \"model\": {\n" +
+          "      \"src\": \"tmall_rec\",\n" +
+          "      \"pos\": 3,\n" +
+          "      \"topic\": \"你可能不想看\",\n" +
+          "      \"type\": \"tmall_rec\",\n" +
+          "      \"tShowTmpl\": \"wx_tmall_discovery\",\n" +
+          "      \"tItemType\": \"wx_tmall_discovery\",\n" +
+          "      \"tips\": [\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/imgextra/i1/2985924572/TB2EL5XnDnI8KJjy0FfXXcdoVXa_!!2985924572.jpg\",\n" +
+          "          \"show\": \"职场范儿\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%220%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1001\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        },\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/tfs/TB1.3ctnvDH8KJjy1XcXXcpdXXa-1125-390.png\",\n" +
+          "          \"show\": \"国际大牌\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%221%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1007\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        },\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2STDSnwLD8KJjSszeXXaGRpXa-263817957.jpg\",\n" +
+          "          \"show\": \"优雅淑女\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%222%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1002\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        },\n" +
+          "        {\n" +
+          "          \"picUrl\": \"https://img.alicdn.com/imgextra/i2/263817957/TB2_JnCnBHH8KJjy0FbXXcqlpXa-263817957.jpg\",\n" +
+          "          \"show\": \"活力少女\",\n" +
+          "          \"params\": [\n" +
+          "            {\n" +
+          "              \"value\": \"tmall_rec\",\n" +
+          "              \"key\": \"from\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"%7B%22tips_oriq%22%3A%22%E7%BE%BD%E7%BB%92%E6%9C%8D%22%2C%22tips_srppage%22%3A%221%22%2C%22tips_type%22%3A%22mall1%22%2C%22tips_pos%22%3A%223%22%2C%22pre_rn%22%3A%22767d9f52662b4883b2dfcff69f12edce%22%7D\",\n" +
+          "              \"key\": \"vClickTrace\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"1005\",\n" +
+          "              \"key\": \"tag_id\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"767d9f52662b4883b2dfcff69f12edce\",\n" +
+          "              \"key\": \"sessionid\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"tmallRecCard\",\n" +
+          "              \"key\": \"m\"\n" +
+          "            },\n" +
+          "            {\n" +
+          "              \"value\": \"羽绒服\",\n" +
+          "              \"key\": \"q\"\n" +
+          "            }\n" +
+          "          ]\n" +
+          "        }\n" +
+          "      ]\n" +
+          "    },\n" +
+          "    \"status\": {\n" +
+          "      \"layoutStyle\": 1\n" +
+          "    }\n" +
+          "  }");
+    }
+
+    mAdapter.notifyItemInserted(mData.size() - 1);
+//    mAdapter.notifyDataSetChanged();
+  }
+
+  private class WXInstanceAdapter extends RecyclerView.Adapter<WXViewHolder> {
+    @Override
+    public WXViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+      Log.d(LOG_TAG, "onCreateViewHolder");
+      FrameLayout itemView = new FrameLayout(SliceTestActivity.this);
+      itemView.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
+      return new WXViewHolder(itemView);
+    }
+
+    @Override
+    public void onBindViewHolder(WXViewHolder holder, int position) {
+      Log.d(LOG_TAG, "onBindViewHolder " + position);
+      String data = mData.get(position);
+      if (!holder.isRendered()) {
+        holder.render(data, position);
+      } else {
+        holder.refresh(data, position);
+      }
+    }
+
+    @Override
+    public int getItemCount() {
+      return mData.size();
+    }
+  }
+
+  @Override
+  protected void onDestroy() {
+    super.onDestroy();
+    for (WXSDKInstance instance : mInstances) {
+      instance.destroy();
+    }
+    mInstances.clear();
+  }
+
+  private class WXViewHolder extends RecyclerView.ViewHolder implements IWXRenderListener {
+    private WXSDKInstance mInstance;
+    private boolean mRendered;
+
+    private TextView mTextView;
+
+    public WXViewHolder(View itemView) {
+      super(itemView);
+      mInstance = new WXSDKInstance(SliceTestActivity.this);
+      mInstance.registerRenderListener(this);
+      mInstances.add(mInstance);
+      mTextView = new TextView(SliceTestActivity.this);
+      FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+      params.gravity = Gravity.RIGHT;
+      ((ViewGroup) itemView).addView(mTextView, params);
+    }
+
+    public void render(String initData, int position) {
+      String template = "{\n" +
+          "  \"styles\": {\n" +
+          "    \"container\": {\n" +
+          "      \"backgroundColor\": \"#eee\",\n" +
+          "      \"flexDirection\": \"row\",\n" +
+          "      \"flexWrap\": \"wrap\",\n" +
+          "      \"alignItems\": \"flex-start\"\n" +
+          "    },\n" +
+          "    \"text\": {\n" +
+          "      \"fontSize\": \"70px\",\n" +
+          "      \"color\": \"#ff0000\"\n" +
+          "    },\n" +
+          "    \"top\": {\n" +
+          "      \"width\": \"750px\",\n" +
+          "      \"flexDirection\": \"row\",\n" +
+          "      \"justifyContent\": \"center\",\n" +
+          "      \"alignItems\": \"center\",\n" +
+          "      \"height\": \"60px\",\n" +
+          "      \"margin-top\": \"10px\"\n" +
+          "    },\n" +
+          "    \"lpixel\": {\n" +
+          "      \"height\": \"1px\",\n" +
+          "      \"width\": \"150px\",\n" +
+          "      \"backgroundColor\": \"black\",\n" +
+          "      \"marginRight\": \"20px\"\n" +
+          "    },\n" +
+          "    \"rpixel\": {\n" +
+          "      \"height\": \"1px\",\n" +
+          "      \"width\": \"150px\",\n" +
+          "      \"backgroundColor\": \"black\",\n" +
+          "      \"marginLeft\": \"20px\"\n" +
+          "    },\n" +
+          "    \"item\": {\n" +
+          "      \"marginTop\": \"10px\",\n" +
+          "      \"backgroundColor\": \"white\",\n" +
+          "      \"borderRadius\": \"30px\",\n" +
+          "      \"width\": \"150px\",\n" +
+          "      \"height\": \"60px\",\n" +
+          "      \"justifyContent\": \"center\",\n" +
+          "      \"alignItems\": \"center\",\n" +
+          "      \"marginLeft\": \"15px\",\n" +
+          "      \"marginRight\": \"15px\"\n" +
+          "    }\n" +
+          "  },\n" +
+          "  \"body\": {\n" +
+          "    \"tagName\": \"div\",\n" +
+          "    \"nodeId\": \"1\",\n" +
+          "    \"classList\": [\n" +
+          "      \"container\"\n" +
+          "    ],\n" +
+          "    \"childNodes\": [\n" +
+          "      {\n" +
+          "        \"tagName\": \"div\",\n" +
+          "        \"nodeId\": \"2\",\n" +
+          "        \"classList\": [\n" +
+          "          \"top\"\n" +
+          "        ],\n" +
+          "        \"childNodes\": [\n" +
+          "          {\n" +
+          "            \"tagName\": \"div\",\n" +
+          "            \"nodeId\": \"3\",\n" +
+          "            \"classList\": [\n" +
+          "              \"lpixel\"\n" +
+          "            ]\n" +
+          "          },\n" +
+          "          {\n" +
+          "            \"tagName\": \"text\",\n" +
+          "            \"nodeId\": \"4\",\n" +
+          "            \"attributes\": {\n" +
+          "              \"value\": \"细选\"\n" +
+          "            }\n" +
+          "          },\n" +
+          "          {\n" +
+          "            \"tagName\": \"div\",\n" +
+          "            \"nodeId\": \"5\",\n" +
+          "            \"classList\": [\n" +
+          "              \"rpixel\"\n" +
+          "            ]\n" +
+          "          }\n" +
+          "        ]\n" +
+          "      },\n" +
+          "      {\n" +
+          "        \"tagName\": \"div\",\n" +
+          "        \"nodeId\": \"6\",\n" +
+          "        \"control\": {\n" +
+          "          \"repeat\": {\n" +
+          "            \"for\": \"items\",\n" +
+          "            \"alias\": \"item\"\n" +
+          "          }\n" +
+          "        },\n" +
+          "        \"classList\": [\n" +
+          "          \"item\"\n" +
+          "        ],\n" +
+          "        \"childNodes\": [\n" +
+          "          {\n" +
+          "            \"tagName\": \"text\",\n" +
+          "            \"nodeId\": \"7\",\n" +
+          "            \"classList\": [\n" +
+          "              \"item-text\"\n" +
+          "            ],\n" +
+          "            \"attributes\": {\n" +
+          "              \"value\": {\"@binding\": \"item\"}\n" +
+          "            }\n" +
+          "          }\n" +
+          "        ]\n" +
+          "      }\n" +
+          "    ]\n" +
+          "  },\n" +
+          "  \"components\": [],\n" +
+          "  \"data\": {\n" +
+          "    \"items\": [\"修身\", \"潮流\", \"休闲\", \"弹力\", \"薄款\", \"中年\", \"超薄\", \"韩版\"]\n" +
+          "  }\n" +
+          "}";
+      template = loadAssets();
+      mInstance.render(
+          "testPage",
+          template,
+          null,
+          initData,
+          WXRenderStrategy.DATA_RENDER
+      );
+      mRendered = true;
+      mTextView.setText(String.valueOf(position));
+    }
+
+    public boolean isRendered() {
+      return mRendered;
+    }
+
+    public void refresh(String initData, int position) {
+      mInstance.refreshInstance(initData);
+      mTextView.setText(String.valueOf(position));
+    }
+
+    @Override
+    public void onViewCreated(WXSDKInstance instance, View view) {
+      ((ViewGroup) itemView).addView(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+    }
+
+    @Override
+    public void onRenderSuccess(WXSDKInstance instance, int width, int height) {
+    }
+
+    @Override
+    public void onRefreshSuccess(WXSDKInstance instance, int width, int height) {
+
+    }
+
+    @Override
+    public void onException(WXSDKInstance instance, String errCode, String msg) {
+
+    }
+  }
+
+  @NonNull
+  private String loadAssets() {
+    StringBuilder buf = new StringBuilder();
+    try {
+      InputStream json = getAssets().open("lite_template/case.json");
+      BufferedReader in =
+          new BufferedReader(new InputStreamReader(json, "UTF-8"));
+      String str;
+
+      while ((str = in.readLine()) != null) {
+        buf.append(str);
+      }
+
+      in.close();
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+
+    return buf.toString();
+  }
+}
diff --git a/android/playground/app/src/main/res/layout/activity_slice_test.xml b/android/playground/app/src/main/res/layout/activity_slice_test.xml
new file mode 100644
index 0000000000..dac9404938
--- /dev/null
+++ b/android/playground/app/src/main/res/layout/activity_slice_test.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".SliceTestActivity">
+
+    <Button
+        android:id="@+id/button"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:onClick="addCellClick"
+        android:text="ADD CELL"/>
+
+    <TextView
+        android:id="@+id/report_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@+id/button"
+        android:layout_alignBottom="@+id/button"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:gravity="center_vertical"
+        tools:text="create: 12ms, avg: 10ms&#xA;refresh: 12ms, avg: 10ms"/>
+
+    <android.support.v7.widget.RecyclerView
+        android:id="@+id/recycler_view"
+        android:layout_width="match_parent"
+        android:layout_height="210dp"
+        android:layout_below="@+id/button"/>
+</RelativeLayout>
\ No newline at end of file
diff --git a/android/sdk/build.gradle b/android/sdk/build.gradle
index 8c23d3cafd..3b0d24cbe8 100755
--- a/android/sdk/build.gradle
+++ b/android/sdk/build.gradle
@@ -122,9 +122,9 @@ android {
 
         externalNativeBuild {
             cmake {
-                arguments '-DANDROID_PLATFORM=android-19',
+                arguments '-DANDROID_PLATFORM=android-14',
                         '-DANDROID_TOOLCHAIN=gcc',
-                        '-DANDROID_STL=gnustl_static',
+                        '-DANDROID_STL=c++_static',
                         '-DCMAKE_BUILD_TYPE=Release'
             }
         }
diff --git a/android/sdk/libs/armeabi-v7a/libJavaScriptCore.so b/android/sdk/libs/armeabi-v7a/libJavaScriptCore.so
index 1f74471cde..d530580c4d 100755
Binary files a/android/sdk/libs/armeabi-v7a/libJavaScriptCore.so and b/android/sdk/libs/armeabi-v7a/libJavaScriptCore.so differ
diff --git a/android/sdk/libs/armeabi-v7a/libweexcore.so b/android/sdk/libs/armeabi-v7a/libweexcore.so
index e04685929b..54b1d8a8f1 100644
Binary files a/android/sdk/libs/armeabi-v7a/libweexcore.so and b/android/sdk/libs/armeabi-v7a/libweexcore.so differ
diff --git a/android/sdk/libs/armeabi-v7a/libweexjss.so b/android/sdk/libs/armeabi-v7a/libweexjss.so
index 2c5dae5968..0879224312 100755
Binary files a/android/sdk/libs/armeabi-v7a/libweexjss.so and b/android/sdk/libs/armeabi-v7a/libweexjss.so differ
diff --git a/android/sdk/libs/armeabi/libJavaScriptCore.so b/android/sdk/libs/armeabi/libJavaScriptCore.so
index 1f74471cde..d530580c4d 100755
Binary files a/android/sdk/libs/armeabi/libJavaScriptCore.so and b/android/sdk/libs/armeabi/libJavaScriptCore.so differ
diff --git a/android/sdk/libs/armeabi/libweexcore.so b/android/sdk/libs/armeabi/libweexcore.so
index d782795ca8..73160fe45f 100644
Binary files a/android/sdk/libs/armeabi/libweexcore.so and b/android/sdk/libs/armeabi/libweexcore.so differ
diff --git a/android/sdk/libs/armeabi/libweexjss.so b/android/sdk/libs/armeabi/libweexjss.so
index 2c5dae5968..0879224312 100755
Binary files a/android/sdk/libs/armeabi/libweexjss.so and b/android/sdk/libs/armeabi/libweexjss.so differ
diff --git a/android/sdk/libs/x86/libweexcore.so b/android/sdk/libs/x86/libweexcore.so
deleted file mode 100644
index 41baa1187e..0000000000
Binary files a/android/sdk/libs/x86/libweexcore.so and /dev/null differ
diff --git a/android/sdk/libs/x86/libweexjss.so b/android/sdk/libs/x86/libweexjss.so
index b5ad418b71..ac0dd7f261 100755
Binary files a/android/sdk/libs/x86/libweexjss.so and b/android/sdk/libs/x86/libweexjss.so differ
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 037f3347d1..13564ff86b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -40,8 +40,14 @@
 
 import org.w3c.dom.Text;
 
+import java.io.BufferedReader;
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -110,6 +116,7 @@
 
   public static final String CORE_SO_NAME = "weexcore";
   public static final String CORE_JSS_SO_NAME = "weexjss";
+  public static final String CORE_JSC_SO_NAME = "JavaScriptCore";
   /**
    * this marked jsb.so's version, Change this if we want to update jsb.so
    */
@@ -117,6 +124,13 @@
 
   private static  String CORE_JSS_SO_PATH = null;
 
+  private static String CORE_JSS_ICU_PATH = null;
+
+  private static String CORE_JSC_SO_PATH = null;
+
+  private static String LIB_LD_PATH = null;
+
+
   private static Map<String, String> options = new HashMap<>();
   static {
     options.put(WXConfig.os, OS);
@@ -365,12 +379,6 @@ public static void  setApkDebugable(boolean debugable){
     }
   }
 
-  public static String findSoPath(String libName) {
-    final String libPath = ((PathClassLoader) (WXEnvironment.class.getClassLoader())).findLibrary(libName);
-    WXLogUtils.e(libName + "'s Path is" + libPath);
-    return libPath;
-  }
-
   public static String getCacheDir() {
     final Application application = getApplication();
     if (application == null || application.getApplicationContext() == null)
@@ -385,7 +393,8 @@ public static boolean extractSo() {
       try {
         WXFileUtils.extractSo(sourceFile.getAbsolutePath(), cacheDir);
       } catch (IOException e) {
-        e.printStackTrace();
+        WXLogUtils.e("extractSo error " + e.getMessage());
+//        e.printStackTrace();
         return false;
       }
       return true;
@@ -393,36 +402,129 @@ public static boolean extractSo() {
     return false;
   }
 
-  private static String findLibJssRealPath() {
-    String soPath = findSoPath(CORE_JSS_SO_NAME);
-    String realName = "lib" + CORE_JSS_SO_NAME + ".so";
-    if (TextUtils.isEmpty(soPath)) {
-      String cacheDir = getCacheDir();
-      if (TextUtils.isEmpty(cacheDir)) {
-        return "";
+  private static String findIcuPath() {
+    File file = new File("/proc/self/maps");
+    BufferedReader reader = null;
+    try {
+      reader = new BufferedReader(new FileReader(file));
+      String tempString = null;
+      while ((tempString = reader.readLine()) != null) {
+        if (tempString.contains("icudt")) {
+
+          int i = tempString.indexOf('/');
+
+          String substring = tempString.substring(i);
+          return substring.trim();
+        }
+      }
+      reader.close();
+    } catch (IOException e) {
+      e.printStackTrace();
+    } finally {
+      if (reader != null) {
+        try {
+          reader.close();
+        } catch (IOException e1) {
+        }
       }
-      if (cacheDir.indexOf("/cache") > 0) {
-        soPath = new File(cacheDir.replace("/cache", "/lib"), realName).getAbsolutePath();
+    }
+
+    return null;
+  }
+
+
+  public static String findSoPath(String libName) {
+    String soPath = ((PathClassLoader) (WXEnvironment.class.getClassLoader())).findLibrary(libName);
+    if (!TextUtils.isEmpty(soPath)) {
+      File soFile = new File(soPath);
+      if (soFile.exists()) {
+        WXLogUtils.e(libName + "'s Path is" + soPath);
+        return soFile.getAbsolutePath();
+      } else {
+        WXLogUtils.e(libName + "'s Path is " + soPath + " but file is not exist");
       }
     }
+
+    String realName = "lib" + libName + ".so";
+    String cacheDir = getCacheDir();
+    if (TextUtils.isEmpty(cacheDir)) {
+      WXLogUtils.e("cache dir is null");
+      return "";
+    }
+
+
+    if (cacheDir.indexOf("/cache") > 0) {
+      soPath = new File(cacheDir.replace("/cache", "/lib"), realName).getAbsolutePath();
+    }
+
+
     final File soFile = new File(soPath);
-    if (soFile.exists())
+    if (soFile.exists()) {
+      WXLogUtils.e(libName + "use lib so");
       return soPath;
-    else {
+    } else {
       //unzip from apk file
       final boolean success = extractSo();
-      if (success)
+      if (success) {
         return new File(getCacheDir(), realName).getAbsolutePath();
+      }
     }
-    return "";
+    return soPath;
+  }
+
+  public static String getLibJScRealPath() {
+    if(TextUtils.isEmpty(CORE_JSC_SO_PATH)) {
+      CORE_JSC_SO_PATH = findSoPath(CORE_JSC_SO_NAME);
+      WXLogUtils.e("findLibJscRealPath " + CORE_JSC_SO_PATH);
+    }
+    return CORE_JSC_SO_PATH;
   }
 
   public static String getLibJssRealPath() {
     if(TextUtils.isEmpty(CORE_JSS_SO_PATH)) {
-      CORE_JSS_SO_PATH = findLibJssRealPath();
+      CORE_JSS_SO_PATH = findSoPath(CORE_JSS_SO_NAME);
       WXLogUtils.e("findLibJssRealPath " + CORE_JSS_SO_PATH);
     }
 
     return CORE_JSS_SO_PATH;
   }
+
+  public static String getLibJssIcuPath() {
+    if(TextUtils.isEmpty(CORE_JSS_ICU_PATH)){
+      CORE_JSS_ICU_PATH = findIcuPath();
+    }
+
+    return CORE_JSS_ICU_PATH;
+  }
+
+  public static String getLibLdPath() {
+    if (TextUtils.isEmpty(LIB_LD_PATH)) {
+      ClassLoader classLoader = WXEnvironment.class.getClassLoader();
+      try {
+        Method getLdLibraryPath = classLoader.getClass().getMethod("getLdLibraryPath", new Class[0]);
+        LIB_LD_PATH = (String) getLdLibraryPath.invoke(classLoader, new Object[0]);
+      } catch (IllegalAccessException e) {
+        e.printStackTrace();
+      } catch (InvocationTargetException e) {
+        e.printStackTrace();
+      } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+      }
+    }
+
+    if(TextUtils.isEmpty(LIB_LD_PATH)) {
+      try {
+        String property = System.getProperty("java.library.path");
+        String libJScRealPath = getLibJScRealPath();
+        if(!TextUtils.isEmpty(libJScRealPath)) {
+          LIB_LD_PATH = new File(libJScRealPath).getParent() + ":" + property;
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
+    }
+
+    WXLogUtils.e("getLibLdPath is " + LIB_LD_PATH);
+    return LIB_LD_PATH;
+  }
 }
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 33e85b3c99..4a32a1d2b8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -83,6 +83,7 @@
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXReflectionUtils;
 import com.taobao.weex.utils.WXUtils;
+import com.taobao.weex.utils.WXViewUtils;
 
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
@@ -209,6 +210,51 @@ public void removeLayerOverFlowListener(String ref) {
   private List<InstanceOnFireEventInterceptor> mInstanceOnFireEventInterceptorList;
 
 
+  /**
+   * network handler
+   */
+  public interface ImageNetworkHandler {
+    public String fetchLocal(String url);
+  }
+
+  public interface StreamNetworkHandler {
+    public String fetchLocal(String url);
+  }
+
+  public interface CustomFontNetworkHandler {
+    public String fetchLocal(String url);
+  }
+
+  private ImageNetworkHandler mImageNetworkHandler;
+
+  private StreamNetworkHandler mStreamNetworkHandler;
+
+  private CustomFontNetworkHandler mCustomFontNetworkHandler;
+
+  public ImageNetworkHandler getImageNetworkHandler() {
+    return mImageNetworkHandler;
+  }
+
+  public void setImageNetworkHandler(ImageNetworkHandler imageNetworkHandler) {
+    this.mImageNetworkHandler = imageNetworkHandler;
+  }
+
+  public StreamNetworkHandler getStreamNetworkHandler() {
+    return mStreamNetworkHandler;
+  }
+
+  public void setStreamNetworkHandler(StreamNetworkHandler streamNetworkHandler) {
+    this.mStreamNetworkHandler = streamNetworkHandler;
+  }
+
+  public CustomFontNetworkHandler getCustomFontNetworkHandler() {
+    return mCustomFontNetworkHandler;
+  }
+
+  public void setCustomFontNetworkHandler(CustomFontNetworkHandler customFontNetworkHandler) {
+    this.mCustomFontNetworkHandler = customFontNetworkHandler;
+  }
+
   /**
    * set make weexCore run in single process mode
    * @param flag true means weexCore run in single process mode or multi process mode
@@ -940,7 +986,13 @@ public void onActivityCreate() {
     }
 
     mGlobalEventReceiver=new WXGlobalEventReceiver(this);
-    getContext().registerReceiver(mGlobalEventReceiver,new IntentFilter(WXGlobalEventReceiver.EVENT_ACTION));
+    try {
+      getContext().registerReceiver(mGlobalEventReceiver, new IntentFilter(WXGlobalEventReceiver.EVENT_ACTION));
+    } catch (Exception e) {
+      // Huawei may throw a exception if register more than 500 BroadcastReceivers
+      WXLogUtils.e(e.getMessage());
+    }
+
   }
 
   @Override
@@ -1565,8 +1617,19 @@ public synchronized void registerOnWXScrollListener(OnWXScrollListener wxScrollL
     mWXScrollListeners.add(wxScrollListener);
   }
 
+  static int sScreenHeight = -1;
   public void setSize(int width, int height) {
     if (width > 0 && height > 0 & !isDestroy && mRendered && mRenderContainer != null) {
+        if (sScreenHeight < 0){
+            sScreenHeight = WXViewUtils.getScreenHeight(getContext());
+        }
+        if (sScreenHeight>0){
+            double screenRatio = (double)height/(double)sScreenHeight *100;
+            if(screenRatio>100){
+              screenRatio =100;
+            }
+            getApmForInstance().addStats(WXInstanceApm.KEY_PAGE_STATS_BODY_RATIO,screenRatio);
+        }
       ViewGroup.LayoutParams layoutParams = mRenderContainer.getLayoutParams();
       if (layoutParams != null) {
         final float realWidth = width;
diff --git a/android/sdk/src/main/java/com/taobao/weex/appfram/storage/WXSQLiteOpenHelper.java b/android/sdk/src/main/java/com/taobao/weex/appfram/storage/WXSQLiteOpenHelper.java
index 1429ddf088..ff67808786 100644
--- a/android/sdk/src/main/java/com/taobao/weex/appfram/storage/WXSQLiteOpenHelper.java
+++ b/android/sdk/src/main/java/com/taobao/weex/appfram/storage/WXSQLiteOpenHelper.java
@@ -191,7 +191,7 @@ private boolean deleteDB() {
         return mContext.deleteDatabase(DATABASE_NAME);
     }
 
-    public void closeDatabase() {
+    public synchronized void closeDatabase() {
         if (mDb != null && mDb.isOpen()) {
             mDb.close();
             mDb = null;
diff --git a/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java b/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java
index 6a408fbd6e..de4e59906a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java
+++ b/android/sdk/src/main/java/com/taobao/weex/base/SystemMessageHandler.java
@@ -35,8 +35,6 @@
 
     private long mMessagePumpDelegateNative = 0;
 
-    private boolean mIsRunning = false;
-
     private Method mMessageMethodSetAsynchronous;
 
     private native void nativeRunWork(long delegateNative);
@@ -54,7 +52,6 @@ private SystemMessageHandler(long messagePumpDelegateNative) {
         } catch (RuntimeException e) {
             Log.e(TAG, "Exception while loading Message.setAsynchronous method: " + e);
         }
-        mIsRunning = true;
     }
 
     @CalledByNative
@@ -67,9 +64,14 @@ private void scheduleWork() {
         sendMessage(obtainAsyncMessage(SCHEDULED_WORK));
     }
 
+    @CalledByNative
+    private void scheduleDelayedWork(long delayMillis) {
+        sendMessageDelayed(obtainAsyncMessage(SCHEDULED_WORK), delayMillis);
+    }
+
     @CalledByNative
     private void stop() {
-        mIsRunning = false;
+        removeMessages(SCHEDULED_WORK);
     }
 
     private Message obtainAsyncMessage(int what) {
@@ -99,8 +101,6 @@ private Message obtainAsyncMessage(int what) {
 
     @Override
     public void handleMessage(Message msg) {
-        if(mIsRunning) {
-            nativeRunWork(mMessagePumpDelegateNative);
-        }
+        nativeRunWork(mMessagePumpDelegateNative);
     }
 }
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 072117dddf..f93e0fe61d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -26,6 +26,7 @@
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.adapter.IWXUserTrackAdapter;
+import com.taobao.weex.base.CalledByNative;
 import com.taobao.weex.common.IWXBridge;
 import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.dom.CSSShorthand;
@@ -97,6 +98,8 @@
 
   private native void nativeRegisterCoreEnv(String key, String value);
 
+  private native void nativeResetWXBridge(Object bridge, String className);
+
   /**
    * update global config,
    * @param config params
@@ -169,6 +172,7 @@ public String execJSOnInstance(String instanceId, String script, int type) {
    * @param tasks
    * @param callback
    */
+  @CalledByNative
   public int callNative(String instanceId, byte[] tasks, String callback) {
     return callNative(instanceId, (JSONArray) JSON.parseArray(new String(tasks)), callback);
   }
@@ -204,6 +208,7 @@ private int callNative(String instanceId, JSONArray tasks, String callback){
     return errorCode;
   }
 
+  @CalledByNative
   public void reportJSException(String instanceId, String func, String exception) {
     WXBridgeManager.getInstance().reportJSException(instanceId, func, exception);
   }
@@ -221,6 +226,7 @@ public void reportJSException(String instanceId, String func, String exception)
    * @return the result
    */
   @Override
+  @CalledByNative
   public Object callNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
     try {
       long start = WXUtils.getFixUnixTime();
@@ -275,6 +281,7 @@ public Object callNativeModule(String instanceId, String module, String method,
    * @param options      option arguments for extending
    */
   @Override
+  @CalledByNative
   public void callNativeComponent(String instanceId, String ref, String method, byte[] arguments, byte[] optionsData) {
     try{
       JSONArray argArray = (JSONArray) WXWsonJSONSwitch.parseWsonOrJSON(arguments);
@@ -285,10 +292,14 @@ public void callNativeComponent(String instanceId, String ref, String method, by
     }
   }
 
+  @Override
+  @CalledByNative
   public void setTimeoutNative(String callbackId, String time) {
     WXBridgeManager.getInstance().setTimeout(callbackId, time);
   }
 
+  @Override
+  @CalledByNative
   public void setJSFrmVersion(String version) {
     if (version != null) {
       WXEnvironment.JS_LIB_SDK_VERSION = version;
@@ -296,6 +307,13 @@ public void setJSFrmVersion(String version) {
   }
 
   @Override
+  public void resetWXBridge(boolean remoteDebug) {
+    final String className = this.getClass().getName().replace('.', '/');
+    nativeResetWXBridge(this, className);
+  }
+
+  @Override
+  @CalledByNative
   public int callUpdateFinish(String instanceId, byte[] tasks, String callback) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -310,6 +328,7 @@ public int callUpdateFinish(String instanceId, byte[] tasks, String callback) {
   }
 
   @Override
+  @CalledByNative
   public int callRefreshFinish(String instanceId, byte[] tasks, String callback) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -324,6 +343,7 @@ public int callRefreshFinish(String instanceId, byte[] tasks, String callback) {
   }
 
   @Override
+  @CalledByNative
   public void reportServerCrash(String instanceId, String crashFile) {
     WXLogUtils.e(TAG, "reportServerCrash instanceId:" + instanceId + " crashFile: " + crashFile);
     int errorCode = IWXBridge.INSTANCE_RENDERING;
@@ -340,6 +360,7 @@ public void reportServerCrash(String instanceId, String crashFile) {
   }
 
   @Override
+  @CalledByNative
   public int callCreateBody(String instanceId, String componentType, String ref,
                             HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
                             float[] margins, float[] paddings, float[] borders) {
@@ -358,6 +379,7 @@ public int callCreateBody(String instanceId, String componentType, String ref,
   }
 
   @Override
+  @CalledByNative
   public int callAddElement(String instanceId, String componentType, String ref, int index, String parentRef,
                             HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
                             float[] margins, float[] paddings, float[] borders,  boolean willLayout) {
@@ -377,6 +399,7 @@ public int callAddElement(String instanceId, String componentType, String ref, i
   }
 
   @Override
+  @CalledByNative
   public int callRemoveElement(String instanceId, String ref) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -390,6 +413,7 @@ public int callRemoveElement(String instanceId, String ref) {
   }
 
   @Override
+  @CalledByNative
   public int callMoveElement(String instanceId, String ref, String parentref, int index) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -403,6 +427,7 @@ public int callMoveElement(String instanceId, String ref, String parentref, int
   }
 
   @Override
+  @CalledByNative
   public int callAddEvent(String instanceId, String ref, String event) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -417,6 +442,7 @@ public int callAddEvent(String instanceId, String ref, String event) {
   }
 
   @Override
+  @CalledByNative
   public int callRemoveEvent(String instanceId, String ref, String event) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -431,6 +457,7 @@ public int callRemoveEvent(String instanceId, String ref, String event) {
   }
 
   @Override
+  @CalledByNative
   public int callUpdateStyle(String instanceId, String ref,
                              HashMap<String, Object> styles,
                              HashMap<String, String> paddings,
@@ -449,6 +476,7 @@ public int callUpdateStyle(String instanceId, String ref,
   }
 
   @Override
+  @CalledByNative
   public int callUpdateAttrs(String instanceId, String ref, HashMap<String, String> attrs) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -463,6 +491,7 @@ public int callUpdateAttrs(String instanceId, String ref, HashMap<String, String
   }
 
   @Override
+  @CalledByNative
   public int callLayout(String instanceId, String ref, int top, int bottom, int left, int right, int height, int width, int index) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -477,6 +506,7 @@ public int callLayout(String instanceId, String ref, int top, int bottom, int le
   }
 
   @Override
+  @CalledByNative
   public int callCreateFinish(String instanceId) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -488,6 +518,7 @@ public int callCreateFinish(String instanceId) {
   }
 
   @Override
+  @CalledByNative
   public int callRenderSuccess(String instanceId) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -499,6 +530,7 @@ public int callRenderSuccess(String instanceId) {
   }
 
   @Override
+  @CalledByNative
   public int callAppendTreeCreateFinish(String instanceId, String ref) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -510,6 +542,7 @@ public int callAppendTreeCreateFinish(String instanceId, String ref) {
   }
 
   @Override
+  @CalledByNative
   public int callHasTransitionPros(String instanceId, String ref, HashMap<String, String> styles) {
     int errorCode = IWXBridge.INSTANCE_RENDERING;
     try {
@@ -523,6 +556,7 @@ public int callHasTransitionPros(String instanceId, String ref, HashMap<String,
   }
 
   @Override
+  @CalledByNative
   public ContentBoxMeasurement getMeasurementFunc(String instanceId, long renderObjectPtr) {
     ContentBoxMeasurement obj = null;
     try {
@@ -610,6 +644,7 @@ public void registerCoreEnv(String key, String value) {
     nativeRegisterCoreEnv(key, value);
   }
 
+  @CalledByNative
   public void reportNativeInitStatus(String statusCode, String errorMsg) {
     if (WXErrorCode.WX_JS_FRAMEWORK_INIT_SINGLE_PROCESS_SUCCESS.getErrorCode().equals(statusCode)
             || WXErrorCode.WX_JS_FRAMEWORK_INIT_FAILED.getErrorCode().equals(statusCode)) {
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 31dd996f46..f9d15f1d3d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -30,8 +30,7 @@
 import android.support.annotation.UiThread;
 import android.support.v4.util.ArrayMap;
 import android.text.TextUtils;
-import android.view.View;
-import android.view.ViewGroup;
+
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -355,8 +354,8 @@ public Object callModuleMethod(String instanceId, String moduleStr, String metho
       ext.put("args", args.toJSONString());
       WXLogUtils.e("[WXBridgeManager] callNative : numberFormatException when parsing string to numbers in args", ext.toString());
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-          WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNative",
-          "[WXBridgeManager] callNative : numberFormatException when parsing string to numbers in args" , ext);
+          WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callNative",
+              WXLogUtils.getStackTrace(e) , ext);
       return null;
     }
   }
@@ -368,6 +367,7 @@ public void restart() {
     setJSFrameworkInit(false);
     WXModuleManager.resetAllModuleState();
     initWXBridge(WXEnvironment.sRemoteDebugMode);
+    mWXBridge.resetWXBridge(WXEnvironment.sRemoteDebugMode);
   }
 
   /**
@@ -449,6 +449,14 @@ public void removeMessage(int what, Object obj) {
 
   public Object callNativeModule(String instanceId, String module, String method, JSONArray arguments, Object options) {
 
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(module) || TextUtils.isEmpty(method)) {
+      WXLogUtils.d("[WXBridgeManager] call callNativeModule arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callNativeModule",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callNativeModule >>>> instanceId:").append(instanceId)
               .append(", module:").append(module).append(", method:").append(method).append(", arguments:").append(arguments);
@@ -468,7 +476,7 @@ public Object callNativeModule(String instanceId, String module, String method,
       String err = "[WXBridgeManager] callNative exception: " + WXLogUtils.getStackTrace(e);
       WXLogUtils.e(err);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNativeModule",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callNativeModule",
               err, null);
     }
 
@@ -477,6 +485,14 @@ public Object callNativeModule(String instanceId, String module, String method,
 
   public Object callNativeModule(String instanceId, String module, String method, JSONArray arguments, JSONObject options) {
 
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(module) || TextUtils.isEmpty(method)) {
+      WXLogUtils.d("[WXBridgeManager] call callNativeModule arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callNativeModule",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callNativeModule >>>> instanceId:").append(instanceId)
               .append(", module:").append(module).append(", method:").append(method).append(", arguments:").append(arguments);
@@ -497,10 +513,10 @@ public Object callNativeModule(String instanceId, String module, String method,
               method, arguments, options);
       }
     } catch (Exception e) {
-      String err = "[WXBridgeManager] callNative exception: " + WXLogUtils.getStackTrace(e);
+      String err = "[WXBridgeManager] callNativeModule exception: " + WXLogUtils.getStackTrace(e);
       WXLogUtils.e(err);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNativeModule",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callNativeModule",
               err, null);
     }
 
@@ -508,19 +524,29 @@ public Object callNativeModule(String instanceId, String module, String method,
   }
 
   public Object callNativeComponent(String instanceId, String componentRef, String method, JSONArray arguments, Object options) {
+
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(componentRef) || TextUtils.isEmpty(method)) {
+      WXLogUtils.d("[WXBridgeManager] call callNativeComponent arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callNativeComponent",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callNativeComponent >>>> instanceId:").append(instanceId)
               .append(", componentRef:").append(componentRef).append(", method:").append(method).append(", arguments:").append(arguments);
       WXLogUtils.d(mLodBuilder.substring(0));
       mLodBuilder.setLength(0);
     }
+
     try {
       WXDomModule dom = WXModuleManager.getDomModule(instanceId);
       dom.invokeMethod(componentRef, method, arguments);
     } catch (Exception e) {
-      WXLogUtils.e("[WXBridgeManager] callNative exception: ", e);
+      WXLogUtils.e("[WXBridgeManager] callNativeComponent exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNativeComponent",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callNativeComponent",
               WXLogUtils.getStackTrace(e), null);
     }
     return null;
@@ -534,13 +560,12 @@ public Object callNativeComponent(String instanceId, String componentRef, String
    * @param callback   next tick id
    */
   public int callNative(String instanceId, JSONArray tasks, String callback) {
-    if (tasks == null) {
-      String err = "[WXBridgeManager] callNative: call Native tasks is null";
-      WXLogUtils.e(err);
-      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNative",
-              err + "| INSTANCE_RENDERING_ERROR will be set", null);
 
+    if (TextUtils.isEmpty(instanceId) || tasks == null) {
+      WXLogUtils.d("[WXBridgeManager] call callNative arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callNative",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
 
@@ -588,7 +613,7 @@ public int callNative(String instanceId, JSONArray tasks, String callback) {
       } catch (Exception e) {
         WXLogUtils.e("[WXBridgeManager] callNative exception: ", e);
         WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-                WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callNative",
+                WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callNative",
                 WXLogUtils.getStackTrace(e) , null);
       }
     }
@@ -603,6 +628,15 @@ public int callNative(String instanceId, JSONArray tasks, String callback) {
 
   // callUpdateFinish
   public int callUpdateFinish(String instanceId, String callback) {
+
+    if (TextUtils.isEmpty(instanceId)) {
+      WXLogUtils.d("[WXBridgeManager] call callUpdateFinish arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callUpdateFinish",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callUpdateFinish >>>> instanceId:").append(instanceId)
               .append(", callback:").append(callback);
@@ -616,14 +650,11 @@ public int callUpdateFinish(String instanceId, String callback) {
 
     try {
       if (WXSDKManager.getInstance().getSDKInstance(instanceId) != null) {
-//        WXDomModule domModule = getDomModule(instanceId);
-//        Action action = Actions.getUpdateFinish();
-//        domModule.postAction((DOMAction) action, false);
       }
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateFinish exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callUpdateFinish",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callUpdateFinish",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -637,6 +668,15 @@ public int callUpdateFinish(String instanceId, String callback) {
 
   // callRefreshFinish
   public int callRefreshFinish(String instanceId, String callback) {
+
+    if (TextUtils.isEmpty(instanceId)) {
+      WXLogUtils.d("[WXBridgeManager] call callRefreshFinish arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callRefreshFinish",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callRefreshFinish >>>> instanceId:").append(instanceId)
               .append(", callback:").append(callback);
@@ -657,7 +697,7 @@ public int callRefreshFinish(String instanceId, String callback) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRefreshFinish exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callRefreshFinish",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callRefreshFinish",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -712,7 +752,7 @@ public int callReportCrashReloadPage(String instanceId, String crashFile) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callReloadPage exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callReloadPage",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callReportCrashReloadPage",
               WXLogUtils.getStackTrace(e), null);
     }
     return IWXBridge.INSTANCE_RENDERING_ERROR;
@@ -1142,7 +1182,7 @@ private void invokeRefreshInstance(String instanceId, WXRefreshData refreshData)
     } catch (Throwable e) {
       String err = "[WXBridgeManager] invokeRefreshInstance " + WXLogUtils.getStackTrace(e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "invokeRefreshInstance",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "invokeRefreshInstance",
               err, null);
       WXLogUtils.e(err);
     }
@@ -1267,7 +1307,7 @@ private void invokeCreateInstance(@NonNull WXSDKInstance instance, String templa
             instance.getApmForInstance().addProperty(WXInstanceApm.KEY_PAGE_PROPERTIES_BUNDLE_TYPE, options.get(BUNDLE_TYPE));
           }
           if (options.get("env") == null) {
-            options.put("env", mInitParams);
+            options.put("env", mInitParams.toMap());
           }
         } catch (Throwable e) {
           e.printStackTrace();
@@ -1481,7 +1521,7 @@ private void invokeDestroyInstance(String instanceId) {
     } catch (Throwable e) {
       String err = "[WXBridgeManager] invokeDestroyInstance " + e.getCause();
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "invokeDestroyInstance", err, null);
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "invokeDestroyInstance", err, null);
       WXLogUtils.e(err);
     }
   }
@@ -1780,6 +1820,10 @@ private WXParams assembleDefaultOptions() {
     wxParams.setUseSingleProcess(isUseSingleProcess ? "true" : "false");
     wxParams.setCrashFilePath(WXEnvironment.getCrashFilePath(WXEnvironment.getApplication().getApplicationContext()));
     wxParams.setLibJssPath(WXEnvironment.getLibJssRealPath());
+    wxParams.setLibIcuPath(WXEnvironment.getLibJssIcuPath());
+    wxParams.setLibLdPath(WXEnvironment.getLibLdPath());
+    String libJScRealPath = WXEnvironment.getLibJScRealPath();
+    wxParams.setLibJscPath(TextUtils.isEmpty(libJScRealPath)? "" : new File(libJScRealPath).getParent());
     String appName = config.get(WXConfig.appName);
     if (!TextUtils.isEmpty(appName)) {
       wxParams.setAppName(appName);
@@ -2011,7 +2055,7 @@ public void reportJSException(String instanceId, String function,
     WXSDKInstance instance = null;
     if (instanceId != null && (instance = WXSDKManager.getInstance().getSDKInstance(instanceId)) != null) {
       exception +=   "\n getTemplateInfo==" +instance.getTemplateInfo();//add network header info
-      if (METHOD_CREATE_INSTANCE.equals(function)) {
+      if (METHOD_CREATE_INSTANCE.equals(function) || !instance.isContentMd5Match()) {
         try {
           if (isJSFrameworkInit() && reInitCount > 1 && !instance.isNeedReLoad()) {
             new ActionReloadPage(instanceId, true).executeAction();
@@ -2201,15 +2245,12 @@ public void takeJSHeapSnapshot(String filename) {
   public int callCreateBody(String pageId, String componentType, String ref,
                             HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
                             float[] margins, float[] paddings, float[] borders) {
-    long start = System.currentTimeMillis();
+
     if (TextUtils.isEmpty(pageId) || TextUtils.isEmpty(componentType) || TextUtils.isEmpty(ref)) {
-      // if (WXEnvironment.isApkDebugable()) {
-      WXLogUtils.d("[WXBridgeManager] callCreateBody: call CreateBody tasks is null");
-      // }
+      WXLogUtils.d("[WXBridgeManager] call callCreateBody arguments is null");
       WXExceptionUtils.commitCriticalExceptionRT(pageId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateBody",
-              "tasks is empty, INSTANCE_RENDERING_ERROR will be set", null);
-
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callCreateBody",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
 
@@ -2237,7 +2278,7 @@ public int callCreateBody(String pageId, String componentType, String ref,
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callCreateBody exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(pageId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateBody",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callCreateBody",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2247,13 +2288,11 @@ public int callCreateBody(String pageId, String componentType, String ref,
   public int callAddElement(String pageId, String componentType, String ref, int index, String parentRef,
                             HashMap<String, String> styles, HashMap<String, String> attributes, HashSet<String> events,
                             float[] margins, float[] paddings, float[] borders,boolean willLayout) {
-    long start = System.currentTimeMillis();
     if (TextUtils.isEmpty(pageId) || TextUtils.isEmpty(componentType) || TextUtils.isEmpty(ref)) {
-      WXLogUtils.d("[WXBridgeManager] callAddElement: call CreateBody tasks is null");
+      WXLogUtils.d("[WXBridgeManager] call callAddElement arguments is null");
       WXExceptionUtils.commitCriticalExceptionRT(pageId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAddElement",
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callAddElement",
               "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
-
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
 
@@ -2286,7 +2325,7 @@ public int callAddElement(String pageId, String componentType, String ref, int i
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callAddElement exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(pageId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAddElement",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callAddElement",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2295,6 +2334,14 @@ public int callAddElement(String pageId, String componentType, String ref, int i
 
   public int callRemoveElement(String instanceId, String ref) {
 
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref)) {
+      WXLogUtils.d("[WXBridgeManager] call callRemoveElement arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callRemoveElement",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callRemoveElement >>>> instanceId:").append(instanceId)
               .append(", ref:").append(ref);
@@ -2321,7 +2368,7 @@ public int callRemoveElement(String instanceId, String ref) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRemoveElement exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callRemoveElement",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callRemoveElement",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2330,6 +2377,14 @@ public int callRemoveElement(String instanceId, String ref) {
 
   public int callMoveElement(String instanceId, String ref, String parentref, int index) {
 
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref) || TextUtils.isEmpty(parentref)) {
+      WXLogUtils.d("[WXBridgeManager] call callMoveElement arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callMoveElement",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callMoveElement >>>> instanceId:").append(instanceId)
               .append(", parentref:").append(parentref)
@@ -2352,7 +2407,7 @@ public int callMoveElement(String instanceId, String ref, String parentref, int
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callMoveElement exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callMoveElement",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callMoveElement",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2361,6 +2416,14 @@ public int callMoveElement(String instanceId, String ref, String parentref, int
 
   public int callAddEvent(String instanceId, String ref, String event) {
 
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref) || TextUtils.isEmpty(event)) {
+      WXLogUtils.d("[WXBridgeManager] call callAddEvent arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callAddEvent",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callAddEvent >>>> instanceId:").append(instanceId)
               .append(", ref:").append(ref)
@@ -2381,7 +2444,7 @@ public int callAddEvent(String instanceId, String ref, String event) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callAddEvent exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAddEvent",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callAddEvent",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2392,6 +2455,14 @@ public int callAddEvent(String instanceId, String ref, String event) {
 
   public int callRemoveEvent(String instanceId, String ref, String event) {
 
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref) || TextUtils.isEmpty(event)) {
+      WXLogUtils.d("[WXBridgeManager] call callRemoveEvent arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callRemoveEvent",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callRemoveEvent >>>> instanceId:").append(instanceId)
               .append(", ref:").append(ref)
@@ -2412,7 +2483,7 @@ public int callRemoveEvent(String instanceId, String ref, String event) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRemoveEvent exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAddEvent",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callRemoveEvent",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2425,6 +2496,15 @@ public int callUpdateStyle(String instanceId, String ref, HashMap<String, Object
                              HashMap<String, String> paddings,
                              HashMap<String, String> margins,
                              HashMap<String, String> borders) {
+
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref)) {
+      WXLogUtils.d("[WXBridgeManager] call callUpdateStyle arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callUpdateStyle",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callUpdateStyle >>>> instanceId:").append(instanceId)
               .append(", ref:").append(ref).append(", styles:").append(styles.toString())
@@ -2448,7 +2528,7 @@ public int callUpdateStyle(String instanceId, String ref, HashMap<String, Object
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateStyle exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callUpdateStyle",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callUpdateStyle",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2456,6 +2536,15 @@ public int callUpdateStyle(String instanceId, String ref, HashMap<String, Object
   }
 
   public int callUpdateAttrs(String instanceId, String ref, HashMap<String, String> attrs) {
+
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref)) {
+      WXLogUtils.d("[WXBridgeManager] call callUpdateAttrs arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callUpdateAttrs",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callUpdateAttrs >>>> instanceId:").append(instanceId)
               .append(", ref:").append(ref).append(", attrs:").append(attrs.toString());
@@ -2476,7 +2565,7 @@ public int callUpdateAttrs(String instanceId, String ref, HashMap<String, String
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callUpdateAttrs exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callUpdateAttrs",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callUpdateAttrs",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2484,12 +2573,12 @@ public int callUpdateAttrs(String instanceId, String ref, HashMap<String, String
   }
 
   public int callLayout(String pageId, String ref, int top, int bottom, int left, int right, int height, int width, int index) {
+
     if (TextUtils.isEmpty(pageId) || TextUtils.isEmpty(ref)) {
-      WXLogUtils.d("[WXBridgeManager] callLayout: call callLayout arguments is null");
+      WXLogUtils.d("[WXBridgeManager] call callLayout arguments is null");
       WXExceptionUtils.commitCriticalExceptionRT(pageId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callLayout",
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callLayout",
               "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
-
       return IWXBridge.INSTANCE_RENDERING_ERROR;
     }
 
@@ -2531,7 +2620,7 @@ public int callLayout(String pageId, String ref, int top, int bottom, int left,
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callLayout exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(pageId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callLayout",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callLayout",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2539,6 +2628,15 @@ public int callLayout(String pageId, String ref, int top, int bottom, int left,
   }
 
   public int callAppendTreeCreateFinish(String instanceId, String ref) {
+
+    if (TextUtils.isEmpty(instanceId) || TextUtils.isEmpty(ref)) {
+      WXLogUtils.d("[WXBridgeManager] call callAppendTreeCreateFinish arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callAppendTreeCreateFinish",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callAppendTreeCreateFinish >>>> instanceId:").append(instanceId)
               .append(", ref:").append(ref);
@@ -2557,7 +2655,7 @@ public int callAppendTreeCreateFinish(String instanceId, String ref) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callAppendTreeCreateFinish exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callAppendTreeCreateFinish",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callAppendTreeCreateFinish",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2565,6 +2663,15 @@ public int callAppendTreeCreateFinish(String instanceId, String ref) {
   }
 
   public int callCreateFinish(String instanceId) {
+
+    if (TextUtils.isEmpty(instanceId)) {
+      WXLogUtils.d("[WXBridgeManager] call callCreateFinish arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callCreateFinish",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callCreateFinish >>>> instanceId:").append(instanceId);
       WXLogUtils.d(mLodBuilder.substring(0));
@@ -2586,7 +2693,7 @@ public int callCreateFinish(String instanceId) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callCreateFinish exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateFinish",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callCreateFinish",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2594,6 +2701,15 @@ public int callCreateFinish(String instanceId) {
   }
 
   public int callRenderSuccess(String instanceId) {
+
+    if (TextUtils.isEmpty(instanceId)) {
+      WXLogUtils.d("[WXBridgeManager] call callRenderSuccess arguments is null");
+      WXExceptionUtils.commitCriticalExceptionRT(instanceId,
+              WXErrorCode.WX_RENDER_ERR_BRIDGE_ARG_NULL, "callRenderSuccess",
+              "arguments is empty, INSTANCE_RENDERING_ERROR will be set", null);
+      return IWXBridge.INSTANCE_RENDERING_ERROR;
+    }
+
     if (WXEnvironment.isApkDebugable() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("[WXBridgeManager] callRenderSuccess >>>> instanceId:").append(instanceId);
       WXLogUtils.d(mLodBuilder.substring(0));
@@ -2613,7 +2729,7 @@ public int callRenderSuccess(String instanceId) {
     } catch (Exception e) {
       WXLogUtils.e("[WXBridgeManager] callRenderSuccess exception: ", e);
       WXExceptionUtils.commitCriticalExceptionRT(instanceId,
-              WXErrorCode.WX_KEY_EXCEPTION_INVOKE, "callCreateFinish",
+              WXErrorCode.WX_KEY_EXCEPTION_INVOKE_BRIDGE, "callRenderSuccess",
               WXLogUtils.getStackTrace(e), null);
     }
 
@@ -2651,10 +2767,13 @@ public void forceLayout(String instanceId) {
 
   /**
    * native: OnInstanceClose
+   * should be called on JSThread
    * @param instanceId
    */
   public void onInstanceClose(String instanceId) {
-    mWXBridge.onInstanceClose(instanceId);
+    if (isJSFrameworkInit()) {
+      mWXBridge.onInstanceClose(instanceId);
+    }
   }
 
   /**
@@ -2668,7 +2787,9 @@ public void setDefaultRootSize(final String instanceId, final float defaultWidth
   }
 
   public void setRenderContentWrapContentToCore(boolean wrap, final String instanceId) {
-    mWXBridge.setRenderContainerWrapContent(wrap, instanceId);
+    if (isJSFrameworkInit()) {
+      mWXBridge.setRenderContainerWrapContent(wrap, instanceId);
+    }
   }
 
   public void setStyleWidth(String instanceId, String ref, float value) {
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
index 568560e6a5..2089bcdc6c 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXJsFunctions.java
@@ -18,6 +18,8 @@
  */
 package com.taobao.weex.bridge;
 
+import android.util.Log;
+
 import com.alibaba.fastjson.JSON;
 import com.taobao.weex.common.IWXJsFunctions;
 import com.taobao.weex.utils.WXWsonJSONSwitch;
@@ -29,7 +31,7 @@
 
 public class WXJsFunctions implements IWXJsFunctions {
     @Override
-    public native void initWxBridge(Object bridge, String className);
+    public native void resetWXBridge(Object bridge, String className);
 
     @Override
     public native void jsHandleSetJSVersion(String jsVersion);
@@ -42,7 +44,7 @@
 
 
     @Override
-    public void jsHandleCallNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options){
+    public void jsHandleCallNativeModule(String instanceId, String module, String method, byte[] arguments, byte[] options) {
         jsHandleCallNativeModule(instanceId, module, method,
                 WXWsonJSONSwitch.convertJSONToWsonIfUseWson(arguments), WXWsonJSONSwitch.convertJSONToWsonIfUseWson(options), true);
     }
@@ -105,10 +107,12 @@ public void jsFunctionCallUpdateAttrs(String pageId, String ref, String data){
 
     @Override
     public void jsFunctionCallUpdateStyle(String pageId, String ref, String data){
-        jsFunctionCallUpdateStyle(pageId, ref, WsonUtils.toWson(JSON.parseObject(data)), true);
+        byte[] data1 = WsonUtils.toWson(JSON.parseObject(data));
+        Log.e("WxDebug" ,"jsFunctionCallUpdateStyle");
+        jsFunctionCallUpdateStyleNative(pageId, ref, data1, true);
     }
 
-    public native void jsFunctionCallUpdateStyle(String pageId, String ref, byte[] data, boolean h5);
+    public native void jsFunctionCallUpdateStyleNative(String pageId, String ref, byte[] data, boolean h5);
 
 
     @Override
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 fbb2640863..8b41a8fae2 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
@@ -18,9 +18,11 @@
  */
 package com.taobao.weex.bridge;
 
+import com.taobao.weex.base.CalledByNative;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.io.Serializable;
+import java.util.HashMap;
 import java.util.Map;
 
 public class WXParams implements Serializable {
@@ -41,8 +43,13 @@
   private String crashFilePath;
   private String libJssPath;
 
+  private String libJscPath;
+  private String libIcuPath;
+  private String libLdPath;
+
   private Map<String, String> options;
 
+  @CalledByNative
   public Object getOptions() {
     return options;
   }
@@ -59,6 +66,7 @@ public void setShouldInfoCollect(String shouldInfoCollect) {
     this.shouldInfoCollect = shouldInfoCollect;
   }
 
+  @CalledByNative
   public String getPlatform() {
     return platform;
   }
@@ -71,10 +79,12 @@ public void setCacheDir(String cache) {
     this.cacheDir = cache;
   }
 
+  @CalledByNative
   public String getCacheDir() {
     return this.cacheDir;
   }
 
+  @CalledByNative
   public String getOsVersion() {
     return osVersion;
   }
@@ -83,6 +93,7 @@ public void setOsVersion(String osVersion) {
     this.osVersion = osVersion;
   }
 
+  @CalledByNative
   public String getAppVersion() {
     return appVersion;
   }
@@ -91,6 +102,7 @@ public void setAppVersion(String appVersion) {
     this.appVersion = appVersion;
   }
 
+  @CalledByNative
   public String getWeexVersion() {
     return weexVersion;
   }
@@ -99,6 +111,7 @@ public void setWeexVersion(String weexVersion) {
     this.weexVersion = weexVersion;
   }
 
+  @CalledByNative
   public String getDeviceModel() {
     return deviceModel;
   }
@@ -107,6 +120,7 @@ public void setDeviceModel(String deviceModel) {
     this.deviceModel = deviceModel;
   }
 
+  @CalledByNative
   public String getAppName() {
     return appName;
   }
@@ -115,6 +129,7 @@ public void setAppName(String appName) {
     this.appName = appName;
   }
 
+  @CalledByNative
   public String getDeviceWidth() {
     return deviceWidth;
   }
@@ -130,6 +145,7 @@ public void setDeviceWidth(String deviceWidth) {
     this.deviceWidth = deviceWidth;
   }
 
+  @CalledByNative
   public String getDeviceHeight() {
     return deviceHeight;
   }
@@ -145,6 +161,7 @@ public String getLogLevel() {
     return logLevel;
   }
 
+  @CalledByNative
   public String getUseSingleProcess() {
     WXLogUtils.e("getUseSingleProcess is running " + useSingleProcess);
     return useSingleProcess;
@@ -178,17 +195,70 @@ public void setCrashFilePath(String crashFilePath) {
     this.crashFilePath = crashFilePath;
   }
 
+  @CalledByNative
   public String getCrashFilePath() {
     WXLogUtils.e("WXParams", "getCrashFilePath:" + crashFilePath);
     return this.crashFilePath;
   }
 
+  @CalledByNative
   public String getLibJssPath() {
     WXLogUtils.e("getLibJssPath is running " + libJssPath);
     return libJssPath;
   }
 
+  @CalledByNative
+  public String getLibJscPath() {
+    WXLogUtils.e("getLibJscPath is running " + libJscPath);
+    return libJscPath;
+  }
+  public void setLibJscPath(String libJscPath) {
+    this.libJscPath = libJscPath;
+  }
   public void setLibJssPath(String libJssPath) {
     this.libJssPath = libJssPath;
   }
+  @CalledByNative
+  public String getLibIcuPath() {
+    WXLogUtils.e("getLibIcuPath is running " + libIcuPath);
+    return libIcuPath;
+  }
+
+  public void setLibIcuPath(String libIcuPath) {
+    this.libIcuPath = libIcuPath;
+  }
+
+  @CalledByNative
+  public String getLibLdPath() {
+    WXLogUtils.e("getLibLdPath is running " + libLdPath);
+    return libLdPath;
+  }
+
+  public void setLibLdPath(String libLdPath) {
+    this.libLdPath = libLdPath;
+  }
+
+  public Map<String, Object> toMap() {
+    HashMap<String, Object> map  = new HashMap<>();
+    map.put("appName", appName);
+    map.put("appVersion", appVersion);
+    map.put("cacheDir", cacheDir);
+    map.put("deviceHeight", deviceHeight);
+    map.put("deviceModel", deviceModel);
+    map.put("deviceWidth", deviceWidth);
+    map.put("libJssPath", libJssPath);
+    map.put("logLevel", logLevel);
+    map.put("needInitV8", needInitV8);
+    map.put("osVersion", osVersion);
+    map.put("platform", platform);
+    map.put("useSingleProcess", useSingleProcess);
+    map.put("shouldInfoCollect", shouldInfoCollect);
+    map.put("weexVersion", weexVersion);
+    map.put("crashFilePath", crashFilePath);
+    map.put("libJscPath", libJscPath);
+    map.put("libIcuPath", libIcuPath);
+    map.put("libLdPath", libLdPath);
+    map.put("options", options);
+    return map;
+  }
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
index d077dcdffa..3b540edfec 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/Constants.java
@@ -218,6 +218,7 @@
     String ENABLE_COPY = "enableCopy";
 
     String PAGE_ENABLED = "pagingEnabled";
+    String PAGE_SIZE = "pageSize";
 
 
 
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 99bf2b4194..3b7d9198d8 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -18,6 +18,9 @@
  */
 package com.taobao.weex.common;
 
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.base.CalledByNative;
+import com.taobao.weex.bridge.WXBridgeManager;
 import com.taobao.weex.bridge.WXJSObject;
 import com.taobao.weex.bridge.WXParams;
 import com.taobao.weex.dom.CSSShorthand;
@@ -191,4 +194,10 @@ int callUpdateAttrs(String instanceId, String ref,
   void registerCoreEnv(String key, String value);
 
   void reportNativeInitStatus(String statusCode, String errorMsg);
+
+  void setTimeoutNative(String callbackId, String time);
+
+  void setJSFrmVersion(String version);
+
+  void resetWXBridge(boolean remoteDebug);
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXJsFunctions.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXJsFunctions.java
index fbe592ba12..f289579584 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXJsFunctions.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXJsFunctions.java
@@ -24,7 +24,7 @@
 
 public interface IWXJsFunctions {
 
-    void initWxBridge(Object bridge, String className);
+    void resetWXBridge(Object bridge, String className);
 
     void jsHandleSetJSVersion(String jsVersion);
 
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 27aa1d420a..6e13a3df5a 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
@@ -188,7 +188,7 @@
   /**
    * WX Key Exception Commit RT Register
    */
-  WX_KEY_EXCEPTION_INVOKE("-9100", "[WX_KEY_EXCEPTION_INVOKE]",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  WX_KEY_EXCEPTION_INVOKE_BRIDGE("-9100", "[WX_KEY_EXCEPTION_INVOKE_BRIDGE]",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED("-9101", "[WX_KEY_EXCEPTION_INVOKE_REGISTER_CONTENT_FAILED] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE("-9102", "[WX_KEY_EXCEPTION_INVOKE_JSSERVICE_EXECUTE] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
   WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES("-9103", "[WX_KEY_EXCEPTION_INVOKE_REGISTER_MODULES] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
@@ -199,28 +199,6 @@
   WX_KEY_EXCEPTION_JS_DOWNLOAD("-9200", "[WX_KEY_EXCEPTION_JS_DOWNLOAD]|",ErrorType.DOWN_LOAD_ERROR,ErrorGroup.NATIVE),
   WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED("-9201", "[WX_KEY_EXCEPTION_JS_DOWNLOAD_FAILED] | details",ErrorType.DOWN_LOAD_ERROR,ErrorGroup.NATIVE),
 
-  /**
-   * WX Key Exception Commit RT DomAction Excute
-   */
-  WX_KEY_EXCEPTION_DOM("-9300", "[WX_KEY_EXCEPTION_DOM]",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_ACTION_FIRST_ACTION("-9301", "[WX_KEY_EXCEPTION dom action exception] details: ACTION_FIRST_ACTION",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_CREATE_BODY("-9302", "[WX_KEY_EXCEPTION dom action exception] details:CREATE_BODY",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_UPDATE_ATTRS("-9303", "[WX_KEY_EXCEPTION dom action exception] details:UPDATE_ATTRS",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_UPDATE_STYLE("-9304", "[WX_KEY_EXCEPTION dom action exception] details:UPDATE_STYLE",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_REMOVE_ELEMENT("-9305", "[WX_KEY_EXCEPTION dom action exception] details:REMOVE_ELEMENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_ADD_ELEMENT("-9306", "[WX_KEY_EXCEPTION dom action exception] details:ADD_ELEMENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_MOVE_ELEMENT("-9307", "[WX_KEY_EXCEPTION dom action exception] details:MOVE_ELEMENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_ADD_EVENT("-9308", "[WX_KEY_EXCEPTION dom action exception] details:DOM_ADD_EVENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_REMOVE_EVENT("-9309", "[WX_KEY_EXCEPTION dom action exception] details:DOM_REMOVE_EVENT",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_CREATE_FINISH("-9310", "[WX_KEY_EXCEPTION dom action exception] details:CREATE_FINISH",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_REFRESH_FINISH("-9311", "[WX_KEY_EXCEPTION dom action exception] details:REFRESH_FINISH",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_ADD_RULE("-9313", "[WX_KEY_EXCEPTION_DOM_ADD_RULE] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_GET_COMPONENT_RECT("-9314", "[WX_KEY_EXCEPTION_DOM_GET_COMPONENT_RECT] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_INVOKE_METHOD("-9315", "[WX_KEY_EXCEPTION_DOM_INVOKE_METHOD] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_ANIMATION("-9316", "[WX_KEY_EXCEPTION_DOM_ANIMATION] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-  WX_KEY_EXCEPTION_DOM_MODULEINVO("-9317", "[WX_KEY_EXCEPTION_DOM_MODULEINVO] details",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
-
-
   /**
    * WX Key Exception Commit RT JsBridge eg. js excute runtime error
    */
@@ -234,13 +212,16 @@
   WX_RENDER_ERR_JS_CREATE_INSTANCE_CONTEXT("-9601", "white screen cause create instanceContext failed,check js stack ->",ErrorType.RENDER_ERROR,ErrorGroup.JS),
   WX_RENDER_ERR_LAYER_OVERFLOW("-9602", "WX_RENDER_ERR_LAYER_OVERFLOW", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
   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.RENDER_ERROR, ErrorGroup.NATIVE),
+  WX_RENDER_ERR_BRIDGE_ARG_NULL("-9610", "WX_RENDER_ERR_BRIDGE_ARG_NULL", ErrorType.RENDER_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),
   WX_RENDER_ERR_INSTANCE_ID_NULL("-9618", "WX_RENDER_ERR_INSTANCE_ID_NULL", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
   WX_RENDER_ERR_LIST_INVALID_COLUMN_COUNT("-9619", "WX_RENDER_ERR_LIST_INVALID_COLUMNJ_CONUNT", ErrorType.JS_ERROR, ErrorGroup.JS),
   WX_RENDER_ERR_TEXTURE_SETBACKGROUND("-9620", "WX_RENDER_ERR_TEXTURE_SETBACKGROUND", ErrorType.NATIVE_ERROR, ErrorGroup.NATIVE),
 
+
   /**
    * degrade code.
    */
diff --git a/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java b/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java
index d58f30ef6d..d796d14a94 100644
--- a/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/http/WXStreamModule.java
@@ -21,9 +21,12 @@
 import static com.taobao.weex.http.WXHttpUtil.KEY_USER_AGENT;
 
 import android.net.Uri;
+import android.text.TextUtils;
+
 import com.alibaba.fastjson.JSONException;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.adapter.IWXHttpAdapter;
 import com.taobao.weex.adapter.URIAdapter;
@@ -144,6 +147,16 @@ public void fetch(JSONObject optionsObj , final JSCallback callback, JSCallback
     String type = optionsObj.getString("type");
     int timeout = optionsObj.getIntValue("timeout");
 
+    WXSDKInstance wxsdkInstance = WXSDKManager.getInstance().getSDKInstance(instanceId);
+    if (wxsdkInstance != null) {
+      if (wxsdkInstance.getStreamNetworkHandler() != null) {
+        String localUrl = wxsdkInstance.getStreamNetworkHandler().fetchLocal(url);
+        if (!TextUtils.isEmpty(localUrl)) {
+          url = localUrl;
+        }
+      }
+    }
+
     if (method != null) method = method.toUpperCase();
     Options.Builder builder = new Options.Builder()
         .setMethod(!"GET".equals(method)
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 b7227eca96..611252f199 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
@@ -78,7 +78,7 @@
     public static final String KEY_PAGE_STATS_WRONG_IMG_SIZE_COUNT = "wxWrongImgSizeCount";
     public static final String KEY_PAGE_STATS_EMBED_COUNT = "wxEmbedCount";
     public static final String KEY_PAGE_STATS_LARGE_IMG_COUNT = "wxLargeImgMaxCount";
-
+    public static final String KEY_PAGE_STATS_BODY_RATIO = "wxBodyRatio";
     public static final String KEY_PAGE_STATS_SCROLLER_NUM = "wxScrollerCount";
     public static final String KEY_PAGE_STATS_CELL_DATA_UN_RECYCLE_NUM = "wxCellDataUnRecycleCount";
     public static final String KEY_PAGE_STATS_CELL_UN_RE_USE_NUM = "wxCellUnReUseCount";
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
index 2cdc21ec40..3295d8f777 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddElement.java
@@ -75,11 +75,7 @@ public GraphicActionAddElement(@NonNull WXSDKInstance instance, String ref,
           mParentRef);
       child = createComponent(instance, parent, basicComponentData);
       child.setTransition(WXTransition.fromMap(child.getStyles(), child));
-
-      if (child == null || parent == null) {
-        return;
-      }
-    }catch (ClassCastException e){
+    } catch (ClassCastException e) {
       Map<String, String> ext = new ArrayMap<>();
       WXComponent parent = WXSDKManager.getInstance().getWXRenderManager()
           .getWXComponent(getPageId(), mParentRef);
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddEvent.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddEvent.java
index 21f77438c4..3ef4a6c79e 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddEvent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionAddEvent.java
@@ -49,6 +49,5 @@ public void executeAction() {
     }
     component.addEvent(mEvent);
     Stopwatch.split("addEventToComponent");
-
   }
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateFinish.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateFinish.java
index 67a0c849eb..1addfd383a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateFinish.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionCreateFinish.java
@@ -43,17 +43,6 @@ public GraphicActionCreateFinish(@NonNull WXSDKInstance instance) {
     }
     instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_CREATE_FINISH);
     instance.getApmForInstance().extInfo.put(WXInstanceApm.KEY_PAGE_STAGES_CREATE_FINISH,true);
-
-    // todo add LayoutFinishListener
-//    final LayoutFinishListener listener;
-//    if(instance != null && (listener = instance.getLayoutFinishListener()) != null) {
-//      WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(WXThread.secure(new Runnable() {
-//          @Override
-//          public void run() {
-//              listener.onLayoutFinish(instance);
-//          }
-//      }),0);
-//    }
   }
 
   @Override
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionMoveElement.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionMoveElement.java
index b00e58cf9b..7523120103 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionMoveElement.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionMoveElement.java
@@ -49,7 +49,6 @@ public void executeAction() {
     if (component.getHostView() != null && !TextUtils.equals(component.getComponentType(), "video") && !TextUtils.equals(component.getComponentType(), "videoplus")) {
       int[] location = new  int[2] ;
       component.getHostView().getLocationInWindow(location);
-     // component.getInstance().onChangeElement(oldParent, location[1] > component.getInstance().getWeexHeight() + 1);
     }
 
     oldParent.remove(component, false);
@@ -59,7 +58,6 @@ public void executeAction() {
     if (component.getHostView() != null && !TextUtils.equals(component.getComponentType(), "video") && !TextUtils.equals(component.getComponentType(), "videoplus")) {
       int[] location = new  int[2] ;
       component.getHostView().getLocationInWindow(location);
-     // component.getInstance().onChangeElement(newParent, location[1] > component.getInstance().getWeexHeight() + 1);
     }
 
     if (!component.isVirtualComponent()) {
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
index 628ee0300a..e464cc1f1b 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/action/GraphicActionUpdateStyle.java
@@ -120,7 +120,7 @@ public GraphicActionUpdateStyle(WXSDKInstance instance, String ref,
 
   @Override
   public void executeAction() {
-    if (component == null) {
+    if (component == null || mStyle == null) {
       return;
     }
     if(component.getTransition() != null){
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
index 7c9453c177..ce3b986fb0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXComponentFactory.java
@@ -22,10 +22,12 @@
 
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.ui.IFComponentHolder;
 import com.taobao.weex.ui.WXComponentRegistry;
 import com.taobao.weex.ui.action.BasicComponentData;
+import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.util.HashMap;
@@ -53,7 +55,10 @@ public static WXComponent newInstance(WXSDKInstance instance, WXVContainer paren
       //For compatible reason of JS framework, unregistered type will be treated as container.
       holder = WXComponentRegistry.getComponent(WXBasicComponentType.CONTAINER);
       if (holder == null) {
-        throw new WXRuntimeException("Container component not found.");
+        WXExceptionUtils.commitCriticalExceptionRT(instance.getInstanceId(),
+                WXErrorCode.WX_RENDER_ERR_COMPONENT_NOT_REGISTER, "createComponent",
+                basicComponentData.mComponentType + " not registered", null);
+        return null;
       }
     }
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
index ca9fb2cf5a..a07f6282d1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXHeader.java
@@ -40,6 +40,7 @@ public WXHeader(WXSDKInstance instance, WXVContainer parent, boolean lazy, Basic
     String parantType = parent.getComponentType();
     if(WXBasicComponentType.LIST.equals(parantType)
             || WXBasicComponentType.RECYCLE_LIST.equals(parantType)){
+      getStyles().put(Constants.Name.POSITION, Constants.Value.STICKY);
       setSticky(Constants.Value.STICKY);
     }
   }
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
index 961d2e4c43..980bdd6b2d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXImage.java
@@ -208,6 +208,14 @@ private void setLocalSrc(Uri rewrited) {
 
   @WXComponentProp(name = Constants.Name.SRC)
   public void setSrc(String src) {
+
+    if (getInstance().getImageNetworkHandler() != null) {
+      String localUrl = getInstance().getImageNetworkHandler().fetchLocal(src);
+      if (!TextUtils.isEmpty(localUrl)) {
+        src = localUrl;
+      }
+    }
+
     if (src == null) {
       return;
     }
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
index 4af4752c03..2bcdf21b65 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/WXScroller.java
@@ -34,6 +34,9 @@
 import android.os.Looper;
 import android.support.annotation.NonNull;
 import android.text.TextUtils;
+import android.util.Log;
+import android.view.GestureDetector;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
@@ -81,11 +84,19 @@
   private Point mLastReport = new Point(-1, -1);
   private boolean mHasAddScrollEvent = false;
 
+  private static final int SWIPE_MIN_DISTANCE = 5;
+  private static final int SWIPE_THRESHOLD_VELOCITY = 300;
+  private int mActiveFeature = 0;
   /**
    * scroll start and scroll end event
    * */
   private ScrollStartEndHelper mScrollStartEndHelper;
 
+  private GestureDetector mGestureDetector;
+
+  private int pageSize = 0;
+  private boolean pageEnable = false;
+
   public static class Creator implements ComponentCreator {
     @Override
     public WXComponent createInstance(WXSDKInstance instance, WXVContainer parent, BasicComponentData basicComponentData) throws IllegalAccessException, InvocationTargetException, InstantiationException {
@@ -392,12 +403,28 @@ protected ViewGroup initComponentHostView(@NonNull Context context) {
       scroll = "vertical";
     } else {
       scroll = getAttrs().getScrollDirection();
+
+      Object o = getAttrs().get(Constants.Name.PAGE_ENABLED);
+
+      pageEnable = o != null && Boolean.parseBoolean(o.toString());
+
+      Object pageSize = getAttrs().get(Constants.Name.PAGE_SIZE);
+      if (pageSize != null) {
+        float aFloat = WXUtils.getFloat(pageSize);
+
+
+        float realPxByWidth = WXViewUtils.getRealPxByWidth(aFloat, getInstance().getInstanceViewPortWidth());
+        if (realPxByWidth != 0) {
+          this.pageSize = (int) realPxByWidth;
+        }
+      }
+
     }
 
     ViewGroup host;
     if(("horizontal").equals(scroll)){
       mOrientation = Constants.Orientation.HORIZONTAL;
-      WXHorizontalScrollView scrollView = new WXHorizontalScrollView(context);
+      final WXHorizontalScrollView scrollView = new WXHorizontalScrollView(context);
       mRealView = new FrameLayout(context);
       scrollView.setScrollViewListener(new WXHorizontalScrollView.ScrollViewListener() {
         @Override
@@ -410,6 +437,30 @@ public void onScrollChanged(WXHorizontalScrollView scrollView, int x, int y, int
       scrollView.addView(mRealView, layoutParams);
       scrollView.setHorizontalScrollBarEnabled(false);
 
+      if(pageEnable && this.pageSize != 0) {
+        mGestureDetector = new GestureDetector(new MyGestureDetector(scrollView));
+        scrollView.setOnTouchListener(new View.OnTouchListener() {
+          @Override
+          public boolean onTouch(View v, MotionEvent event) {
+            if (mGestureDetector.onTouchEvent(event)) {
+              return true;
+            }
+            else if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL ){
+              int scrollX = getScrollX();
+              int featureWidth = pageSize;
+              mActiveFeature = ((scrollX + (featureWidth/2))/featureWidth);
+              int scrollTo = mActiveFeature*featureWidth;
+              scrollView.smoothScrollTo(scrollTo, 0);
+              return true;
+            }
+            else{
+              return false;
+            }
+          }
+        });
+      }
+
+
       host = scrollView;
     }else{
       mOrientation = Constants.Orientation.VERTICAL;
@@ -769,4 +820,41 @@ public ScrollStartEndHelper getScrollStartEndHelper() {
     }
     return mScrollStartEndHelper;
   }
+
+
+  class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
+    public WXHorizontalScrollView getScrollView() {
+      return scrollView;
+    }
+
+    private final WXHorizontalScrollView scrollView;
+
+    MyGestureDetector(WXHorizontalScrollView horizontalScrollView) {
+      scrollView = horizontalScrollView;
+    }
+
+    @Override
+    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
+      int mItems = mChildren.size();
+      try {
+        //right to left
+        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
+          int featureWidth = pageSize;
+          mActiveFeature = (mActiveFeature < (mItems - 1))? mActiveFeature + 1:mItems -1;
+          scrollView.smoothScrollTo(mActiveFeature*featureWidth, 0);
+          return true;
+        }
+        //left to right
+        else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
+          int featureWidth = pageSize;
+          mActiveFeature = (mActiveFeature > 0)? mActiveFeature - 1:0;
+          scrollView.smoothScrollTo(mActiveFeature*featureWidth, 0);
+          return true;
+        }
+      } catch (Exception e) {
+        WXLogUtils.e("There was an error processing the Fling event:" + e.getMessage());
+      }
+      return false;
+    }
+  }
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/StickyHeaderHelper.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/StickyHeaderHelper.java
index 8dc560837a..44997bda54 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/StickyHeaderHelper.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/StickyHeaderHelper.java
@@ -113,10 +113,9 @@ public void notifyStickyShow(WXCell component) {
   public void notifyStickyRemove(WXCell compToRemove) {
     if (compToRemove == null)
       return;
-    final WXCell component = mHeaderComps.remove(compToRemove.getRef());
+    final WXCell component = mHeaderComps.containsValue(compToRemove) ? mHeaderComps.remove(compToRemove.getRef()) : compToRemove;
     final View headerView = mHeaderViews.remove(compToRemove.getRef());
 
-
     if(component == null || headerView == null){
       if(WXEnvironment.isApkDebugable()) {
       }
@@ -170,9 +169,13 @@ public void  clearStickyHeaders(){
     if(mHeaderViews.size() <= 0){
       return;
     }
-    Set<String> keys = mHeaderViews.keySet();
-    for(String key : keys){
-      notifyStickyRemove(mHeaderComps.get(key));
+    Iterator<Map.Entry<String, WXCell>> iterator = mHeaderComps.entrySet().iterator();
+
+    while (iterator.hasNext()) {
+      Map.Entry<String, WXCell> next = iterator.next();
+      WXCell value = next.getValue();
+      iterator.remove();
+      notifyStickyRemove(value);
     }
   }
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
index 9e96d864ad..a57557fc0d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXListComponent.java
@@ -22,6 +22,7 @@
 import android.support.v4.util.ArrayMap;
 import android.support.v7.widget.PagerSnapHelper;
 import android.text.TextUtils;
+
 import com.alibaba.fastjson.JSON;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.annotation.Component;
@@ -43,6 +44,7 @@
 import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
+
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.Locale;
@@ -98,7 +100,14 @@ protected BounceRecyclerView generateListView(Context context, int orientation)
      *  enable pagingEnabled attr
      */
     if(WXUtils.getBoolean(getAttrs().get(Constants.Name.PAGE_ENABLED),false)){
-      PagerSnapHelper snapHelper = new PagerSnapHelper();
+      PagerSnapHelper snapHelper = null;
+      String pageSize = WXUtils.getString(getAttrs().get(Constants.Name.PAGE_SIZE), null);
+      if(TextUtils.isEmpty(pageSize)) {
+        snapHelper = new PagerSnapHelper();
+      } else  {
+        snapHelper = new WXPagerSnapHelper();
+      }
+
       snapHelper.attachToRecyclerView(bounceRecyclerView.getInnerView());
     }
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXPagerSnapHelper.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXPagerSnapHelper.java
new file mode 100644
index 0000000000..633ac0c6ef
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/WXPagerSnapHelper.java
@@ -0,0 +1,75 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.ui.component.list;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.OrientationHelper;
+import android.support.v7.widget.PagerSnapHelper;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+
+public class WXPagerSnapHelper extends PagerSnapHelper {
+    @Nullable
+    private OrientationHelper mVerticalHelper;
+    @Nullable
+    private OrientationHelper mHorizontalHelper;
+
+    @Nullable
+    @Override
+    public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView) {
+
+        int[] out = new int[2];
+        if (layoutManager.canScrollHorizontally()) {
+            out[0] = this.distanceToStart(layoutManager, targetView, this.getHorizontalHelper(layoutManager));
+        } else {
+            out[0] = 0;
+        }
+
+        if (layoutManager.canScrollVertically()) {
+            out[1] = this.distanceToStart(layoutManager, targetView, this.getVerticalHelper(layoutManager));
+        } else {
+            out[1] = 0;
+        }
+
+        return out;
+    }
+
+    @NonNull
+    private OrientationHelper getVerticalHelper(@NonNull RecyclerView.LayoutManager layoutManager) {
+        if (this.mVerticalHelper == null) {
+            this.mVerticalHelper = OrientationHelper.createVerticalHelper(layoutManager);
+        }
+
+        return this.mVerticalHelper;
+    }
+
+    @NonNull
+    private OrientationHelper getHorizontalHelper(@NonNull RecyclerView.LayoutManager layoutManager) {
+        if (this.mHorizontalHelper == null) {
+            this.mHorizontalHelper = OrientationHelper.createHorizontalHelper(layoutManager);
+        }
+
+        return this.mHorizontalHelper;
+    }
+
+    private int distanceToStart(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView, OrientationHelper helper) {
+        return helper.getDecoratedStart(targetView) - helper.getStartAfterPadding();
+    }
+}
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/CellRenderContext.java b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/CellRenderContext.java
index 7d59848a5f..36fea10d7d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/CellRenderContext.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/component/list/template/CellRenderContext.java
@@ -58,7 +58,7 @@
      * get current render state
      * */
     public CellRenderState getRenderState() {
-        if(renderState != null){
+        if(renderState != null) {
             renderState =  templateList.getCellDataManager().getRenderState(position);
         }
         return renderState;
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/FontDO.java b/android/sdk/src/main/java/com/taobao/weex/utils/FontDO.java
index 6176c1a880..076564e8c7 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/FontDO.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/FontDO.java
@@ -67,6 +67,16 @@ public String getFontFamilyName() {
 
   private void parseSrc(String src, WXSDKInstance instance) {
     src = (src != null )? src.trim() : "";
+
+    if (instance != null) {
+      if (instance.getCustomFontNetworkHandler() != null) {
+        String localUrl = instance.getCustomFontNetworkHandler().fetchLocal(src);
+        if (!TextUtils.isEmpty(localUrl)) {
+          src = localUrl;
+        }
+      }
+    }
+
     if (src.isEmpty()) {
       mState = STATE_INVALID;
       WXLogUtils.e("TypefaceUtil", "font src is empty.");
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 7118ed2a09..8bba4f1231 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
@@ -192,12 +192,20 @@ public static void extractSo(String apkFile, String path) throws IOException {
       if(zipEntry.isDirectory()){
         continue;
       }
-      if(zipEntry.getName().contains("lib/armeabi/") && zipEntry.getName().contains("weex")){
+      if(zipEntry.getName().contains("lib/armeabi/") &&
+              (zipEntry.getName().contains("weex") || zipEntry.getName().equals("libJavaScriptCore.so"))){
         String[] fileNames = zipEntry.getName().split("/");
         String fileName = fileNames[fileNames.length - 1];
         InputStream inputStream = zip.getInputStream(zipEntry);
         byte[] data = new byte[1024];
-        FileOutputStream outputStream =new FileOutputStream(path + "/" + fileName);
+        File zipFile = new File(path + "/" + fileName);
+        if(zipFile.exists()) {
+          zipFile.delete();
+        }
+
+        zipFile.createNewFile();
+
+        FileOutputStream outputStream =new FileOutputStream(zipFile);
         while (inputStream.read(data) != -1) {
           outputStream.write(data);
         }
@@ -208,5 +216,36 @@ public static void extractSo(String apkFile, String path) throws IOException {
     zin.closeEntry();
   }
 
+  public static void copyFile(File oldFile, File newFile) {
+    FileInputStream inputStream = null;
+    FileOutputStream outputStream = null;
+    try {
+      inputStream = new FileInputStream(oldFile);
+      byte[] data = new byte[1024];
+      outputStream = new FileOutputStream(newFile);
+      while (inputStream.read(data) != -1) {
+        outputStream.write(data);
+      }
+      inputStream.close();
+      outputStream.close();
+    } catch (Exception e) {
+      WXLogUtils.e("copyFile " + e.getMessage() + ": " + oldFile.getAbsolutePath() + ": " + newFile.getAbsolutePath());
+      if (inputStream != null) {
+        try {
+          inputStream.close();
+        } catch (IOException e1) {
+          e1.printStackTrace();
+        }
+      }
+
+      if (outputStream != null) {
+        try {
+          outputStream.close();
+        } catch (IOException e1) {
+          e1.printStackTrace();
+        }
+      }
+    }
+  }
 
 }
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
index 44ea05714e..af42be3eec 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
@@ -64,10 +64,10 @@ private static Class loadClass(String clazzName) {
 
   public static void renderPerformanceLog(String type, long time) {
     if (WXEnvironment.isApkDebugable() || WXEnvironment.isPerf()) {
-      builder.setLength(0);
-      builder.append("[render time]").append(type).append(":").append(time);
-      Log.d(WEEX_PERF_TAG, builder.substring(0));
-      writeConsoleLog("debug", builder.substring(0));
+//      builder.setLength(0);
+//      builder.append("[render time]").append(type).append(":").append(time);
+//      Log.d(WEEX_PERF_TAG, builder.substring(0));
+//      writeConsoleLog("debug", builder.substring(0));
     }
   }
 
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
index 02efe7b6b7..6bf9b0714d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
@@ -21,10 +21,10 @@
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
 import android.os.Build;
+import android.system.ErrnoException;
+import android.system.Os;
 import android.text.TextUtils;
-import android.util.Log;
 
-import com.taobao.weex.BuildConfig;
 import com.taobao.weex.IWXStatisticsListener;
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.adapter.IWXSoLoaderAdapter;
@@ -34,7 +34,6 @@
 import java.io.BufferedReader;
 import java.io.Closeable;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.FileReader;
@@ -257,14 +256,7 @@ public static void copyStartUpSo() {
 
         File oldfile = new File(soName);
         if (oldfile.exists()) {
-          FileInputStream inputStream = new FileInputStream(oldfile);
-          byte[] data = new byte[1024];
-          FileOutputStream outputStream =new FileOutputStream(newfile);
-          while (inputStream.read(data) != -1) {
-            outputStream.write(data);
-          }
-          inputStream.close();
-          outputStream.close();
+          WXFileUtils.copyFile(oldfile, newfile);
         } else {
           WXEnvironment.extractSo();
         }
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/batch/BatchOperationHelper.java b/android/sdk/src/main/java/com/taobao/weex/utils/batch/BatchOperationHelper.java
index f74152fbad..a900cc4c45 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/batch/BatchOperationHelper.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/batch/BatchOperationHelper.java
@@ -23,6 +23,7 @@
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * Created by sospartan on 8/24/16.
@@ -31,7 +32,7 @@
 
 
   private BactchExecutor mExecutor;
-  private ArrayList<Runnable> sRegisterTasks = new ArrayList<>();
+  private ArrayList <Runnable> sRegisterTasks = new ArrayList<>();
   private boolean isCollecting = false;
 
   public BatchOperationHelper(BactchExecutor executor){
diff --git a/ios/playground/Podfile b/ios/playground/Podfile
index 5e4c34c129..41f48e177a 100644
--- a/ios/playground/Podfile
+++ b/ios/playground/Podfile
@@ -4,7 +4,7 @@ platform :ios, '8.0'
 
 def common
     pod 'WeexSDK', :path=>'../../'
-    pod 'WXDevtool','0.16.2'
+    pod 'WXDevtool','0.16.3'
     pod 'SDWebImage', '3.7.5'
     pod 'SocketRocket', '0.4.2'
     pod 'ATSDK-Weex', '0.0.1',:configurations => ['Debug']
diff --git a/ios/playground/WeexDemo.xcodeproj/project.pbxproj b/ios/playground/WeexDemo.xcodeproj/project.pbxproj
index e3c9b31450..0b33d607d4 100644
--- a/ios/playground/WeexDemo.xcodeproj/project.pbxproj
+++ b/ios/playground/WeexDemo.xcodeproj/project.pbxproj
@@ -13,7 +13,6 @@
 		2AE88A2C1C8544E6003329DE /* WXScannerVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AE88A2B1C8544E6003329DE /* WXScannerVC.m */; };
 		564B94671DD9C65000441C8D /* WeexUITestDemo-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 564B94661DD9C65000441C8D /* WeexUITestDemo-Info.plist */; };
 		59EA0DA71D2E7D19004F904A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 59EA0DA61D2E7D19004F904A /* Images.xcassets */; };
-		741DFE091DDDD519009B020F /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 741DFE081DDDD519009B020F /* libstdc++.tbd */; };
 		7478481E1E0CD4910044500D /* WXSyncTestModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 7478481D1E0CD4910044500D /* WXSyncTestModule.m */; };
 		747DF6681E2F176A005C53A8 /* UIView+UIThreadCheck.m in Sources */ = {isa = PBXBuildFile; fileRef = 747DF6671E2F176A005C53A8 /* UIView+UIThreadCheck.m */; };
 		74CC79EB1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 74CC79EA1C2B9E4700829368 /* UIViewController+WXDemoNaviBar.m */; };
@@ -38,6 +37,7 @@
 		847CAF311F39E3F100551725 /* WXExtModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 847CAF301F39E3F100551725 /* WXExtModule.m */; };
 		84D7CAC71CE3266C00D48D46 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */; };
 		8A0B5EFFF75BF82EA481983D /* libPods-WeexUITestDemo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E48C20F443AA337D1FE97622 /* libPods-WeexUITestDemo.a */; };
+		B83A6C5220FF16D50053BCEF /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = B83A6C5120FF16D50053BCEF /* libc++.tbd */; };
 		C43CDA031F1C6E01005A6B03 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = C43CDA021F1C6E01005A6B03 /* libz.tbd */; };
 		C47B78D21F299E27001D3B0C /* WXExtendCallNativeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = C47B78D11F299E27001D3B0C /* WXExtendCallNativeTest.m */; };
 		DC15A3C7200C505C009C8977 /* WXTitleBarModule.m in Sources */ = {isa = PBXBuildFile; fileRef = DC15A3C6200C505C009C8977 /* WXTitleBarModule.m */; };
@@ -108,6 +108,7 @@
 		847CAF2F1F39E3F100551725 /* WXExtModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXExtModule.h; sourceTree = "<group>"; };
 		847CAF301F39E3F100551725 /* WXExtModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXExtModule.m; sourceTree = "<group>"; };
 		9420131417A731ED089B0814 /* Pods-WeexDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WeexDemo.release.xcconfig"; path = "Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo.release.xcconfig"; sourceTree = "<group>"; };
+		B83A6C5120FF16D50053BCEF /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
 		C43CDA021F1C6E01005A6B03 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
 		C47B78D01F299E27001D3B0C /* WXExtendCallNativeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXExtendCallNativeTest.h; sourceTree = "<group>"; };
 		C47B78D11F299E27001D3B0C /* WXExtendCallNativeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXExtendCallNativeTest.m; sourceTree = "<group>"; };
@@ -141,8 +142,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				B83A6C5220FF16D50053BCEF /* libc++.tbd in Frameworks */,
 				C43CDA031F1C6E01005A6B03 /* libz.tbd in Frameworks */,
-				741DFE091DDDD519009B020F /* libstdc++.tbd in Frameworks */,
 				DC6DD9D21CFE9BC400549297 /* libsqlite3.0.tbd in Frameworks */,
 				EAEC716BE3E43DBC8494EC51 /* libPods-WeexDemo.a in Frameworks */,
 			);
@@ -182,6 +183,7 @@
 		327BB19797F63D5309FB91BF /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				B83A6C5120FF16D50053BCEF /* libc++.tbd */,
 				C43CDA021F1C6E01005A6B03 /* libz.tbd */,
 				741DFE081DDDD519009B020F /* libstdc++.tbd */,
 				7475ACA01CD8444A0044E96C /* libsqlite3.0.tbd */,
@@ -371,7 +373,6 @@
 				775BEE771C1E8ECC008D1629 /* Sources */,
 				775BEE781C1E8ECC008D1629 /* Frameworks */,
 				775BEE791C1E8ECC008D1629 /* Resources */,
-				685399B3421CD1410375A2AD /* [CP] Embed Pods Frameworks */,
 				C715566148067A7FFAB7797D /* [CP] Copy Pods Resources */,
 			);
 			buildRules = (
@@ -410,7 +411,6 @@
 				84361D3C1CA10F8E00F43825 /* Frameworks */,
 				84361D431CA10F8E00F43825 /* Resources */,
 				84361D6F1CA10F8E00F43825 /* [CP] Copy Pods Resources */,
-				84361D701CA10F8E00F43825 /* [CP] Embed Pods Frameworks */,
 			);
 			buildRules = (
 			);
@@ -493,20 +493,6 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		685399B3421CD1410375A2AD /* [CP] Embed Pods Frameworks */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "[CP] Embed Pods Frameworks";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexDemo/Pods-WeexDemo-frameworks.sh\"\n";
-		};
 		74CC7A221C2C13BF00829368 /* Start Samples */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -536,7 +522,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 		};
 		84361D6F1CA10F8E00F43825 /* [CP] Copy Pods Resources */ = {
@@ -549,37 +535,28 @@
 				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/ATSDK.bundle",
 				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/en.lproj",
 				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/zh-Hans.lproj",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/default.glsl",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/grad.glsl",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/pattern.glsl",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/radiation.glsl",
 				"${PODS_ROOT}/../../../pre-build/native-bundle-main.js",
+				"${PODS_ROOT}/../../../pre-build/weex-main-jsfm.js",
+				"${PODS_ROOT}/../../../pre-build/weex-polyfill.js",
+				"${PODS_ROOT}/../../../pre-build/weex-rax-api.js",
 				"${PODS_ROOT}/../../sdk/WeexSDK/Resources/wx_load_error@3x.png",
 			);
 			name = "[CP] Copy Pods Resources";
 			outputPaths = (
-				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ATSDK.bundle",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/native-bundle-main.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-main-jsfm.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-polyfill.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-rax-api.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/wx_load_error@3x.png",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
 			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-resources.sh\"\n";
 			showEnvVarsInLog = 0;
 		};
-		84361D701CA10F8E00F43825 /* [CP] Embed Pods Frameworks */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "[CP] Embed Pods Frameworks";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WeexUITestDemo/Pods-WeexUITestDemo-frameworks.sh\"\n";
-			showEnvVarsInLog = 0;
-		};
 		B5825066F03BDD65A25F2701 /* [CP] Check Pods Manifest.lock */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -595,7 +572,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n";
+			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 		};
 		C715566148067A7FFAB7797D /* [CP] Copy Pods Resources */ = {
@@ -608,16 +585,22 @@
 				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/ATSDK.bundle",
 				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/en.lproj",
 				"${PODS_ROOT}/ATSDK-Weex/ATSDK.framework/Versions/A/Resources/zh-Hans.lproj",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/default.glsl",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/grad.glsl",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/pattern.glsl",
-				"${PODS_ROOT}/GCanvas/GCanvas.framework/radiation.glsl",
 				"${PODS_ROOT}/../../../pre-build/native-bundle-main.js",
+				"${PODS_ROOT}/../../../pre-build/weex-main-jsfm.js",
+				"${PODS_ROOT}/../../../pre-build/weex-polyfill.js",
+				"${PODS_ROOT}/../../../pre-build/weex-rax-api.js",
 				"${PODS_ROOT}/../../sdk/WeexSDK/Resources/wx_load_error@3x.png",
 			);
 			name = "[CP] Copy Pods Resources";
 			outputPaths = (
-				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ATSDK.bundle",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/en.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/zh-Hans.lproj",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/native-bundle-main.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-main-jsfm.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-polyfill.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/weex-rax-api.js",
+				"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/wx_load_error@3x.png",
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
diff --git a/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/ios/playground/WeexDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ios/playground/WeexDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/playground/WeexDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/ios/playground/WeexDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ios/playground/WeexDemo/Info.plist b/ios/playground/WeexDemo/Info.plist
index 5ee55ec6ab..c1e3a3dfe4 100644
--- a/ios/playground/WeexDemo/Info.plist
+++ b/ios/playground/WeexDemo/Info.plist
@@ -2,15 +2,6 @@
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
-	<key>CFBundleURLTypes</key>
-	<array>
-		<dict>
-			<key>CFBundleURLSchemes</key>
-			<array>
-				<string>wxpage</string>
-			</array>
-		</dict>
-	</array>
 	<key>CFBundleDevelopmentRegion</key>
 	<string>en</string>
 	<key>CFBundleDisplayName</key>
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
index 5f0e1ccb42..22ce0e4aba 100644
--- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
+++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
@@ -19,12 +19,8 @@
 		1746EA7420E9D253007E55BD /* WXComponent_performance.h in Headers */ = {isa = PBXBuildFile; fileRef = 1746EA7220E9D253007E55BD /* WXComponent_performance.h */; };
 		1746EA7520E9D25E007E55BD /* WXSDKInstance_performance.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B122202090AA9300387E33 /* WXSDKInstance_performance.h */; };
 		176BE43C209172330086B6AF /* WXComponent+Layout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 176BE43B209172330086B6AF /* WXComponent+Layout.mm */; };
-		176BE43D209172A30086B6AF /* WXScrollerComponent+Layout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 17C7B4FF20452E1800A2296A /* WXScrollerComponent+Layout.mm */; };
-		176BE43E209172E20086B6AF /* WXScrollerComponent+Layout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 17C7B4FF20452E1800A2296A /* WXScrollerComponent+Layout.mm */; };
-		1771795521412A5D006F39A9 /* WXApmForInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 1771795421412A5D006F39A9 /* WXApmForInstance.m */; };
-		1771795621412A5D006F39A9 /* WXApmForInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 1771795421412A5D006F39A9 /* WXApmForInstance.m */; };
-		178EDF0D204FEC1300917F6B /* WXScrollerComponent+Layout.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50020452E1800A2296A /* WXScrollerComponent+Layout.h */; };
-		178EDF0F204FF11700917F6B /* WXCoreLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50420452E1800A2296A /* WXCoreLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		1771795721416DF0006F39A9 /* WXApmForInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 1771795421412A5D006F39A9 /* WXApmForInstance.m */; };
+		1771795821416DF1006F39A9 /* WXApmForInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 1771795421412A5D006F39A9 /* WXApmForInstance.m */; };
 		17B122212090AA9300387E33 /* WXSDKInstance_performance.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B1221F2090AA9300387E33 /* WXSDKInstance_performance.m */; };
 		17B122222090AA9300387E33 /* WXSDKInstance_performance.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B122202090AA9300387E33 /* WXSDKInstance_performance.h */; };
 		17B122252090AAB000387E33 /* WXSDKError.h in Headers */ = {isa = PBXBuildFile; fileRef = 17B122232090AAB000387E33 /* WXSDKError.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -34,17 +30,7 @@
 		17C74F0C2072145100AB4CAB /* WXAnalyzerCenter.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C74F092072145000AB4CAB /* WXAnalyzerCenter.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		17C74F0D2072145100AB4CAB /* WXAnalyzerCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 17C74F0A2072145100AB4CAB /* WXAnalyzerCenter.m */; };
 		17C74F0F2072147B00AB4CAB /* WXAnalyzerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C74F0E2072147A00AB4CAB /* WXAnalyzerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		17C7B50620452E1800A2296A /* WXCoreLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 17C7B4FE20452E1700A2296A /* WXCoreLayout.cpp */; };
-		17C7B50820452E1800A2296A /* WXScrollerComponent+Layout.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50020452E1800A2296A /* WXScrollerComponent+Layout.h */; };
-		17C7B50920452E1800A2296A /* WXCoreStyle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 17C7B50120452E1800A2296A /* WXCoreStyle.cpp */; };
-		17C7B50A20452E1800A2296A /* WXCoreFlexEnum.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50220452E1800A2296A /* WXCoreFlexEnum.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		17C7B50B20452E1800A2296A /* WXCoreStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50320452E1800A2296A /* WXCoreStyle.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		17E5ACD82091F02D00EE81F1 /* WXCoreLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50420452E1800A2296A /* WXCoreLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		17E5ACD92091F03700EE81F1 /* WXCoreStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50320452E1800A2296A /* WXCoreStyle.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		17E5ACDA2091F05000EE81F1 /* WXCoreFlexEnum.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C7B50220452E1800A2296A /* WXCoreFlexEnum.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		17E5ACDB2091F05700EE81F1 /* WXComponent+Layout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 176BE43B209172330086B6AF /* WXComponent+Layout.mm */; };
-		17E5ACDC2091F05E00EE81F1 /* WXCoreLayout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 17C7B4FE20452E1700A2296A /* WXCoreLayout.cpp */; };
-		17E5ACDD2091F06300EE81F1 /* WXCoreStyle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 17C7B50120452E1800A2296A /* WXCoreStyle.cpp */; };
 		17E5ACE2209211BD00EE81F1 /* WXTransition.mm in Sources */ = {isa = PBXBuildFile; fileRef = 333D9A261F41507A007CED39 /* WXTransition.mm */; };
 		17E5ACE3209211C200EE81F1 /* WXTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 333D9A251F41507A007CED39 /* WXTransition.h */; };
 		17F2D6E72087227300084378 /* WXAnalyzerProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C74F0E2072147A00AB4CAB /* WXAnalyzerProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -79,6 +65,12 @@
 		333D9A2A1F41507A007CED39 /* WXTransition.mm in Sources */ = {isa = PBXBuildFile; fileRef = 333D9A261F41507A007CED39 /* WXTransition.mm */; };
 		37B51EE41E97804D0040A743 /* WXCycleSliderComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 37B51EE21E97804D0040A743 /* WXCycleSliderComponent.h */; };
 		37B51EE51E97804D0040A743 /* WXCycleSliderComponent.mm in Sources */ = {isa = PBXBuildFile; fileRef = 37B51EE31E97804D0040A743 /* WXCycleSliderComponent.mm */; };
+		4532670A213FC84A00DAA620 /* WXDisplayLinkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 45326708213FC84900DAA620 /* WXDisplayLinkManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4532670B213FC84A00DAA620 /* WXDisplayLinkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 45326709213FC84900DAA620 /* WXDisplayLinkManager.m */; };
+		4532670C213FCF2300DAA620 /* WXDisplayLinkManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 45326708213FC84900DAA620 /* WXDisplayLinkManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4532670D213FCFB400DAA620 /* WXDisplayLinkManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 45326709213FC84900DAA620 /* WXDisplayLinkManager.m */; };
+		453267142140E38900DAA620 /* vcomponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 453267122140E38900DAA620 /* vcomponent.h */; };
+		453267152140E38900DAA620 /* vcomponent.cc in Sources */ = {isa = PBXBuildFile; fileRef = 453267132140E38900DAA620 /* vcomponent.cc */; };
 		591324A31D49B7F1004E89ED /* WXTimerModuleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 591324A21D49B7F1004E89ED /* WXTimerModuleTests.m */; };
 		591DD3311D23AD5800BE8709 /* WXErrorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 591DD32F1D23AD5800BE8709 /* WXErrorView.m */; };
 		591DD3321D23AD5800BE8709 /* WXErrorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 591DD3301D23AD5800BE8709 /* WXErrorView.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -93,7 +85,6 @@
 		5996BD751D4D8A0E00C0FEA6 /* WXSDKEngineTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5996BD741D4D8A0E00C0FEA6 /* WXSDKEngineTests.m */; };
 		59A582D41CF481110081FD3E /* WXAppMonitorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A582D31CF481110081FD3E /* WXAppMonitorProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		59A582FC1CF5B17B0081FD3E /* WXBridgeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A582FA1CF5B17B0081FD3E /* WXBridgeContext.h */; };
-		59A582FD1CF5B17B0081FD3E /* WXBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A582FB1CF5B17B0081FD3E /* WXBridgeContext.m */; };
 		59A583081CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A583041CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h */; };
 		59A583091CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A583051CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m */; };
 		59A596191CB630E50012CD52 /* WXNavigationProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 59A596171CB630E50012CD52 /* WXNavigationProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -275,7 +266,6 @@
 		77D161381C02DE940010B15B /* WXBridgeManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 77D161361C02DE940010B15B /* WXBridgeManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		77D161391C02DE940010B15B /* WXBridgeManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 77D161371C02DE940010B15B /* WXBridgeManager.m */; };
 		77D1613C1C02DEA60010B15B /* WXJSCoreBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 77D1613A1C02DEA60010B15B /* WXJSCoreBridge.h */; };
-		77D1613D1C02DEA60010B15B /* WXJSCoreBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 77D1613B1C02DEA60010B15B /* WXJSCoreBridge.m */; };
 		77D161431C02DEE40010B15B /* WXBridgeProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 77D161421C02DEE40010B15B /* WXBridgeProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		77D1614B1C02E3790010B15B /* WXConvert.h in Headers */ = {isa = PBXBuildFile; fileRef = 77D161491C02E3790010B15B /* WXConvert.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		77D1614C1C02E3790010B15B /* WXConvert.m in Sources */ = {isa = PBXBuildFile; fileRef = 77D1614A1C02E3790010B15B /* WXConvert.m */; };
@@ -300,6 +290,378 @@
 		841CD1061F974DFA0081196D /* WXExceptionUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 841CD1041F97399C0081196D /* WXExceptionUtils.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		841CD1071F974E000081196D /* WXExceptionUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 841CD1021F9739890081196D /* WXExceptionUtils.m */; };
 		9B9E74791FA2DB5800DAAEA9 /* WXTestBridgeMethodDummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9B9E74781FA2DB5800DAAEA9 /* WXTestBridgeMethodDummy.m */; };
+		B82A159820F8556F0098A509 /* WXSDKInstance_performance.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B1221F2090AA9300387E33 /* WXSDKInstance_performance.m */; };
+		B82A159920F857200098A509 /* WXSDKError.m in Sources */ = {isa = PBXBuildFile; fileRef = 17B122242090AAB000387E33 /* WXSDKError.m */; };
+		B82A159A20F857450098A509 /* WXWebSocketLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012851E150307003378D0 /* WXWebSocketLoader.m */; };
+		B82A159B20F857470098A509 /* WXWebSocketModule.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012811E1502E9003378D0 /* WXWebSocketModule.m */; };
+		B8394F3721468AF100CA1EFF /* render_action_trigger_vsync.h in Headers */ = {isa = PBXBuildFile; fileRef = B8394F3521468AF100CA1EFF /* render_action_trigger_vsync.h */; };
+		B8394F3821468AF100CA1EFF /* render_action_trigger_vsync.h in Headers */ = {isa = PBXBuildFile; fileRef = B8394F3521468AF100CA1EFF /* render_action_trigger_vsync.h */; };
+		B8394F3921468AF100CA1EFF /* render_action_trigger_vsync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8394F3621468AF100CA1EFF /* render_action_trigger_vsync.cpp */; };
+		B8394F3A21468AF100CA1EFF /* render_action_trigger_vsync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8394F3621468AF100CA1EFF /* render_action_trigger_vsync.cpp */; };
+		B85ED3032126715100EBEC11 /* WXRecyclerComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 745B2D601E5A8E1E0092D38A /* WXRecyclerComponent.h */; };
+		B863DF322107308000EA887D /* WXBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = B863DF312107307F00EA887D /* WXBridgeContext.m */; };
+		B863DF332107313400EA887D /* WXBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = B863DF312107307F00EA887D /* WXBridgeContext.m */; };
+		B89543F320EB18B5006EAD63 /* WXCoreBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = B89543ED20EB18B4006EAD63 /* WXCoreBridge.mm */; };
+		B89543F420EB18B5006EAD63 /* WXCoreBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = B89543ED20EB18B4006EAD63 /* WXCoreBridge.mm */; };
+		B89543F520EB18B5006EAD63 /* WXJSCoreBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = B89543EE20EB18B4006EAD63 /* WXJSCoreBridge.mm */; };
+		B89543F620EB18B5006EAD63 /* WXJSCoreBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = B89543EE20EB18B4006EAD63 /* WXJSCoreBridge.mm */; };
+		B89543F720EB18B5006EAD63 /* WXCoreBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = B89543EF20EB18B4006EAD63 /* WXCoreBridge.h */; };
+		B89543F820EB18B5006EAD63 /* WXCoreBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = B89543EF20EB18B4006EAD63 /* WXCoreBridge.h */; };
+		B8A72C9A213F8BAE0024E7BE /* class_json.h in Headers */ = {isa = PBXBuildFile; fileRef = B8A72C96213F8BAD0024E7BE /* class_json.h */; };
+		B8A72C9B213F8BAE0024E7BE /* class_json.h in Headers */ = {isa = PBXBuildFile; fileRef = B8A72C96213F8BAD0024E7BE /* class_json.h */; };
+		B8A72C9C213F8BAE0024E7BE /* class_string.h in Headers */ = {isa = PBXBuildFile; fileRef = B8A72C97213F8BAD0024E7BE /* class_string.h */; };
+		B8A72C9D213F8BAE0024E7BE /* class_string.h in Headers */ = {isa = PBXBuildFile; fileRef = B8A72C97213F8BAD0024E7BE /* class_string.h */; };
+		B8A72C9E213F8BAE0024E7BE /* class_json.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8A72C98213F8BAD0024E7BE /* class_json.cc */; };
+		B8A72C9F213F8BAE0024E7BE /* class_json.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8A72C98213F8BAD0024E7BE /* class_json.cc */; };
+		B8A72CA0213F8BAE0024E7BE /* class_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8A72C99213F8BAD0024E7BE /* class_string.cc */; };
+		B8A72CA1213F8BAE0024E7BE /* class_string.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8A72C99213F8BAD0024E7BE /* class_string.cc */; };
+		B8D66BA72125572F003960BD /* string_table.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AEE2125572F003960BD /* string_table.cc */; };
+		B8D66BA82125572F003960BD /* string_table.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AEE2125572F003960BD /* string_table.cc */; };
+		B8D66BA92125572F003960BD /* table.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AEF2125572F003960BD /* table.cc */; };
+		B8D66BAA2125572F003960BD /* table.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AEF2125572F003960BD /* table.cc */; };
+		B8D66BAB2125572F003960BD /* code_generator.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AF02125572F003960BD /* code_generator.h */; };
+		B8D66BAC2125572F003960BD /* code_generator.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AF02125572F003960BD /* code_generator.h */; };
+		B8D66BAD2125572F003960BD /* code_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF12125572F003960BD /* code_generator.cc */; };
+		B8D66BAE2125572F003960BD /* code_generator.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF12125572F003960BD /* code_generator.cc */; };
+		B8D66BAF2125572F003960BD /* ast_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF22125572F003960BD /* ast_factory.cc */; };
+		B8D66BB02125572F003960BD /* ast_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF22125572F003960BD /* ast_factory.cc */; };
+		B8D66BB12125572F003960BD /* parser.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AF32125572F003960BD /* parser.h */; };
+		B8D66BB22125572F003960BD /* parser.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AF32125572F003960BD /* parser.h */; };
+		B8D66BB32125572F003960BD /* parser.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF42125572F003960BD /* parser.cc */; };
+		B8D66BB42125572F003960BD /* parser.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF42125572F003960BD /* parser.cc */; };
+		B8D66BB52125572F003960BD /* vnode.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AF62125572F003960BD /* vnode.h */; };
+		B8D66BB62125572F003960BD /* vnode.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AF62125572F003960BD /* vnode.h */; };
+		B8D66BB72125572F003960BD /* vnode_exec_env.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF72125572F003960BD /* vnode_exec_env.cc */; };
+		B8D66BB82125572F003960BD /* vnode_exec_env.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF72125572F003960BD /* vnode_exec_env.cc */; };
+		B8D66BB92125572F003960BD /* vnode.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF82125572F003960BD /* vnode.cc */; };
+		B8D66BBA2125572F003960BD /* vnode.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF82125572F003960BD /* vnode.cc */; };
+		B8D66BBB2125572F003960BD /* vnode_render_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF92125572F003960BD /* vnode_render_context.cc */; };
+		B8D66BBC2125572F003960BD /* vnode_render_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AF92125572F003960BD /* vnode_render_context.cc */; };
+		B8D66BBD2125572F003960BD /* vnode_exec_env.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFA2125572F003960BD /* vnode_exec_env.h */; };
+		B8D66BBE2125572F003960BD /* vnode_exec_env.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFA2125572F003960BD /* vnode_exec_env.h */; };
+		B8D66BBF2125572F003960BD /* vnode_render_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AFB2125572F003960BD /* vnode_render_manager.cc */; };
+		B8D66BC02125572F003960BD /* vnode_render_manager.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AFB2125572F003960BD /* vnode_render_manager.cc */; };
+		B8D66BC12125572F003960BD /* vnode_render_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFC2125572F003960BD /* vnode_render_manager.h */; };
+		B8D66BC22125572F003960BD /* vnode_render_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFC2125572F003960BD /* vnode_render_manager.h */; };
+		B8D66BC32125572F003960BD /* vnode_render_context.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFD2125572F003960BD /* vnode_render_context.h */; };
+		B8D66BC42125572F003960BD /* vnode_render_context.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFD2125572F003960BD /* vnode_render_context.h */; };
+		B8D66BC52125572F003960BD /* tokenizer.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AFE2125572F003960BD /* tokenizer.cc */; };
+		B8D66BC62125572F003960BD /* tokenizer.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66AFE2125572F003960BD /* tokenizer.cc */; };
+		B8D66BC72125572F003960BD /* ast_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFF2125572F003960BD /* ast_factory.h */; };
+		B8D66BC82125572F003960BD /* ast_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66AFF2125572F003960BD /* ast_factory.h */; };
+		B8D66BC92125572F003960BD /* ast.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B002125572F003960BD /* ast.cc */; };
+		B8D66BCA2125572F003960BD /* ast.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B002125572F003960BD /* ast.cc */; };
+		B8D66BCD2125572F003960BD /* statement.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B022125572F003960BD /* statement.h */; };
+		B8D66BCE2125572F003960BD /* statement.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B022125572F003960BD /* statement.h */; };
+		B8D66BCF2125572F003960BD /* tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B032125572F003960BD /* tokenizer.h */; };
+		B8D66BD02125572F003960BD /* tokenizer.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B032125572F003960BD /* tokenizer.h */; };
+		B8D66BD12125572F003960BD /* statement.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B042125572F003960BD /* statement.cc */; };
+		B8D66BD22125572F003960BD /* statement.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B042125572F003960BD /* statement.cc */; };
+		B8D66BD32125572F003960BD /* vm.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B052125572F003960BD /* vm.cc */; };
+		B8D66BD42125572F003960BD /* vm.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B052125572F003960BD /* vm.cc */; };
+		B8D66BD52125572F003960BD /* string_table.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B062125572F003960BD /* string_table.h */; };
+		B8D66BD62125572F003960BD /* string_table.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B062125572F003960BD /* string_table.h */; };
+		B8D66BD72125572F003960BD /* ast.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B072125572F003960BD /* ast.h */; };
+		B8D66BD82125572F003960BD /* ast.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B072125572F003960BD /* ast.h */; };
+		B8D66BDD2125572F003960BD /* scanner.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0A2125572F003960BD /* scanner.h */; };
+		B8D66BDE2125572F003960BD /* scanner.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0A2125572F003960BD /* scanner.h */; };
+		B8D66BE12125572F003960BD /* handle.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0C2125572F003960BD /* handle.h */; };
+		B8D66BE22125572F003960BD /* handle.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0C2125572F003960BD /* handle.h */; };
+		B8D66BE32125572F003960BD /* exec_state.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0D2125572F003960BD /* exec_state.h */; };
+		B8D66BE42125572F003960BD /* exec_state.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0D2125572F003960BD /* exec_state.h */; };
+		B8D66BE52125572F003960BD /* object.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0E2125572F003960BD /* object.h */; };
+		B8D66BE62125572F003960BD /* object.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0E2125572F003960BD /* object.h */; };
+		B8D66BE72125572F003960BD /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0F2125572F003960BD /* table.h */; };
+		B8D66BE82125572F003960BD /* table.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B0F2125572F003960BD /* table.h */; };
+		B8D66BEB2125572F003960BD /* token.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B112125572F003960BD /* token.h */; };
+		B8D66BEC2125572F003960BD /* token.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B112125572F003960BD /* token.h */; };
+		B8D66BED2125572F003960BD /* vm.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B122125572F003960BD /* vm.h */; };
+		B8D66BEE2125572F003960BD /* vm.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B122125572F003960BD /* vm.h */; };
+		B8D66BEF2125572F003960BD /* op_code.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B132125572F003960BD /* op_code.h */; };
+		B8D66BF02125572F003960BD /* op_code.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B132125572F003960BD /* op_code.h */; };
+		B8D66BF12125572F003960BD /* ast_visitor.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B142125572F003960BD /* ast_visitor.h */; };
+		B8D66BF22125572F003960BD /* ast_visitor.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B142125572F003960BD /* ast_visitor.h */; };
+		B8D66BF32125572F003960BD /* object.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B152125572F003960BD /* object.cc */; };
+		B8D66BF42125572F003960BD /* object.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B152125572F003960BD /* object.cc */; };
+		B8D66BF52125572F003960BD /* token.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B162125572F003960BD /* token.cc */; };
+		B8D66BF62125572F003960BD /* token.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B162125572F003960BD /* token.cc */; };
+		B8D66BF92125572F003960BD /* exec_state.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B182125572F003960BD /* exec_state.cc */; };
+		B8D66BFA2125572F003960BD /* exec_state.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B182125572F003960BD /* exec_state.cc */; };
+		B8D66BFB2125572F003960BD /* render_performance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B1A2125572F003960BD /* render_performance.cpp */; };
+		B8D66BFC2125572F003960BD /* render_performance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B1A2125572F003960BD /* render_performance.cpp */; };
+		B8D66BFD2125572F003960BD /* render_performance.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B1B2125572F003960BD /* render_performance.h */; };
+		B8D66BFE2125572F003960BD /* render_performance.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B1B2125572F003960BD /* render_performance.h */; };
+		B8D66BFF2125572F003960BD /* constants_name.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B1D2125572F003960BD /* constants_name.h */; };
+		B8D66C002125572F003960BD /* constants_name.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B1D2125572F003960BD /* constants_name.h */; };
+		B8D66C012125572F003960BD /* constants_value.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B1E2125572F003960BD /* constants_value.h */; };
+		B8D66C022125572F003960BD /* constants_value.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B1E2125572F003960BD /* constants_value.h */; };
+		B8D66C032125572F003960BD /* css_value_getter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B1F2125572F003960BD /* css_value_getter.cpp */; };
+		B8D66C042125572F003960BD /* css_value_getter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B1F2125572F003960BD /* css_value_getter.cpp */; };
+		B8D66C052125572F003960BD /* css_value_getter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B202125572F003960BD /* css_value_getter.h */; };
+		B8D66C0621255730003960BD /* css_value_getter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B202125572F003960BD /* css_value_getter.h */; };
+		B8D66C0721255730003960BD /* core_environment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B222125572F003960BD /* core_environment.cpp */; };
+		B8D66C0821255730003960BD /* core_environment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B222125572F003960BD /* core_environment.cpp */; };
+		B8D66C0921255730003960BD /* core_environment.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B232125572F003960BD /* core_environment.h */; };
+		B8D66C0A21255730003960BD /* core_environment.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B232125572F003960BD /* core_environment.h */; };
+		B8D66C0B21255730003960BD /* platform_bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B252125572F003960BD /* platform_bridge.h */; };
+		B8D66C0C21255730003960BD /* platform_bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B252125572F003960BD /* platform_bridge.h */; };
+		B8D66C0D21255730003960BD /* core_side_in_platform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B272125572F003960BD /* core_side_in_platform.cpp */; };
+		B8D66C0E21255730003960BD /* core_side_in_platform.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B272125572F003960BD /* core_side_in_platform.cpp */; };
+		B8D66C0F21255730003960BD /* core_side_in_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B282125572F003960BD /* core_side_in_platform.h */; };
+		B8D66C1021255730003960BD /* core_side_in_platform.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B282125572F003960BD /* core_side_in_platform.h */; };
+		B8D66C1121255730003960BD /* core_side_in_script.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B2A2125572F003960BD /* core_side_in_script.cpp */; };
+		B8D66C1221255730003960BD /* core_side_in_script.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B2A2125572F003960BD /* core_side_in_script.cpp */; };
+		B8D66C1321255730003960BD /* core_side_in_script.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2B2125572F003960BD /* core_side_in_script.h */; };
+		B8D66C1421255730003960BD /* core_side_in_script.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2B2125572F003960BD /* core_side_in_script.h */; };
+		B8D66C1521255730003960BD /* wx_type_define.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2C2125572F003960BD /* wx_type_define.h */; };
+		B8D66C1621255730003960BD /* wx_type_define.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2C2125572F003960BD /* wx_type_define.h */; };
+		B8D66C1721255730003960BD /* script_bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2D2125572F003960BD /* script_bridge.h */; };
+		B8D66C1821255730003960BD /* script_bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2D2125572F003960BD /* script_bridge.h */; };
+		B8D66C1921255730003960BD /* measure_func_adapter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2F2125572F003960BD /* measure_func_adapter.h */; };
+		B8D66C1A21255730003960BD /* measure_func_adapter.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B2F2125572F003960BD /* measure_func_adapter.h */; };
+		B8D66C1B21255730003960BD /* style.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B302125572F003960BD /* style.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B8D66C1C21255730003960BD /* style.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B302125572F003960BD /* style.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B8D66C1D21255730003960BD /* style.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B312125572F003960BD /* style.cpp */; };
+		B8D66C1E21255730003960BD /* style.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B312125572F003960BD /* style.cpp */; };
+		B8D66C1F21255730003960BD /* layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B322125572F003960BD /* layout.cpp */; };
+		B8D66C2021255730003960BD /* layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B322125572F003960BD /* layout.cpp */; };
+		B8D66C2321255730003960BD /* layout.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B342125572F003960BD /* layout.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B8D66C2421255730003960BD /* layout.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B342125572F003960BD /* layout.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B8D66C2521255730003960BD /* flex_enum.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B352125572F003960BD /* flex_enum.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B8D66C2621255730003960BD /* flex_enum.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B352125572F003960BD /* flex_enum.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		B8D66C2721255730003960BD /* render_page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B382125572F003960BD /* render_page.cpp */; };
+		B8D66C2821255730003960BD /* render_page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B382125572F003960BD /* render_page.cpp */; };
+		B8D66C2921255730003960BD /* render_page.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B392125572F003960BD /* render_page.h */; };
+		B8D66C2A21255730003960BD /* render_page.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B392125572F003960BD /* render_page.h */; };
+		B8D66C2B21255730003960BD /* render_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B3B2125572F003960BD /* render_manager.cpp */; };
+		B8D66C2C21255730003960BD /* render_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B3B2125572F003960BD /* render_manager.cpp */; };
+		B8D66C2D21255730003960BD /* render_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B3C2125572F003960BD /* render_manager.h */; };
+		B8D66C2E21255730003960BD /* render_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B3C2125572F003960BD /* render_manager.h */; };
+		B8D66C2F21255730003960BD /* render_action_render_success.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B3E2125572F003960BD /* render_action_render_success.h */; };
+		B8D66C3021255730003960BD /* render_action_render_success.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B3E2125572F003960BD /* render_action_render_success.h */; };
+		B8D66C3121255730003960BD /* render_action_appendtree_createfinish.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B3F2125572F003960BD /* render_action_appendtree_createfinish.h */; };
+		B8D66C3221255730003960BD /* render_action_appendtree_createfinish.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B3F2125572F003960BD /* render_action_appendtree_createfinish.h */; };
+		B8D66C3321255730003960BD /* render_action_update_attr.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B402125572F003960BD /* render_action_update_attr.h */; };
+		B8D66C3421255730003960BD /* render_action_update_attr.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B402125572F003960BD /* render_action_update_attr.h */; };
+		B8D66C3521255730003960BD /* render_action_move_element.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B412125572F003960BD /* render_action_move_element.h */; };
+		B8D66C3621255730003960BD /* render_action_move_element.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B412125572F003960BD /* render_action_move_element.h */; };
+		B8D66C3721255730003960BD /* render_action_update_attr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B422125572F003960BD /* render_action_update_attr.cpp */; };
+		B8D66C3821255730003960BD /* render_action_update_attr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B422125572F003960BD /* render_action_update_attr.cpp */; };
+		B8D66C3921255730003960BD /* render_action_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B432125572F003960BD /* render_action_layout.cpp */; };
+		B8D66C3A21255730003960BD /* render_action_layout.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B432125572F003960BD /* render_action_layout.cpp */; };
+		B8D66C3B21255730003960BD /* render_action_update_style.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B442125572F003960BD /* render_action_update_style.h */; };
+		B8D66C3C21255730003960BD /* render_action_update_style.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B442125572F003960BD /* render_action_update_style.h */; };
+		B8D66C3D21255730003960BD /* render_action_createfinish.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B452125572F003960BD /* render_action_createfinish.h */; };
+		B8D66C3E21255730003960BD /* render_action_createfinish.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B452125572F003960BD /* render_action_createfinish.h */; };
+		B8D66C3F21255730003960BD /* render_action_update_style.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B462125572F003960BD /* render_action_update_style.cpp */; };
+		B8D66C4021255730003960BD /* render_action_update_style.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B462125572F003960BD /* render_action_update_style.cpp */; };
+		B8D66C4121255730003960BD /* render_action_add_event.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B472125572F003960BD /* render_action_add_event.h */; };
+		B8D66C4221255730003960BD /* render_action_add_event.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B472125572F003960BD /* render_action_add_event.h */; };
+		B8D66C4321255730003960BD /* render_action_remove_element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B482125572F003960BD /* render_action_remove_element.cpp */; };
+		B8D66C4421255730003960BD /* render_action_remove_element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B482125572F003960BD /* render_action_remove_element.cpp */; };
+		B8D66C4521255730003960BD /* render_action_createbody.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B492125572F003960BD /* render_action_createbody.h */; };
+		B8D66C4621255730003960BD /* render_action_createbody.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B492125572F003960BD /* render_action_createbody.h */; };
+		B8D66C4721255730003960BD /* render_action_add_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4A2125572F003960BD /* render_action_add_event.cpp */; };
+		B8D66C4821255730003960BD /* render_action_add_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4A2125572F003960BD /* render_action_add_event.cpp */; };
+		B8D66C4921255730003960BD /* render_action_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B4B2125572F003960BD /* render_action_interface.h */; };
+		B8D66C4A21255730003960BD /* render_action_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B4B2125572F003960BD /* render_action_interface.h */; };
+		B8D66C4B21255730003960BD /* render_action_remove_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4C2125572F003960BD /* render_action_remove_event.cpp */; };
+		B8D66C4C21255730003960BD /* render_action_remove_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4C2125572F003960BD /* render_action_remove_event.cpp */; };
+		B8D66C4D21255730003960BD /* render_action_move_element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4D2125572F003960BD /* render_action_move_element.cpp */; };
+		B8D66C4E21255730003960BD /* render_action_move_element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4D2125572F003960BD /* render_action_move_element.cpp */; };
+		B8D66C4F21255730003960BD /* render_action_add_element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4E2125572F003960BD /* render_action_add_element.cpp */; };
+		B8D66C5021255730003960BD /* render_action_add_element.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B4E2125572F003960BD /* render_action_add_element.cpp */; };
+		B8D66C5121255730003960BD /* render_action_remove_event.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B4F2125572F003960BD /* render_action_remove_event.h */; };
+		B8D66C5221255730003960BD /* render_action_remove_event.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B4F2125572F003960BD /* render_action_remove_event.h */; };
+		B8D66C5321255730003960BD /* render_action_createbody.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B502125572F003960BD /* render_action_createbody.cpp */; };
+		B8D66C5421255730003960BD /* render_action_createbody.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B502125572F003960BD /* render_action_createbody.cpp */; };
+		B8D66C5521255730003960BD /* render_action_createfinish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B512125572F003960BD /* render_action_createfinish.cpp */; };
+		B8D66C5621255730003960BD /* render_action_createfinish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B512125572F003960BD /* render_action_createfinish.cpp */; };
+		B8D66C5721255730003960BD /* render_action_layout.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B522125572F003960BD /* render_action_layout.h */; };
+		B8D66C5821255730003960BD /* render_action_layout.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B522125572F003960BD /* render_action_layout.h */; };
+		B8D66C5921255730003960BD /* render_action_remove_element.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B532125572F003960BD /* render_action_remove_element.h */; };
+		B8D66C5A21255730003960BD /* render_action_remove_element.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B532125572F003960BD /* render_action_remove_element.h */; };
+		B8D66C5B21255730003960BD /* render_action_add_element.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B542125572F003960BD /* render_action_add_element.h */; };
+		B8D66C5C21255730003960BD /* render_action_add_element.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B542125572F003960BD /* render_action_add_element.h */; };
+		B8D66C5D21255730003960BD /* render_action_appendtree_createfinish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B552125572F003960BD /* render_action_appendtree_createfinish.cpp */; };
+		B8D66C5E21255730003960BD /* render_action_appendtree_createfinish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B552125572F003960BD /* render_action_appendtree_createfinish.cpp */; };
+		B8D66C5F21255730003960BD /* render_action_render_success.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B562125572F003960BD /* render_action_render_success.cpp */; };
+		B8D66C6021255730003960BD /* render_action_render_success.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B562125572F003960BD /* render_action_render_success.cpp */; };
+		B8D66C6121255730003960BD /* render_cell.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B582125572F003960BD /* render_cell.h */; };
+		B8D66C6221255730003960BD /* render_cell.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B582125572F003960BD /* render_cell.h */; };
+		B8D66C6321255730003960BD /* render_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B592125572F003960BD /* render_text.cpp */; };
+		B8D66C6421255730003960BD /* render_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B592125572F003960BD /* render_text.cpp */; };
+		B8D66C6521255730003960BD /* render_mask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B5A2125572F003960BD /* render_mask.cpp */; };
+		B8D66C6621255730003960BD /* render_mask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B5A2125572F003960BD /* render_mask.cpp */; };
+		B8D66C6721255730003960BD /* render_scroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B5B2125572F003960BD /* render_scroller.cpp */; };
+		B8D66C6821255730003960BD /* render_scroller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B5B2125572F003960BD /* render_scroller.cpp */; };
+		B8D66C6921255730003960BD /* render_mask.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B5C2125572F003960BD /* render_mask.h */; };
+		B8D66C6A21255730003960BD /* render_mask.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B5C2125572F003960BD /* render_mask.h */; };
+		B8D66C6B21255730003960BD /* render_scroller.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B5D2125572F003960BD /* render_scroller.h */; };
+		B8D66C6C21255730003960BD /* render_scroller.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B5D2125572F003960BD /* render_scroller.h */; };
+		B8D66C6D21255730003960BD /* render_text.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B5E2125572F003960BD /* render_text.h */; };
+		B8D66C6E21255730003960BD /* render_text.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B5E2125572F003960BD /* render_text.h */; };
+		B8D66C6F21255730003960BD /* render_object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B5F2125572F003960BD /* render_object.cpp */; };
+		B8D66C7021255730003960BD /* render_object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B5F2125572F003960BD /* render_object.cpp */; };
+		B8D66C7121255730003960BD /* render_appbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B602125572F003960BD /* render_appbar.cpp */; };
+		B8D66C7221255730003960BD /* render_appbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B602125572F003960BD /* render_appbar.cpp */; };
+		B8D66C7321255730003960BD /* render_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B612125572F003960BD /* render_list.cpp */; };
+		B8D66C7421255730003960BD /* render_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B612125572F003960BD /* render_list.cpp */; };
+		B8D66C7521255730003960BD /* render_object.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B622125572F003960BD /* render_object.h */; };
+		B8D66C7621255730003960BD /* render_object.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B622125572F003960BD /* render_object.h */; };
+		B8D66C7721255730003960BD /* render_appbar.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B632125572F003960BD /* render_appbar.h */; };
+		B8D66C7821255730003960BD /* render_appbar.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B632125572F003960BD /* render_appbar.h */; };
+		B8D66C7921255730003960BD /* render_list.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B642125572F003960BD /* render_list.h */; };
+		B8D66C7A21255730003960BD /* render_list.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B642125572F003960BD /* render_list.h */; };
+		B8D66C7B21255730003960BD /* render_mask_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B662125572F003960BD /* render_mask_factory.h */; };
+		B8D66C7C21255730003960BD /* render_mask_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B662125572F003960BD /* render_mask_factory.h */; };
+		B8D66C7D21255730003960BD /* render_text_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B672125572F003960BD /* render_text_factory.h */; };
+		B8D66C7E21255730003960BD /* render_text_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B672125572F003960BD /* render_text_factory.h */; };
+		B8D66C7F21255730003960BD /* render_scroller_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B682125572F003960BD /* render_scroller_factory.h */; };
+		B8D66C8021255730003960BD /* render_scroller_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B682125572F003960BD /* render_scroller_factory.h */; };
+		B8D66C8121255730003960BD /* render_type.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B692125572F003960BD /* render_type.h */; };
+		B8D66C8221255730003960BD /* render_type.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B692125572F003960BD /* render_type.h */; };
+		B8D66C8321255730003960BD /* render_creator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B6A2125572F003960BD /* render_creator.cpp */; };
+		B8D66C8421255730003960BD /* render_creator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B6A2125572F003960BD /* render_creator.cpp */; };
+		B8D66C8521255730003960BD /* render_appbar_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6B2125572F003960BD /* render_appbar_factory.h */; };
+		B8D66C8621255730003960BD /* render_appbar_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6B2125572F003960BD /* render_appbar_factory.h */; };
+		B8D66C8721255730003960BD /* simple_render_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6C2125572F003960BD /* simple_render_factory.h */; };
+		B8D66C8821255730003960BD /* simple_render_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6C2125572F003960BD /* simple_render_factory.h */; };
+		B8D66C8921255730003960BD /* render_object_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6D2125572F003960BD /* render_object_interface.h */; };
+		B8D66C8A21255730003960BD /* render_object_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6D2125572F003960BD /* render_object_interface.h */; };
+		B8D66C8B21255730003960BD /* render_list_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6E2125572F003960BD /* render_list_factory.h */; };
+		B8D66C8C21255730003960BD /* render_list_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6E2125572F003960BD /* render_list_factory.h */; };
+		B8D66C8D21255730003960BD /* render_creator.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6F2125572F003960BD /* render_creator.h */; };
+		B8D66C8E21255730003960BD /* render_creator.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B6F2125572F003960BD /* render_creator.h */; };
+		B8D66C8F21255730003960BD /* render_cell_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B702125572F003960BD /* render_cell_factory.h */; };
+		B8D66C9021255730003960BD /* render_cell_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B702125572F003960BD /* render_cell_factory.h */; };
+		B8D66C9121255730003960BD /* render_factory_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B712125572F003960BD /* render_factory_interface.h */; };
+		B8D66C9221255730003960BD /* render_factory_interface.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B712125572F003960BD /* render_factory_interface.h */; };
+		B8D66C9321255730003960BD /* dom_wson.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B732125572F003960BD /* dom_wson.h */; };
+		B8D66C9421255730003960BD /* dom_wson.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B732125572F003960BD /* dom_wson.h */; };
+		B8D66C9521255730003960BD /* dom_wson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B742125572F003960BD /* dom_wson.cpp */; };
+		B8D66C9621255730003960BD /* dom_wson.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B742125572F003960BD /* dom_wson.cpp */; };
+		B8D66C9921255730003960BD /* weex_core_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B772125572F003960BD /* weex_core_manager.h */; };
+		B8D66C9A21255730003960BD /* weex_core_manager.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B772125572F003960BD /* weex_core_manager.h */; };
+		B8D66C9D21255730003960BD /* json11.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B7B2125572F003960BD /* json11.hpp */; };
+		B8D66C9E21255730003960BD /* json11.hpp in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B7B2125572F003960BD /* json11.hpp */; };
+		B8D66C9F21255730003960BD /* json11.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B7C2125572F003960BD /* json11.cc */; };
+		B8D66CA021255730003960BD /* json11.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B7C2125572F003960BD /* json11.cc */; };
+		B8D66CA121255730003960BD /* WeexApiHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B7E2125572F003960BD /* WeexApiHeader.h */; };
+		B8D66CA221255730003960BD /* WeexApiHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B7E2125572F003960BD /* WeexApiHeader.h */; };
+		B8D66CA321255730003960BD /* wson.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B802125572F003960BD /* wson.h */; };
+		B8D66CA421255730003960BD /* wson.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B802125572F003960BD /* wson.h */; };
+		B8D66CA721255730003960BD /* wson.c in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B822125572F003960BD /* wson.c */; };
+		B8D66CA821255730003960BD /* wson.c in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B822125572F003960BD /* wson.c */; };
+		B8D66CA921255730003960BD /* wson_util.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B832125572F003960BD /* wson_util.h */; };
+		B8D66CAA21255730003960BD /* wson_util.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B832125572F003960BD /* wson_util.h */; };
+		B8D66CAB21255730003960BD /* wson_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B842125572F003960BD /* wson_util.cpp */; };
+		B8D66CAC21255730003960BD /* wson_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B842125572F003960BD /* wson_util.cpp */; };
+		B8D66CAD21255730003960BD /* wson_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B852125572F003960BD /* wson_parser.cpp */; };
+		B8D66CAE21255730003960BD /* wson_parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B852125572F003960BD /* wson_parser.cpp */; };
+		B8D66CAF21255730003960BD /* wson_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B862125572F003960BD /* wson_parser.h */; };
+		B8D66CB021255730003960BD /* wson_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B862125572F003960BD /* wson_parser.h */; };
+		B8D66CB121255730003960BD /* TimeUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B882125572F003960BD /* TimeUtils.h */; };
+		B8D66CB221255730003960BD /* TimeUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B882125572F003960BD /* TimeUtils.h */; };
+		B8D66CB321255730003960BD /* make_copyable.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B892125572F003960BD /* make_copyable.h */; };
+		B8D66CB421255730003960BD /* make_copyable.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B892125572F003960BD /* make_copyable.h */; };
+		B8D66CB521255730003960BD /* ViewUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8A2125572F003960BD /* ViewUtils.h */; };
+		B8D66CB621255730003960BD /* ViewUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8A2125572F003960BD /* ViewUtils.h */; };
+		B8D66CB721255730003960BD /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8B2125572F003960BD /* common.h */; };
+		B8D66CB821255730003960BD /* common.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8B2125572F003960BD /* common.h */; };
+		B8D66CB921255730003960BD /* time_point.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8C2125572F003960BD /* time_point.h */; };
+		B8D66CBA21255730003960BD /* time_point.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8C2125572F003960BD /* time_point.h */; };
+		B8D66CBB21255730003960BD /* time_point.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B8D2125572F003960BD /* time_point.cc */; };
+		B8D66CBC21255730003960BD /* time_point.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B8D2125572F003960BD /* time_point.cc */; };
+		B8D66CBD21255730003960BD /* closure.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8E2125572F003960BD /* closure.h */; };
+		B8D66CBE21255730003960BD /* closure.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8E2125572F003960BD /* closure.h */; };
+		B8D66CBF21255730003960BD /* LogDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8F2125572F003960BD /* LogDefines.h */; };
+		B8D66CC021255730003960BD /* LogDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B8F2125572F003960BD /* LogDefines.h */; };
+		B8D66CC121255730003960BD /* time_unit.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B902125572F003960BD /* time_unit.h */; };
+		B8D66CC221255730003960BD /* time_unit.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B902125572F003960BD /* time_unit.h */; };
+		B8D66CC321255730003960BD /* thread_impl_posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B922125572F003960BD /* thread_impl_posix.cc */; };
+		B8D66CC421255730003960BD /* thread_impl_posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B922125572F003960BD /* thread_impl_posix.cc */; };
+		B8D66CC521255730003960BD /* thread_local.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B932125572F003960BD /* thread_local.h */; };
+		B8D66CC621255730003960BD /* thread_local.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B932125572F003960BD /* thread_local.h */; };
+		B8D66CC921255730003960BD /* thread_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B952125572F003960BD /* thread_impl.h */; };
+		B8D66CCA21255730003960BD /* thread_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B952125572F003960BD /* thread_impl.h */; };
+		B8D66CCB21255730003960BD /* thread_impl_darwin.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B962125572F003960BD /* thread_impl_darwin.cc */; };
+		B8D66CCC21255730003960BD /* thread_impl_darwin.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B962125572F003960BD /* thread_impl_darwin.cc */; };
+		B8D66CCD21255730003960BD /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B972125572F003960BD /* thread.h */; };
+		B8D66CCE21255730003960BD /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B972125572F003960BD /* thread.h */; };
+		B8D66CCF21255730003960BD /* waitable_event.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B982125572F003960BD /* waitable_event.h */; };
+		B8D66CD021255730003960BD /* waitable_event.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B982125572F003960BD /* waitable_event.h */; };
+		B8D66CD121255730003960BD /* thread_impl_darwin.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B992125572F003960BD /* thread_impl_darwin.h */; };
+		B8D66CD221255730003960BD /* thread_impl_darwin.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B992125572F003960BD /* thread_impl_darwin.h */; };
+		B8D66CD321255730003960BD /* thread_impl_posix.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B9A2125572F003960BD /* thread_impl_posix.h */; };
+		B8D66CD421255730003960BD /* thread_impl_posix.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B9A2125572F003960BD /* thread_impl_posix.h */; };
+		B8D66CD721255730003960BD /* CoreConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B9C2125572F003960BD /* CoreConstants.h */; };
+		B8D66CD821255730003960BD /* CoreConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66B9C2125572F003960BD /* CoreConstants.h */; };
+		B8D66CD921255730003960BD /* message_pump_posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B9E2125572F003960BD /* message_pump_posix.cc */; };
+		B8D66CDA21255730003960BD /* message_pump_posix.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66B9E2125572F003960BD /* message_pump_posix.cc */; };
+		B8D66CDD21255730003960BD /* message_loop.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA02125572F003960BD /* message_loop.h */; };
+		B8D66CDE21255730003960BD /* message_loop.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA02125572F003960BD /* message_loop.h */; };
+		B8D66CDF21255730003960BD /* message_loop.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66BA12125572F003960BD /* message_loop.cc */; };
+		B8D66CE021255730003960BD /* message_loop.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66BA12125572F003960BD /* message_loop.cc */; };
+		B8D66CE121255730003960BD /* message_pump_darwin.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66BA22125572F003960BD /* message_pump_darwin.cc */; };
+		B8D66CE221255730003960BD /* message_pump_darwin.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8D66BA22125572F003960BD /* message_pump_darwin.cc */; };
+		B8D66CE521255730003960BD /* message_pump.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA42125572F003960BD /* message_pump.h */; };
+		B8D66CE621255730003960BD /* message_pump.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA42125572F003960BD /* message_pump.h */; };
+		B8D66CE721255730003960BD /* message_pump_posix.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA52125572F003960BD /* message_pump_posix.h */; };
+		B8D66CE821255730003960BD /* message_pump_posix.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA52125572F003960BD /* message_pump_posix.h */; };
+		B8D66CE921255730003960BD /* message_pump_darwin.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA62125572F003960BD /* message_pump_darwin.h */; };
+		B8D66CEA21255730003960BD /* message_pump_darwin.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D66BA62125572F003960BD /* message_pump_darwin.h */; };
+		B8D66CEB21255B2A003960BD /* WXWebSocketLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012841E150307003378D0 /* WXWebSocketLoader.h */; };
+		B8F2C6E42133A83C00635B37 /* rax_source_locator.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6CD2133A83900635B37 /* rax_source_locator.h */; };
+		B8F2C6E52133A83C00635B37 /* rax_source_locator.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6CD2133A83900635B37 /* rax_source_locator.h */; };
+		B8F2C6E62133A83C00635B37 /* common_error.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6CE2133A83A00635B37 /* common_error.h */; };
+		B8F2C6E72133A83C00635B37 /* common_error.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6CE2133A83A00635B37 /* common_error.h */; };
+		B8F2C6E82133A83C00635B37 /* class_array.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6CF2133A83A00635B37 /* class_array.h */; };
+		B8F2C6E92133A83C00635B37 /* class_array.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6CF2133A83A00635B37 /* class_array.h */; };
+		B8F2C6EA2133A83C00635B37 /* rax_source_locator.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D02133A83A00635B37 /* rax_source_locator.cc */; };
+		B8F2C6EB2133A83C00635B37 /* rax_source_locator.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D02133A83A00635B37 /* rax_source_locator.cc */; };
+		B8F2C6EC2133A83C00635B37 /* rax_jsx_ast.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6D12133A83A00635B37 /* rax_jsx_ast.h */; };
+		B8F2C6ED2133A83C00635B37 /* rax_jsx_ast.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6D12133A83A00635B37 /* rax_jsx_ast.h */; };
+		B8F2C6EE2133A83C00635B37 /* class.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6D22133A83A00635B37 /* class.h */; };
+		B8F2C6EF2133A83C00635B37 /* class.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6D22133A83A00635B37 /* class.h */; };
+		B8F2C6F02133A83C00635B37 /* rax_jsx_ast.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D32133A83A00635B37 /* rax_jsx_ast.cc */; };
+		B8F2C6F12133A83C00635B37 /* rax_jsx_ast.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D32133A83A00635B37 /* rax_jsx_ast.cc */; };
+		B8F2C6F22133A83C00635B37 /* class_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D42133A83A00635B37 /* class_factory.cc */; };
+		B8F2C6F32133A83C00635B37 /* class_factory.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D42133A83A00635B37 /* class_factory.cc */; };
+		B8F2C6F42133A83C00635B37 /* rax_parser_statistics.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D52133A83A00635B37 /* rax_parser_statistics.cc */; };
+		B8F2C6F52133A83C00635B37 /* rax_parser_statistics.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D52133A83A00635B37 /* rax_parser_statistics.cc */; };
+		B8F2C6F62133A83C00635B37 /* rax_parser_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D62133A83B00635B37 /* rax_parser_context.cc */; };
+		B8F2C6F72133A83C00635B37 /* rax_parser_context.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D62133A83B00635B37 /* rax_parser_context.cc */; };
+		B8F2C6F82133A83C00635B37 /* class.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D72133A83B00635B37 /* class.cc */; };
+		B8F2C6F92133A83C00635B37 /* class.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D72133A83B00635B37 /* class.cc */; };
+		B8F2C6FA2133A83C00635B37 /* class_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6D82133A83B00635B37 /* class_factory.h */; };
+		B8F2C6FB2133A83C00635B37 /* class_factory.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6D82133A83B00635B37 /* class_factory.h */; };
+		B8F2C6FC2133A83C00635B37 /* rax_parser_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D92133A83B00635B37 /* rax_parser_builder.cc */; };
+		B8F2C6FD2133A83C00635B37 /* rax_parser_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6D92133A83B00635B37 /* rax_parser_builder.cc */; };
+		B8F2C6FE2133A83C00635B37 /* rax_parser_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DA2133A83B00635B37 /* rax_parser_builder.h */; };
+		B8F2C6FF2133A83C00635B37 /* rax_parser_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DA2133A83B00635B37 /* rax_parser_builder.h */; };
+		B8F2C7002133A83C00635B37 /* ast_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DB2133A83B00635B37 /* ast_builder.h */; };
+		B8F2C7012133A83C00635B37 /* ast_builder.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DB2133A83B00635B37 /* ast_builder.h */; };
+		B8F2C7022133A83C00635B37 /* rax_parser_scope.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DC2133A83B00635B37 /* rax_parser_scope.h */; };
+		B8F2C7032133A83C00635B37 /* rax_parser_scope.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DC2133A83B00635B37 /* rax_parser_scope.h */; };
+		B8F2C7042133A83C00635B37 /* class_array.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6DD2133A83B00635B37 /* class_array.cc */; };
+		B8F2C7052133A83C00635B37 /* class_array.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6DD2133A83B00635B37 /* class_array.cc */; };
+		B8F2C7062133A83C00635B37 /* rax_parser_scope.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6DE2133A83B00635B37 /* rax_parser_scope.cc */; };
+		B8F2C7072133A83C00635B37 /* rax_parser_scope.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6DE2133A83B00635B37 /* rax_parser_scope.cc */; };
+		B8F2C7082133A83C00635B37 /* rax_parser_context.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DF2133A83B00635B37 /* rax_parser_context.h */; };
+		B8F2C7092133A83C00635B37 /* rax_parser_context.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6DF2133A83B00635B37 /* rax_parser_context.h */; };
+		B8F2C70A2133A83C00635B37 /* rax_parser_statistics.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6E02133A83B00635B37 /* rax_parser_statistics.h */; };
+		B8F2C70B2133A83C00635B37 /* rax_parser_statistics.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6E02133A83B00635B37 /* rax_parser_statistics.h */; };
+		B8F2C70C2133A83C00635B37 /* rax_parser.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6E12133A83C00635B37 /* rax_parser.cc */; };
+		B8F2C70D2133A83C00635B37 /* rax_parser.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6E12133A83C00635B37 /* rax_parser.cc */; };
+		B8F2C70E2133A83C00635B37 /* rax_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6E22133A83C00635B37 /* rax_parser.h */; };
+		B8F2C70F2133A83C00635B37 /* rax_parser.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C6E22133A83C00635B37 /* rax_parser.h */; };
+		B8F2C7102133A83C00635B37 /* ast_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6E32133A83C00635B37 /* ast_builder.cc */; };
+		B8F2C7112133A83C00635B37 /* ast_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = B8F2C6E32133A83C00635B37 /* ast_builder.cc */; };
+		B8F2C7142133A8BC00635B37 /* vm_monitor.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C7132133A8BC00635B37 /* vm_monitor.h */; };
+		B8F2C7152133A8BC00635B37 /* vm_monitor.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F2C7132133A8BC00635B37 /* vm_monitor.h */; };
+		B8F3323C2141A4C600701BA0 /* string_util.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F3323B2141A4C500701BA0 /* string_util.h */; };
+		B8F3323D2141A4C600701BA0 /* string_util.h in Headers */ = {isa = PBXBuildFile; fileRef = B8F3323B2141A4C500701BA0 /* string_util.h */; };
 		BA5F00F11FC5AFFE00F76B5C /* WXLocaleModule.h in Headers */ = {isa = PBXBuildFile; fileRef = BA5F00EF1FC5AFFE00F76B5C /* WXLocaleModule.h */; };
 		BA5F00F21FC5AFFE00F76B5C /* WXLocaleModule.m in Sources */ = {isa = PBXBuildFile; fileRef = BA5F00F01FC5AFFE00F76B5C /* WXLocaleModule.m */; };
 		BA5F00F31FC6834900F76B5C /* WXLocaleModule.h in Headers */ = {isa = PBXBuildFile; fileRef = BA5F00EF1FC5AFFE00F76B5C /* WXLocaleModule.h */; };
@@ -337,7 +699,6 @@
 		C4F012831E1502E9003378D0 /* WXWebSocketModule.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012811E1502E9003378D0 /* WXWebSocketModule.m */; };
 		C4F012861E150307003378D0 /* WXWebSocketLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = C4F012841E150307003378D0 /* WXWebSocketLoader.h */; };
 		C4F012871E150307003378D0 /* WXWebSocketLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = C4F012851E150307003378D0 /* WXWebSocketLoader.m */; };
-		D0E6624F20FDD1BC00AF8914 /* WXRecyclerComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 745B2D601E5A8E1E0092D38A /* WXRecyclerComponent.h */; };
 		D312CE3B1C730DEB00046D68 /* WXWebComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = D312CE391C730DEB00046D68 /* WXWebComponent.h */; };
 		D312CE3C1C730DEB00046D68 /* WXWebComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = D312CE3A1C730DEB00046D68 /* WXWebComponent.m */; };
 		D317338C1C57257000BB7539 /* WXTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = D317338A1C57257000BB7539 /* WXTransform.h */; };
@@ -449,8 +810,6 @@
 		DCA445841EFA55B300D0CFA8 /* WXModuleMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 74862F7C1E03A0F300B7A041 /* WXModuleMethod.m */; };
 		DCA445851EFA55B300D0CFA8 /* WXComponentMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 74862F801E03A24500B7A041 /* WXComponentMethod.m */; };
 		DCA445861EFA55B300D0CFA8 /* WXCallJSMethod.m in Sources */ = {isa = PBXBuildFile; fileRef = 74D2051F1E091B8000128F44 /* WXCallJSMethod.m */; };
-		DCA445881EFA55B300D0CFA8 /* WXBridgeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A582FB1CF5B17B0081FD3E /* WXBridgeContext.m */; };
-		DCA445891EFA55B300D0CFA8 /* WXJSCoreBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 77D1613B1C02DEA60010B15B /* WXJSCoreBridge.m */; };
 		DCA4458A1EFA55B300D0CFA8 /* WXPolyfillSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 74AD99831D5B0E59008F0336 /* WXPolyfillSet.m */; };
 		DCA4458B1EFA55B300D0CFA8 /* JSValue+Weex.m in Sources */ = {isa = PBXBuildFile; fileRef = 74862F781E02B88D00B7A041 /* JSValue+Weex.m */; };
 		DCA4458C1EFA55B300D0CFA8 /* WXServiceFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 740451E91E14BB26004157CB /* WXServiceFactory.m */; };
@@ -665,13 +1024,6 @@
 		17C74F092072145000AB4CAB /* WXAnalyzerCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXAnalyzerCenter.h; sourceTree = "<group>"; };
 		17C74F0A2072145100AB4CAB /* WXAnalyzerCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXAnalyzerCenter.m; sourceTree = "<group>"; };
 		17C74F0E2072147A00AB4CAB /* WXAnalyzerProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXAnalyzerProtocol.h; sourceTree = "<group>"; };
-		17C7B4FE20452E1700A2296A /* WXCoreLayout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WXCoreLayout.cpp; path = Layout/WXCoreLayout.cpp; sourceTree = "<group>"; };
-		17C7B4FF20452E1800A2296A /* WXScrollerComponent+Layout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = "WXScrollerComponent+Layout.mm"; path = "Layout/WXScrollerComponent+Layout.mm"; sourceTree = "<group>"; };
-		17C7B50020452E1800A2296A /* WXScrollerComponent+Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "WXScrollerComponent+Layout.h"; path = "Layout/WXScrollerComponent+Layout.h"; sourceTree = "<group>"; };
-		17C7B50120452E1800A2296A /* WXCoreStyle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WXCoreStyle.cpp; path = Layout/WXCoreStyle.cpp; sourceTree = "<group>"; };
-		17C7B50220452E1800A2296A /* WXCoreFlexEnum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXCoreFlexEnum.h; path = Layout/WXCoreFlexEnum.h; sourceTree = "<group>"; };
-		17C7B50320452E1800A2296A /* WXCoreStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXCoreStyle.h; path = Layout/WXCoreStyle.h; sourceTree = "<group>"; };
-		17C7B50420452E1800A2296A /* WXCoreLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WXCoreLayout.h; path = Layout/WXCoreLayout.h; sourceTree = "<group>"; };
 		1C1A2BEC1D91172800539AA1 /* WXConvertTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXConvertTests.m; sourceTree = "<group>"; };
 		1D3000EF1D40B9AB004F3B4F /* WXClipboardModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXClipboardModule.h; sourceTree = "<group>"; };
 		1D3000F01D40B9AB004F3B4F /* WXClipboardModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXClipboardModule.m; sourceTree = "<group>"; };
@@ -704,6 +1056,10 @@
 		333D9A261F41507A007CED39 /* WXTransition.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WXTransition.mm; sourceTree = "<group>"; };
 		37B51EE21E97804D0040A743 /* WXCycleSliderComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXCycleSliderComponent.h; sourceTree = "<group>"; };
 		37B51EE31E97804D0040A743 /* WXCycleSliderComponent.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WXCycleSliderComponent.mm; sourceTree = "<group>"; };
+		45326708213FC84900DAA620 /* WXDisplayLinkManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXDisplayLinkManager.h; sourceTree = "<group>"; };
+		45326709213FC84900DAA620 /* WXDisplayLinkManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXDisplayLinkManager.m; sourceTree = "<group>"; };
+		453267122140E38900DAA620 /* vcomponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vcomponent.h; sourceTree = "<group>"; };
+		453267132140E38900DAA620 /* vcomponent.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vcomponent.cc; sourceTree = "<group>"; };
 		591324A21D49B7F1004E89ED /* WXTimerModuleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXTimerModuleTests.m; sourceTree = "<group>"; };
 		591DD32F1D23AD5800BE8709 /* WXErrorView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXErrorView.m; sourceTree = "<group>"; };
 		591DD3301D23AD5800BE8709 /* WXErrorView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXErrorView.h; sourceTree = "<group>"; };
@@ -719,7 +1075,6 @@
 		5996BD741D4D8A0E00C0FEA6 /* WXSDKEngineTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXSDKEngineTests.m; sourceTree = "<group>"; };
 		59A582D31CF481110081FD3E /* WXAppMonitorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXAppMonitorProtocol.h; sourceTree = "<group>"; };
 		59A582FA1CF5B17B0081FD3E /* WXBridgeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXBridgeContext.h; sourceTree = "<group>"; };
-		59A582FB1CF5B17B0081FD3E /* WXBridgeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBridgeContext.m; sourceTree = "<group>"; };
 		59A583041CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXNavigationDefaultImpl.h; sourceTree = "<group>"; };
 		59A583051CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXNavigationDefaultImpl.m; sourceTree = "<group>"; };
 		59A596171CB630E50012CD52 /* WXNavigationProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXNavigationProtocol.h; sourceTree = "<group>"; };
@@ -889,7 +1244,6 @@
 		77D161361C02DE940010B15B /* WXBridgeManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXBridgeManager.h; sourceTree = "<group>"; };
 		77D161371C02DE940010B15B /* WXBridgeManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBridgeManager.m; sourceTree = "<group>"; };
 		77D1613A1C02DEA60010B15B /* WXJSCoreBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXJSCoreBridge.h; sourceTree = "<group>"; };
-		77D1613B1C02DEA60010B15B /* WXJSCoreBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXJSCoreBridge.m; sourceTree = "<group>"; };
 		77D161421C02DEE40010B15B /* WXBridgeProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXBridgeProtocol.h; sourceTree = "<group>"; };
 		77D161491C02E3790010B15B /* WXConvert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXConvert.h; sourceTree = "<group>"; };
 		77D1614A1C02E3790010B15B /* WXConvert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXConvert.m; sourceTree = "<group>"; };
@@ -913,6 +1267,189 @@
 		841CD1041F97399C0081196D /* WXExceptionUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WXExceptionUtils.h; sourceTree = "<group>"; };
 		9B9E74771FA2DB5800DAAEA9 /* WXTestBridgeMethodDummy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXTestBridgeMethodDummy.h; sourceTree = "<group>"; };
 		9B9E74781FA2DB5800DAAEA9 /* WXTestBridgeMethodDummy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXTestBridgeMethodDummy.m; sourceTree = "<group>"; };
+		B8394F3521468AF100CA1EFF /* render_action_trigger_vsync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_trigger_vsync.h; sourceTree = "<group>"; };
+		B8394F3621468AF100CA1EFF /* render_action_trigger_vsync.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_trigger_vsync.cpp; sourceTree = "<group>"; };
+		B863DF312107307F00EA887D /* WXBridgeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXBridgeContext.m; sourceTree = "<group>"; };
+		B89543ED20EB18B4006EAD63 /* WXCoreBridge.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WXCoreBridge.mm; sourceTree = "<group>"; };
+		B89543EE20EB18B4006EAD63 /* WXJSCoreBridge.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WXJSCoreBridge.mm; sourceTree = "<group>"; };
+		B89543EF20EB18B4006EAD63 /* WXCoreBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXCoreBridge.h; sourceTree = "<group>"; };
+		B8A72C96213F8BAD0024E7BE /* class_json.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class_json.h; sourceTree = "<group>"; };
+		B8A72C97213F8BAD0024E7BE /* class_string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class_string.h; sourceTree = "<group>"; };
+		B8A72C98213F8BAD0024E7BE /* class_json.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = class_json.cc; sourceTree = "<group>"; };
+		B8A72C99213F8BAD0024E7BE /* class_string.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = class_string.cc; sourceTree = "<group>"; };
+		B8D66AEE2125572F003960BD /* string_table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = string_table.cc; sourceTree = "<group>"; };
+		B8D66AEF2125572F003960BD /* table.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = table.cc; sourceTree = "<group>"; };
+		B8D66AF02125572F003960BD /* code_generator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = code_generator.h; sourceTree = "<group>"; };
+		B8D66AF12125572F003960BD /* code_generator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = code_generator.cc; sourceTree = "<group>"; };
+		B8D66AF22125572F003960BD /* ast_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ast_factory.cc; sourceTree = "<group>"; };
+		B8D66AF32125572F003960BD /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = "<group>"; };
+		B8D66AF42125572F003960BD /* parser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser.cc; sourceTree = "<group>"; };
+		B8D66AF62125572F003960BD /* vnode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vnode.h; sourceTree = "<group>"; };
+		B8D66AF72125572F003960BD /* vnode_exec_env.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vnode_exec_env.cc; sourceTree = "<group>"; };
+		B8D66AF82125572F003960BD /* vnode.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vnode.cc; sourceTree = "<group>"; };
+		B8D66AF92125572F003960BD /* vnode_render_context.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vnode_render_context.cc; sourceTree = "<group>"; };
+		B8D66AFA2125572F003960BD /* vnode_exec_env.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vnode_exec_env.h; sourceTree = "<group>"; };
+		B8D66AFB2125572F003960BD /* vnode_render_manager.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vnode_render_manager.cc; sourceTree = "<group>"; };
+		B8D66AFC2125572F003960BD /* vnode_render_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vnode_render_manager.h; sourceTree = "<group>"; };
+		B8D66AFD2125572F003960BD /* vnode_render_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vnode_render_context.h; sourceTree = "<group>"; };
+		B8D66AFE2125572F003960BD /* tokenizer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tokenizer.cc; sourceTree = "<group>"; };
+		B8D66AFF2125572F003960BD /* ast_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast_factory.h; sourceTree = "<group>"; };
+		B8D66B002125572F003960BD /* ast.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ast.cc; sourceTree = "<group>"; };
+		B8D66B022125572F003960BD /* statement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = statement.h; sourceTree = "<group>"; };
+		B8D66B032125572F003960BD /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tokenizer.h; sourceTree = "<group>"; };
+		B8D66B042125572F003960BD /* statement.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = statement.cc; sourceTree = "<group>"; };
+		B8D66B052125572F003960BD /* vm.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vm.cc; sourceTree = "<group>"; };
+		B8D66B062125572F003960BD /* string_table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_table.h; sourceTree = "<group>"; };
+		B8D66B072125572F003960BD /* ast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast.h; sourceTree = "<group>"; };
+		B8D66B0A2125572F003960BD /* scanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scanner.h; sourceTree = "<group>"; };
+		B8D66B0C2125572F003960BD /* handle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = handle.h; sourceTree = "<group>"; };
+		B8D66B0D2125572F003960BD /* exec_state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exec_state.h; sourceTree = "<group>"; };
+		B8D66B0E2125572F003960BD /* object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = object.h; sourceTree = "<group>"; };
+		B8D66B0F2125572F003960BD /* table.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = table.h; sourceTree = "<group>"; };
+		B8D66B112125572F003960BD /* token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = token.h; sourceTree = "<group>"; };
+		B8D66B122125572F003960BD /* vm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vm.h; sourceTree = "<group>"; };
+		B8D66B132125572F003960BD /* op_code.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = op_code.h; sourceTree = "<group>"; };
+		B8D66B142125572F003960BD /* ast_visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast_visitor.h; sourceTree = "<group>"; };
+		B8D66B152125572F003960BD /* object.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = object.cc; sourceTree = "<group>"; };
+		B8D66B162125572F003960BD /* token.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = token.cc; sourceTree = "<group>"; };
+		B8D66B182125572F003960BD /* exec_state.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = exec_state.cc; sourceTree = "<group>"; };
+		B8D66B1A2125572F003960BD /* render_performance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_performance.cpp; sourceTree = "<group>"; };
+		B8D66B1B2125572F003960BD /* render_performance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_performance.h; sourceTree = "<group>"; };
+		B8D66B1D2125572F003960BD /* constants_name.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants_name.h; sourceTree = "<group>"; };
+		B8D66B1E2125572F003960BD /* constants_value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = constants_value.h; sourceTree = "<group>"; };
+		B8D66B1F2125572F003960BD /* css_value_getter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = css_value_getter.cpp; sourceTree = "<group>"; };
+		B8D66B202125572F003960BD /* css_value_getter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = css_value_getter.h; sourceTree = "<group>"; };
+		B8D66B222125572F003960BD /* core_environment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_environment.cpp; sourceTree = "<group>"; };
+		B8D66B232125572F003960BD /* core_environment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core_environment.h; sourceTree = "<group>"; };
+		B8D66B252125572F003960BD /* platform_bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform_bridge.h; sourceTree = "<group>"; };
+		B8D66B272125572F003960BD /* core_side_in_platform.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_side_in_platform.cpp; sourceTree = "<group>"; };
+		B8D66B282125572F003960BD /* core_side_in_platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core_side_in_platform.h; sourceTree = "<group>"; };
+		B8D66B2A2125572F003960BD /* core_side_in_script.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = core_side_in_script.cpp; sourceTree = "<group>"; };
+		B8D66B2B2125572F003960BD /* core_side_in_script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core_side_in_script.h; sourceTree = "<group>"; };
+		B8D66B2C2125572F003960BD /* wx_type_define.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wx_type_define.h; sourceTree = "<group>"; };
+		B8D66B2D2125572F003960BD /* script_bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = script_bridge.h; sourceTree = "<group>"; };
+		B8D66B2F2125572F003960BD /* measure_func_adapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = measure_func_adapter.h; sourceTree = "<group>"; };
+		B8D66B302125572F003960BD /* style.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = style.h; sourceTree = "<group>"; };
+		B8D66B312125572F003960BD /* style.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = style.cpp; sourceTree = "<group>"; };
+		B8D66B322125572F003960BD /* layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = layout.cpp; sourceTree = "<group>"; };
+		B8D66B342125572F003960BD /* layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layout.h; sourceTree = "<group>"; };
+		B8D66B352125572F003960BD /* flex_enum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = flex_enum.h; sourceTree = "<group>"; };
+		B8D66B382125572F003960BD /* render_page.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_page.cpp; sourceTree = "<group>"; };
+		B8D66B392125572F003960BD /* render_page.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_page.h; sourceTree = "<group>"; };
+		B8D66B3B2125572F003960BD /* render_manager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_manager.cpp; sourceTree = "<group>"; };
+		B8D66B3C2125572F003960BD /* render_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_manager.h; sourceTree = "<group>"; };
+		B8D66B3E2125572F003960BD /* render_action_render_success.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_render_success.h; sourceTree = "<group>"; };
+		B8D66B3F2125572F003960BD /* render_action_appendtree_createfinish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_appendtree_createfinish.h; sourceTree = "<group>"; };
+		B8D66B402125572F003960BD /* render_action_update_attr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_update_attr.h; sourceTree = "<group>"; };
+		B8D66B412125572F003960BD /* render_action_move_element.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_move_element.h; sourceTree = "<group>"; };
+		B8D66B422125572F003960BD /* render_action_update_attr.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_update_attr.cpp; sourceTree = "<group>"; };
+		B8D66B432125572F003960BD /* render_action_layout.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_layout.cpp; sourceTree = "<group>"; };
+		B8D66B442125572F003960BD /* render_action_update_style.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_update_style.h; sourceTree = "<group>"; };
+		B8D66B452125572F003960BD /* render_action_createfinish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_createfinish.h; sourceTree = "<group>"; };
+		B8D66B462125572F003960BD /* render_action_update_style.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_update_style.cpp; sourceTree = "<group>"; };
+		B8D66B472125572F003960BD /* render_action_add_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_add_event.h; sourceTree = "<group>"; };
+		B8D66B482125572F003960BD /* render_action_remove_element.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_remove_element.cpp; sourceTree = "<group>"; };
+		B8D66B492125572F003960BD /* render_action_createbody.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_createbody.h; sourceTree = "<group>"; };
+		B8D66B4A2125572F003960BD /* render_action_add_event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_add_event.cpp; sourceTree = "<group>"; };
+		B8D66B4B2125572F003960BD /* render_action_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_interface.h; sourceTree = "<group>"; };
+		B8D66B4C2125572F003960BD /* render_action_remove_event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_remove_event.cpp; sourceTree = "<group>"; };
+		B8D66B4D2125572F003960BD /* render_action_move_element.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_move_element.cpp; sourceTree = "<group>"; };
+		B8D66B4E2125572F003960BD /* render_action_add_element.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_add_element.cpp; sourceTree = "<group>"; };
+		B8D66B4F2125572F003960BD /* render_action_remove_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_remove_event.h; sourceTree = "<group>"; };
+		B8D66B502125572F003960BD /* render_action_createbody.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_createbody.cpp; sourceTree = "<group>"; };
+		B8D66B512125572F003960BD /* render_action_createfinish.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_createfinish.cpp; sourceTree = "<group>"; };
+		B8D66B522125572F003960BD /* render_action_layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_layout.h; sourceTree = "<group>"; };
+		B8D66B532125572F003960BD /* render_action_remove_element.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_remove_element.h; sourceTree = "<group>"; };
+		B8D66B542125572F003960BD /* render_action_add_element.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_action_add_element.h; sourceTree = "<group>"; };
+		B8D66B552125572F003960BD /* render_action_appendtree_createfinish.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_appendtree_createfinish.cpp; sourceTree = "<group>"; };
+		B8D66B562125572F003960BD /* render_action_render_success.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_action_render_success.cpp; sourceTree = "<group>"; };
+		B8D66B582125572F003960BD /* render_cell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_cell.h; sourceTree = "<group>"; };
+		B8D66B592125572F003960BD /* render_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_text.cpp; sourceTree = "<group>"; };
+		B8D66B5A2125572F003960BD /* render_mask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_mask.cpp; sourceTree = "<group>"; };
+		B8D66B5B2125572F003960BD /* render_scroller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_scroller.cpp; sourceTree = "<group>"; };
+		B8D66B5C2125572F003960BD /* render_mask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_mask.h; sourceTree = "<group>"; };
+		B8D66B5D2125572F003960BD /* render_scroller.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_scroller.h; sourceTree = "<group>"; };
+		B8D66B5E2125572F003960BD /* render_text.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_text.h; sourceTree = "<group>"; };
+		B8D66B5F2125572F003960BD /* render_object.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_object.cpp; sourceTree = "<group>"; };
+		B8D66B602125572F003960BD /* render_appbar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_appbar.cpp; sourceTree = "<group>"; };
+		B8D66B612125572F003960BD /* render_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_list.cpp; sourceTree = "<group>"; };
+		B8D66B622125572F003960BD /* render_object.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_object.h; sourceTree = "<group>"; };
+		B8D66B632125572F003960BD /* render_appbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_appbar.h; sourceTree = "<group>"; };
+		B8D66B642125572F003960BD /* render_list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_list.h; sourceTree = "<group>"; };
+		B8D66B662125572F003960BD /* render_mask_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_mask_factory.h; sourceTree = "<group>"; };
+		B8D66B672125572F003960BD /* render_text_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_text_factory.h; sourceTree = "<group>"; };
+		B8D66B682125572F003960BD /* render_scroller_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_scroller_factory.h; sourceTree = "<group>"; };
+		B8D66B692125572F003960BD /* render_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_type.h; sourceTree = "<group>"; };
+		B8D66B6A2125572F003960BD /* render_creator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = render_creator.cpp; sourceTree = "<group>"; };
+		B8D66B6B2125572F003960BD /* render_appbar_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_appbar_factory.h; sourceTree = "<group>"; };
+		B8D66B6C2125572F003960BD /* simple_render_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = simple_render_factory.h; sourceTree = "<group>"; };
+		B8D66B6D2125572F003960BD /* render_object_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_object_interface.h; sourceTree = "<group>"; };
+		B8D66B6E2125572F003960BD /* render_list_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_list_factory.h; sourceTree = "<group>"; };
+		B8D66B6F2125572F003960BD /* render_creator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_creator.h; sourceTree = "<group>"; };
+		B8D66B702125572F003960BD /* render_cell_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_cell_factory.h; sourceTree = "<group>"; };
+		B8D66B712125572F003960BD /* render_factory_interface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render_factory_interface.h; sourceTree = "<group>"; };
+		B8D66B732125572F003960BD /* dom_wson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dom_wson.h; sourceTree = "<group>"; };
+		B8D66B742125572F003960BD /* dom_wson.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dom_wson.cpp; sourceTree = "<group>"; };
+		B8D66B772125572F003960BD /* weex_core_manager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = weex_core_manager.h; sourceTree = "<group>"; };
+		B8D66B7B2125572F003960BD /* json11.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = json11.hpp; sourceTree = "<group>"; };
+		B8D66B7C2125572F003960BD /* json11.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = json11.cc; sourceTree = "<group>"; };
+		B8D66B7E2125572F003960BD /* WeexApiHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeexApiHeader.h; sourceTree = "<group>"; };
+		B8D66B802125572F003960BD /* wson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wson.h; sourceTree = "<group>"; };
+		B8D66B822125572F003960BD /* wson.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wson.c; sourceTree = "<group>"; };
+		B8D66B832125572F003960BD /* wson_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wson_util.h; sourceTree = "<group>"; };
+		B8D66B842125572F003960BD /* wson_util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wson_util.cpp; sourceTree = "<group>"; };
+		B8D66B852125572F003960BD /* wson_parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wson_parser.cpp; sourceTree = "<group>"; };
+		B8D66B862125572F003960BD /* wson_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wson_parser.h; sourceTree = "<group>"; };
+		B8D66B882125572F003960BD /* TimeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeUtils.h; sourceTree = "<group>"; };
+		B8D66B892125572F003960BD /* make_copyable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = make_copyable.h; sourceTree = "<group>"; };
+		B8D66B8A2125572F003960BD /* ViewUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewUtils.h; sourceTree = "<group>"; };
+		B8D66B8B2125572F003960BD /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
+		B8D66B8C2125572F003960BD /* time_point.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time_point.h; sourceTree = "<group>"; };
+		B8D66B8D2125572F003960BD /* time_point.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time_point.cc; sourceTree = "<group>"; };
+		B8D66B8E2125572F003960BD /* closure.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = closure.h; sourceTree = "<group>"; };
+		B8D66B8F2125572F003960BD /* LogDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LogDefines.h; sourceTree = "<group>"; };
+		B8D66B902125572F003960BD /* time_unit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time_unit.h; sourceTree = "<group>"; };
+		B8D66B922125572F003960BD /* thread_impl_posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread_impl_posix.cc; sourceTree = "<group>"; };
+		B8D66B932125572F003960BD /* thread_local.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_local.h; sourceTree = "<group>"; };
+		B8D66B952125572F003960BD /* thread_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_impl.h; sourceTree = "<group>"; };
+		B8D66B962125572F003960BD /* thread_impl_darwin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread_impl_darwin.cc; sourceTree = "<group>"; };
+		B8D66B972125572F003960BD /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread.h; sourceTree = "<group>"; };
+		B8D66B982125572F003960BD /* waitable_event.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = waitable_event.h; sourceTree = "<group>"; };
+		B8D66B992125572F003960BD /* thread_impl_darwin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_impl_darwin.h; sourceTree = "<group>"; };
+		B8D66B9A2125572F003960BD /* thread_impl_posix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_impl_posix.h; sourceTree = "<group>"; };
+		B8D66B9C2125572F003960BD /* CoreConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreConstants.h; sourceTree = "<group>"; };
+		B8D66B9E2125572F003960BD /* message_pump_posix.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = message_pump_posix.cc; sourceTree = "<group>"; };
+		B8D66BA02125572F003960BD /* message_loop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = message_loop.h; sourceTree = "<group>"; };
+		B8D66BA12125572F003960BD /* message_loop.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = message_loop.cc; sourceTree = "<group>"; };
+		B8D66BA22125572F003960BD /* message_pump_darwin.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = message_pump_darwin.cc; sourceTree = "<group>"; };
+		B8D66BA42125572F003960BD /* message_pump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = message_pump.h; sourceTree = "<group>"; };
+		B8D66BA52125572F003960BD /* message_pump_posix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = message_pump_posix.h; sourceTree = "<group>"; };
+		B8D66BA62125572F003960BD /* message_pump_darwin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = message_pump_darwin.h; sourceTree = "<group>"; };
+		B8F2C6CD2133A83900635B37 /* rax_source_locator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_source_locator.h; sourceTree = "<group>"; };
+		B8F2C6CE2133A83A00635B37 /* common_error.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = common_error.h; sourceTree = "<group>"; };
+		B8F2C6CF2133A83A00635B37 /* class_array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class_array.h; sourceTree = "<group>"; };
+		B8F2C6D02133A83A00635B37 /* rax_source_locator.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_source_locator.cc; sourceTree = "<group>"; };
+		B8F2C6D12133A83A00635B37 /* rax_jsx_ast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_jsx_ast.h; sourceTree = "<group>"; };
+		B8F2C6D22133A83A00635B37 /* class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class.h; sourceTree = "<group>"; };
+		B8F2C6D32133A83A00635B37 /* rax_jsx_ast.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_jsx_ast.cc; sourceTree = "<group>"; };
+		B8F2C6D42133A83A00635B37 /* class_factory.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = class_factory.cc; sourceTree = "<group>"; };
+		B8F2C6D52133A83A00635B37 /* rax_parser_statistics.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_parser_statistics.cc; sourceTree = "<group>"; };
+		B8F2C6D62133A83B00635B37 /* rax_parser_context.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_parser_context.cc; sourceTree = "<group>"; };
+		B8F2C6D72133A83B00635B37 /* class.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = class.cc; sourceTree = "<group>"; };
+		B8F2C6D82133A83B00635B37 /* class_factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class_factory.h; sourceTree = "<group>"; };
+		B8F2C6D92133A83B00635B37 /* rax_parser_builder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_parser_builder.cc; sourceTree = "<group>"; };
+		B8F2C6DA2133A83B00635B37 /* rax_parser_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_parser_builder.h; sourceTree = "<group>"; };
+		B8F2C6DB2133A83B00635B37 /* ast_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ast_builder.h; sourceTree = "<group>"; };
+		B8F2C6DC2133A83B00635B37 /* rax_parser_scope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_parser_scope.h; sourceTree = "<group>"; };
+		B8F2C6DD2133A83B00635B37 /* class_array.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = class_array.cc; sourceTree = "<group>"; };
+		B8F2C6DE2133A83B00635B37 /* rax_parser_scope.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_parser_scope.cc; sourceTree = "<group>"; };
+		B8F2C6DF2133A83B00635B37 /* rax_parser_context.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_parser_context.h; sourceTree = "<group>"; };
+		B8F2C6E02133A83B00635B37 /* rax_parser_statistics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_parser_statistics.h; sourceTree = "<group>"; };
+		B8F2C6E12133A83C00635B37 /* rax_parser.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rax_parser.cc; sourceTree = "<group>"; };
+		B8F2C6E22133A83C00635B37 /* rax_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rax_parser.h; sourceTree = "<group>"; };
+		B8F2C6E32133A83C00635B37 /* ast_builder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ast_builder.cc; sourceTree = "<group>"; };
+		B8F2C7132133A8BC00635B37 /* vm_monitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vm_monitor.h; sourceTree = "<group>"; };
+		B8F3323B2141A4C500701BA0 /* string_util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string_util.h; sourceTree = "<group>"; };
 		BA5F00EF1FC5AFFE00F76B5C /* WXLocaleModule.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WXLocaleModule.h; sourceTree = "<group>"; };
 		BA5F00F01FC5AFFE00F76B5C /* WXLocaleModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WXLocaleModule.m; sourceTree = "<group>"; };
 		C401945D1E344E8300D19C31 /* WXFloatCompareTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXFloatCompareTests.m; sourceTree = "<group>"; };
@@ -1053,13 +1590,6 @@
 			isa = PBXGroup;
 			children = (
 				176BE43B209172330086B6AF /* WXComponent+Layout.mm */,
-				17C7B50220452E1800A2296A /* WXCoreFlexEnum.h */,
-				17C7B4FE20452E1700A2296A /* WXCoreLayout.cpp */,
-				17C7B50420452E1800A2296A /* WXCoreLayout.h */,
-				17C7B50120452E1800A2296A /* WXCoreStyle.cpp */,
-				17C7B50320452E1800A2296A /* WXCoreStyle.h */,
-				17C7B50020452E1800A2296A /* WXScrollerComponent+Layout.h */,
-				17C7B4FF20452E1800A2296A /* WXScrollerComponent+Layout.mm */,
 				744BEA571D0520F300452B5D /* WXComponent+Layout.h */,
 			);
 			name = Layout;
@@ -1105,6 +1635,7 @@
 				742AD7391DF98C8B007DC46C /* WXResourceLoader.m */,
 			);
 			name = Loader;
+			path = ..;
 			sourceTree = "<group>";
 		};
 		745ED2D31C5F2C7E002DB5A8 /* View */ = {
@@ -1300,6 +1831,7 @@
 		77D160FF1C02DBE70010B15B /* WeexSDK */ = {
 			isa = PBXGroup;
 			children = (
+				B82A148120F849800098A509 /* WeexCore */,
 				77D161171C02DCB90010B15B /* Resources */,
 				77D161181C02DCB90010B15B /* Sources */,
 			);
@@ -1323,9 +1855,8 @@
 			children = (
 				17036A4B20FDE7090029AE3D /* Performance */,
 				DCA446261EFA5DAF00D0CFA8 /* WeexSDK.h */,
-				C4F012711E1502A6003378D0 /* WebSocket */,
 				2AF626C61C191E2200E71A38 /* Layout */,
-				742AD7371DF98C72007DC46C /* Loader */,
+				C4F012711E1502A6003378D0 /* WebSocket */,
 				7408C48B1CFB345D000BCCD0 /* Events */,
 				7461F88B1CFB373100F62D44 /* Display */,
 				74A4BA581CABBBA300195969 /* Debug */,
@@ -1359,10 +1890,12 @@
 				74862F801E03A24500B7A041 /* WXComponentMethod.m */,
 				74D2051E1E091B8000128F44 /* WXCallJSMethod.h */,
 				74D2051F1E091B8000128F44 /* WXCallJSMethod.m */,
+				B89543EF20EB18B4006EAD63 /* WXCoreBridge.h */,
+				B89543ED20EB18B4006EAD63 /* WXCoreBridge.mm */,
+				B863DF312107307F00EA887D /* WXBridgeContext.m */,
 				59A582FA1CF5B17B0081FD3E /* WXBridgeContext.h */,
-				59A582FB1CF5B17B0081FD3E /* WXBridgeContext.m */,
 				77D1613A1C02DEA60010B15B /* WXJSCoreBridge.h */,
-				77D1613B1C02DEA60010B15B /* WXJSCoreBridge.m */,
+				B89543EE20EB18B4006EAD63 /* WXJSCoreBridge.mm */,
 				74AD99821D5B0E59008F0336 /* WXPolyfillSet.h */,
 				74AD99831D5B0E59008F0336 /* WXPolyfillSet.m */,
 				74862F771E02B88D00B7A041 /* JSValue+Weex.h */,
@@ -1379,6 +1912,8 @@
 				C4E97D311F1EF46D00ABC314 /* WXTracingManager.h */,
 				C4E97D321F1EF46D00ABC314 /* WXTracingManager.m */,
 				740451E81E14BB26004157CB /* WXServiceFactory.h */,
+				45326708213FC84900DAA620 /* WXDisplayLinkManager.h */,
+				45326709213FC84900DAA620 /* WXDisplayLinkManager.m */,
 				740451E91E14BB26004157CB /* WXServiceFactory.m */,
 				DCF0875F1DCAE161005CD6EB /* WXInvocationConfig.h */,
 				DCF087601DCAE161005CD6EB /* WXInvocationConfig.m */,
@@ -1619,9 +2154,412 @@
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
+		B82A148120F849800098A509 /* WeexCore */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B872125572F003960BD /* base */,
+				B8D66AEC2125572F003960BD /* core */,
+				B8D66B7D2125572F003960BD /* include */,
+				B8D66B782125572F003960BD /* third_party */,
+				B8D66B7F2125572F003960BD /* wson */,
+			);
+			name = WeexCore;
+			path = Sources;
+			sourceTree = "<group>";
+		};
+		B8D66AEC2125572F003960BD /* core */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66AED2125572F003960BD /* data_render */,
+				B8D66B192125572F003960BD /* moniter */,
+				B8D66B1C2125572F003960BD /* css */,
+				B8D66B212125572F003960BD /* config */,
+				B8D66B242125572F003960BD /* bridge */,
+				B8D66B2E2125572F003960BD /* layout */,
+				B8D66B362125572F003960BD /* render */,
+				B8D66B722125572F003960BD /* parser */,
+				B8D66B752125572F003960BD /* manager */,
+			);
+			name = core;
+			path = ../../../../weex_core/Source/core;
+			sourceTree = "<group>";
+		};
+		B8D66AED2125572F003960BD /* data_render */ = {
+			isa = PBXGroup;
+			children = (
+				B8F2C7122133A8BC00635B37 /* monitor */,
+				B8F2C6E32133A83C00635B37 /* ast_builder.cc */,
+				B8F2C6DB2133A83B00635B37 /* ast_builder.h */,
+				B8A72C98213F8BAD0024E7BE /* class_json.cc */,
+				B8A72C96213F8BAD0024E7BE /* class_json.h */,
+				B8A72C99213F8BAD0024E7BE /* class_string.cc */,
+				B8A72C97213F8BAD0024E7BE /* class_string.h */,
+				B8F2C6DD2133A83B00635B37 /* class_array.cc */,
+				B8F2C6CF2133A83A00635B37 /* class_array.h */,
+				B8F2C6D42133A83A00635B37 /* class_factory.cc */,
+				B8F2C6D82133A83B00635B37 /* class_factory.h */,
+				B8F2C6D72133A83B00635B37 /* class.cc */,
+				B8F2C6D22133A83A00635B37 /* class.h */,
+				B8F2C6CE2133A83A00635B37 /* common_error.h */,
+				B8F2C6D32133A83A00635B37 /* rax_jsx_ast.cc */,
+				B8F2C6D12133A83A00635B37 /* rax_jsx_ast.h */,
+				B8F2C6D92133A83B00635B37 /* rax_parser_builder.cc */,
+				B8F2C6DA2133A83B00635B37 /* rax_parser_builder.h */,
+				B8F2C6D62133A83B00635B37 /* rax_parser_context.cc */,
+				B8F2C6DF2133A83B00635B37 /* rax_parser_context.h */,
+				B8F2C6DE2133A83B00635B37 /* rax_parser_scope.cc */,
+				B8F2C6DC2133A83B00635B37 /* rax_parser_scope.h */,
+				B8F2C6D52133A83A00635B37 /* rax_parser_statistics.cc */,
+				B8F2C6E02133A83B00635B37 /* rax_parser_statistics.h */,
+				B8F2C6E12133A83C00635B37 /* rax_parser.cc */,
+				B8F2C6E22133A83C00635B37 /* rax_parser.h */,
+				B8F2C6D02133A83A00635B37 /* rax_source_locator.cc */,
+				B8F2C6CD2133A83900635B37 /* rax_source_locator.h */,
+				B8D66AEE2125572F003960BD /* string_table.cc */,
+				B8D66AEF2125572F003960BD /* table.cc */,
+				B8D66AF02125572F003960BD /* code_generator.h */,
+				B8D66AF12125572F003960BD /* code_generator.cc */,
+				B8D66AF22125572F003960BD /* ast_factory.cc */,
+				B8D66AF32125572F003960BD /* parser.h */,
+				B8D66AF42125572F003960BD /* parser.cc */,
+				B8D66AF52125572F003960BD /* vnode */,
+				B8D66AFE2125572F003960BD /* tokenizer.cc */,
+				B8D66AFF2125572F003960BD /* ast_factory.h */,
+				B8D66B002125572F003960BD /* ast.cc */,
+				B8D66B022125572F003960BD /* statement.h */,
+				B8D66B032125572F003960BD /* tokenizer.h */,
+				B8D66B042125572F003960BD /* statement.cc */,
+				B8D66B052125572F003960BD /* vm.cc */,
+				B8D66B062125572F003960BD /* string_table.h */,
+				B8D66B072125572F003960BD /* ast.h */,
+				B8D66B0A2125572F003960BD /* scanner.h */,
+				B8D66B0C2125572F003960BD /* handle.h */,
+				B8D66B0D2125572F003960BD /* exec_state.h */,
+				B8D66B0E2125572F003960BD /* object.h */,
+				B8D66B0F2125572F003960BD /* table.h */,
+				B8D66B112125572F003960BD /* token.h */,
+				B8D66B122125572F003960BD /* vm.h */,
+				B8D66B132125572F003960BD /* op_code.h */,
+				B8D66B142125572F003960BD /* ast_visitor.h */,
+				B8D66B152125572F003960BD /* object.cc */,
+				B8D66B162125572F003960BD /* token.cc */,
+				B8D66B182125572F003960BD /* exec_state.cc */,
+			);
+			path = data_render;
+			sourceTree = "<group>";
+		};
+		B8D66AF52125572F003960BD /* vnode */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66AF62125572F003960BD /* vnode.h */,
+				B8D66AF72125572F003960BD /* vnode_exec_env.cc */,
+				B8D66AF82125572F003960BD /* vnode.cc */,
+				453267132140E38900DAA620 /* vcomponent.cc */,
+				453267122140E38900DAA620 /* vcomponent.h */,
+				B8D66AF92125572F003960BD /* vnode_render_context.cc */,
+				B8D66AFA2125572F003960BD /* vnode_exec_env.h */,
+				B8D66AFB2125572F003960BD /* vnode_render_manager.cc */,
+				B8D66AFC2125572F003960BD /* vnode_render_manager.h */,
+				B8D66AFD2125572F003960BD /* vnode_render_context.h */,
+			);
+			path = vnode;
+			sourceTree = "<group>";
+		};
+		B8D66B192125572F003960BD /* moniter */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B1A2125572F003960BD /* render_performance.cpp */,
+				B8D66B1B2125572F003960BD /* render_performance.h */,
+			);
+			path = moniter;
+			sourceTree = "<group>";
+		};
+		B8D66B1C2125572F003960BD /* css */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B1D2125572F003960BD /* constants_name.h */,
+				B8D66B1E2125572F003960BD /* constants_value.h */,
+				B8D66B1F2125572F003960BD /* css_value_getter.cpp */,
+				B8D66B202125572F003960BD /* css_value_getter.h */,
+			);
+			path = css;
+			sourceTree = "<group>";
+		};
+		B8D66B212125572F003960BD /* config */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B222125572F003960BD /* core_environment.cpp */,
+				B8D66B232125572F003960BD /* core_environment.h */,
+			);
+			path = config;
+			sourceTree = "<group>";
+		};
+		B8D66B242125572F003960BD /* bridge */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B252125572F003960BD /* platform_bridge.h */,
+				B8D66B262125572F003960BD /* platform */,
+				B8D66B292125572F003960BD /* script */,
+				B8D66B2C2125572F003960BD /* wx_type_define.h */,
+				B8D66B2D2125572F003960BD /* script_bridge.h */,
+			);
+			path = bridge;
+			sourceTree = "<group>";
+		};
+		B8D66B262125572F003960BD /* platform */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B272125572F003960BD /* core_side_in_platform.cpp */,
+				B8D66B282125572F003960BD /* core_side_in_platform.h */,
+			);
+			path = platform;
+			sourceTree = "<group>";
+		};
+		B8D66B292125572F003960BD /* script */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B2A2125572F003960BD /* core_side_in_script.cpp */,
+				B8D66B2B2125572F003960BD /* core_side_in_script.h */,
+			);
+			path = script;
+			sourceTree = "<group>";
+		};
+		B8D66B2E2125572F003960BD /* layout */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B2F2125572F003960BD /* measure_func_adapter.h */,
+				B8D66B302125572F003960BD /* style.h */,
+				B8D66B312125572F003960BD /* style.cpp */,
+				B8D66B322125572F003960BD /* layout.cpp */,
+				B8D66B342125572F003960BD /* layout.h */,
+				B8D66B352125572F003960BD /* flex_enum.h */,
+			);
+			path = layout;
+			sourceTree = "<group>";
+		};
+		B8D66B362125572F003960BD /* render */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B372125572F003960BD /* page */,
+				B8D66B3A2125572F003960BD /* manager */,
+				B8D66B3D2125572F003960BD /* action */,
+				B8D66B572125572F003960BD /* node */,
+			);
+			path = render;
+			sourceTree = "<group>";
+		};
+		B8D66B372125572F003960BD /* page */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B382125572F003960BD /* render_page.cpp */,
+				B8D66B392125572F003960BD /* render_page.h */,
+			);
+			path = page;
+			sourceTree = "<group>";
+		};
+		B8D66B3A2125572F003960BD /* manager */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B3B2125572F003960BD /* render_manager.cpp */,
+				B8D66B3C2125572F003960BD /* render_manager.h */,
+			);
+			path = manager;
+			sourceTree = "<group>";
+		};
+		B8D66B3D2125572F003960BD /* action */ = {
+			isa = PBXGroup;
+			children = (
+				B8394F3621468AF100CA1EFF /* render_action_trigger_vsync.cpp */,
+				B8394F3521468AF100CA1EFF /* render_action_trigger_vsync.h */,
+				B8D66B3E2125572F003960BD /* render_action_render_success.h */,
+				B8D66B3F2125572F003960BD /* render_action_appendtree_createfinish.h */,
+				B8D66B402125572F003960BD /* render_action_update_attr.h */,
+				B8D66B412125572F003960BD /* render_action_move_element.h */,
+				B8D66B422125572F003960BD /* render_action_update_attr.cpp */,
+				B8D66B432125572F003960BD /* render_action_layout.cpp */,
+				B8D66B442125572F003960BD /* render_action_update_style.h */,
+				B8D66B452125572F003960BD /* render_action_createfinish.h */,
+				B8D66B462125572F003960BD /* render_action_update_style.cpp */,
+				B8D66B472125572F003960BD /* render_action_add_event.h */,
+				B8D66B482125572F003960BD /* render_action_remove_element.cpp */,
+				B8D66B492125572F003960BD /* render_action_createbody.h */,
+				B8D66B4A2125572F003960BD /* render_action_add_event.cpp */,
+				B8D66B4B2125572F003960BD /* render_action_interface.h */,
+				B8D66B4C2125572F003960BD /* render_action_remove_event.cpp */,
+				B8D66B4D2125572F003960BD /* render_action_move_element.cpp */,
+				B8D66B4E2125572F003960BD /* render_action_add_element.cpp */,
+				B8D66B4F2125572F003960BD /* render_action_remove_event.h */,
+				B8D66B502125572F003960BD /* render_action_createbody.cpp */,
+				B8D66B512125572F003960BD /* render_action_createfinish.cpp */,
+				B8D66B522125572F003960BD /* render_action_layout.h */,
+				B8D66B532125572F003960BD /* render_action_remove_element.h */,
+				B8D66B542125572F003960BD /* render_action_add_element.h */,
+				B8D66B552125572F003960BD /* render_action_appendtree_createfinish.cpp */,
+				B8D66B562125572F003960BD /* render_action_render_success.cpp */,
+			);
+			path = action;
+			sourceTree = "<group>";
+		};
+		B8D66B572125572F003960BD /* node */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B582125572F003960BD /* render_cell.h */,
+				B8D66B592125572F003960BD /* render_text.cpp */,
+				B8D66B5A2125572F003960BD /* render_mask.cpp */,
+				B8D66B5B2125572F003960BD /* render_scroller.cpp */,
+				B8D66B5C2125572F003960BD /* render_mask.h */,
+				B8D66B5D2125572F003960BD /* render_scroller.h */,
+				B8D66B5E2125572F003960BD /* render_text.h */,
+				B8D66B5F2125572F003960BD /* render_object.cpp */,
+				B8D66B602125572F003960BD /* render_appbar.cpp */,
+				B8D66B612125572F003960BD /* render_list.cpp */,
+				B8D66B622125572F003960BD /* render_object.h */,
+				B8D66B632125572F003960BD /* render_appbar.h */,
+				B8D66B642125572F003960BD /* render_list.h */,
+				B8D66B652125572F003960BD /* factory */,
+			);
+			path = node;
+			sourceTree = "<group>";
+		};
+		B8D66B652125572F003960BD /* factory */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B662125572F003960BD /* render_mask_factory.h */,
+				B8D66B672125572F003960BD /* render_text_factory.h */,
+				B8D66B682125572F003960BD /* render_scroller_factory.h */,
+				B8D66B692125572F003960BD /* render_type.h */,
+				B8D66B6A2125572F003960BD /* render_creator.cpp */,
+				B8D66B6B2125572F003960BD /* render_appbar_factory.h */,
+				B8D66B6C2125572F003960BD /* simple_render_factory.h */,
+				B8D66B6D2125572F003960BD /* render_object_interface.h */,
+				B8D66B6E2125572F003960BD /* render_list_factory.h */,
+				B8D66B6F2125572F003960BD /* render_creator.h */,
+				B8D66B702125572F003960BD /* render_cell_factory.h */,
+				B8D66B712125572F003960BD /* render_factory_interface.h */,
+			);
+			path = factory;
+			sourceTree = "<group>";
+		};
+		B8D66B722125572F003960BD /* parser */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B732125572F003960BD /* dom_wson.h */,
+				B8D66B742125572F003960BD /* dom_wson.cpp */,
+			);
+			path = parser;
+			sourceTree = "<group>";
+		};
+		B8D66B752125572F003960BD /* manager */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B772125572F003960BD /* weex_core_manager.h */,
+			);
+			path = manager;
+			sourceTree = "<group>";
+		};
+		B8D66B782125572F003960BD /* third_party */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B792125572F003960BD /* json11 */,
+			);
+			name = third_party;
+			path = ../../../../weex_core/Source/third_party;
+			sourceTree = "<group>";
+		};
+		B8D66B792125572F003960BD /* json11 */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B7B2125572F003960BD /* json11.hpp */,
+				B8D66B7C2125572F003960BD /* json11.cc */,
+			);
+			path = json11;
+			sourceTree = "<group>";
+		};
+		B8D66B7D2125572F003960BD /* include */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B7E2125572F003960BD /* WeexApiHeader.h */,
+			);
+			name = include;
+			path = ../../../../weex_core/Source/include;
+			sourceTree = "<group>";
+		};
+		B8D66B7F2125572F003960BD /* wson */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B802125572F003960BD /* wson.h */,
+				B8D66B822125572F003960BD /* wson.c */,
+				B8D66B832125572F003960BD /* wson_util.h */,
+				B8D66B842125572F003960BD /* wson_util.cpp */,
+				B8D66B852125572F003960BD /* wson_parser.cpp */,
+				B8D66B862125572F003960BD /* wson_parser.h */,
+			);
+			name = wson;
+			path = ../../../../weex_core/Source/wson;
+			sourceTree = "<group>";
+		};
+		B8D66B872125572F003960BD /* base */ = {
+			isa = PBXGroup;
+			children = (
+				B8F3323B2141A4C500701BA0 /* string_util.h */,
+				B8D66B8F2125572F003960BD /* LogDefines.h */,
+				B8D66B882125572F003960BD /* TimeUtils.h */,
+				B8D66B9C2125572F003960BD /* CoreConstants.h */,
+				B8D66B892125572F003960BD /* make_copyable.h */,
+				B8D66B8A2125572F003960BD /* ViewUtils.h */,
+				B8D66B8B2125572F003960BD /* common.h */,
+				B8D66B8C2125572F003960BD /* time_point.h */,
+				B8D66B8D2125572F003960BD /* time_point.cc */,
+				B8D66B8E2125572F003960BD /* closure.h */,
+				B8D66B902125572F003960BD /* time_unit.h */,
+				B8D66B912125572F003960BD /* thread */,
+				B8D66B9D2125572F003960BD /* message_loop */,
+			);
+			name = base;
+			path = ../../../../weex_core/Source/base;
+			sourceTree = "<group>";
+		};
+		B8D66B912125572F003960BD /* thread */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66B972125572F003960BD /* thread.h */,
+				B8D66B952125572F003960BD /* thread_impl.h */,
+				B8D66B9A2125572F003960BD /* thread_impl_posix.h */,
+				B8D66B922125572F003960BD /* thread_impl_posix.cc */,
+				B8D66B992125572F003960BD /* thread_impl_darwin.h */,
+				B8D66B962125572F003960BD /* thread_impl_darwin.cc */,
+				B8D66B932125572F003960BD /* thread_local.h */,
+				B8D66B982125572F003960BD /* waitable_event.h */,
+			);
+			path = thread;
+			sourceTree = "<group>";
+		};
+		B8D66B9D2125572F003960BD /* message_loop */ = {
+			isa = PBXGroup;
+			children = (
+				B8D66BA02125572F003960BD /* message_loop.h */,
+				B8D66BA12125572F003960BD /* message_loop.cc */,
+				B8D66BA42125572F003960BD /* message_pump.h */,
+				B8D66BA52125572F003960BD /* message_pump_posix.h */,
+				B8D66B9E2125572F003960BD /* message_pump_posix.cc */,
+				B8D66BA62125572F003960BD /* message_pump_darwin.h */,
+				B8D66BA22125572F003960BD /* message_pump_darwin.cc */,
+			);
+			path = message_loop;
+			sourceTree = "<group>";
+		};
+		B8F2C7122133A8BC00635B37 /* monitor */ = {
+			isa = PBXGroup;
+			children = (
+				B8F2C7132133A8BC00635B37 /* vm_monitor.h */,
+			);
+			path = monitor;
+			sourceTree = "<group>";
+		};
 		C4F012711E1502A6003378D0 /* WebSocket */ = {
 			isa = PBXGroup;
 			children = (
+				742AD7371DF98C72007DC46C /* Loader */,
 				C4F012761E1502A6003378D0 /* WXWebSocketHandler.h */,
 			);
 			path = WebSocket;
@@ -1653,134 +2591,219 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4532670A213FC84A00DAA620 /* WXDisplayLinkManager.h in Headers */,
+				B8D66C1B21255730003960BD /* style.h in Headers */,
+				B8D66C2321255730003960BD /* layout.h in Headers */,
+				B8D66C2521255730003960BD /* flex_enum.h in Headers */,
+				B8D66C4921255730003960BD /* render_action_interface.h in Headers */,
 				7408C48E1CFB345D000BCCD0 /* WXComponent+Events.h in Headers */,
+				B8D66C8F21255730003960BD /* render_cell_factory.h in Headers */,
+				B8D66C7521255730003960BD /* render_object.h in Headers */,
+				B8D66BC12125572F003960BD /* vnode_render_manager.h in Headers */,
 				775BEE711C1BD977008D1629 /* WXModuleProtocol.h in Headers */,
+				B8F2C70E2133A83C00635B37 /* rax_parser.h in Headers */,
 				7469869F1C4E2C000054A57E /* NSArray+Weex.h in Headers */,
+				B8D66BDD2125572F003960BD /* scanner.h in Headers */,
+				B8D66C4121255730003960BD /* render_action_add_event.h in Headers */,
 				74CC7A201C2BF9DC00829368 /* WXListComponent.h in Headers */,
 				17036A5320FDE7490029AE3D /* WXApmProtocol.h in Headers */,
 				7423EB511F4ADE30001662D1 /* WXComponent+DataBinding.h in Headers */,
 				74FD6E041C7C0E9600DBEB6D /* WXScrollerProtocol.h in Headers */,
 				74CFDD3D1F459400007A1A66 /* WXRecycleListDataManager.h in Headers */,
+				B8D66BE52125572F003960BD /* object.h in Headers */,
 				77D161201C02DDB40010B15B /* WXSDKEngine.h in Headers */,
+				B8A72C9C213F8BAE0024E7BE /* class_string.h in Headers */,
 				745ED2DA1C5F2C7E002DB5A8 /* WXView.h in Headers */,
+				B8F3323C2141A4C600701BA0 /* string_util.h in Headers */,
 				17B122252090AAB000387E33 /* WXSDKError.h in Headers */,
 				2AE5B7521CAB7DBD0082FDDB /* WXAComponent.h in Headers */,
+				B8D66CC521255730003960BD /* thread_local.h in Headers */,
+				B8D66C4521255730003960BD /* render_action_createbody.h in Headers */,
 				77D1614F1C02E3880010B15B /* WXUtility.h in Headers */,
 				743933B41C7ED9AA00773BB7 /* WXSimulatorShortcutManager.h in Headers */,
+				B8D66C0B21255730003960BD /* platform_bridge.h in Headers */,
 				74862F811E03A24500B7A041 /* WXComponentMethod.h in Headers */,
 				74915F471C8EB02B00BEBCC0 /* WXAssert.h in Headers */,
 				2A8E658A1C7C7AA20025C7B7 /* WXVideoComponent.h in Headers */,
 				59A5961C1CB630F10012CD52 /* WXComponent+Navigation.h in Headers */,
+				B8D66C3D21255730003960BD /* render_action_createfinish.h in Headers */,
 				775BEE6E1C1BD8F4008D1629 /* WXImgLoaderProtocol.h in Headers */,
+				B8D66C1321255730003960BD /* core_side_in_script.h in Headers */,
 				7410811F1CED585A001BC6E5 /* WXComponentManager.h in Headers */,
+				B8D66C8521255730003960BD /* render_appbar_factory.h in Headers */,
 				74CFDD411F45941E007A1A66 /* WXRecycleListTemplateManager.h in Headers */,
+				B8F2C7002133A83C00635B37 /* ast_builder.h in Headers */,
 				1D3000F11D40B9AC004F3B4F /* WXClipboardModule.h in Headers */,
 				59A583081CF5B2FD0081FD3E /* WXNavigationDefaultImpl.h in Headers */,
+				B8D66CD721255730003960BD /* CoreConstants.h in Headers */,
 				17B122222090AA9300387E33 /* WXSDKInstance_performance.h in Headers */,
 				775BEE4E1C16F993008D1629 /* WXDefine.h in Headers */,
+				B8D66BE12125572F003960BD /* handle.h in Headers */,
+				B8D66BCD2125572F003960BD /* statement.h in Headers */,
 				77D161241C02DDD10010B15B /* WXSDKInstance.h in Headers */,
 				DC6836E61EBB12B200AD2D84 /* WXConfigCenterProtocol.h in Headers */,
 				DC7764941F3C2CA300B5727E /* WXRecyclerDragController.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 */,
+				B8D66C3121255730003960BD /* render_action_appendtree_createfinish.h in Headers */,
+				B8F2C6EE2133A83C00635B37 /* class.h in Headers */,
+				B8D66C7F21255730003960BD /* render_scroller_factory.h in Headers */,
 				74A4BA5B1CABBBD000195969 /* WXDebugTool.h in Headers */,
 				2A837AB41CD9DE9200AEDF03 /* WXLoadingIndicator.h in Headers */,
 				747A787C1D1BAAC900DED9D0 /* WXComponent+ViewManagement.h in Headers */,
 				2AE5B7561CABA04E0082FDDB /* WXEventModuleProtocol.h in Headers */,
+				B8D66C6B21255730003960BD /* render_scroller.h in Headers */,
+				B8D66C6921255730003960BD /* render_mask.h in Headers */,
 				C4C30DE91E1B833D00786B6C /* WXComponent+PseudoClassManagement.h in Headers */,
 				591DD3321D23AD5800BE8709 /* WXErrorView.h in Headers */,
+				B8D66C8D21255730003960BD /* render_creator.h in Headers */,
 				17C74F0B2072145100AB4CAB /* WXAnalyzerCenter+Transfer.h in Headers */,
 				D362F94F1C83EDA20003F546 /* WXWebViewModule.h in Headers */,
 				C4F012861E150307003378D0 /* WXWebSocketLoader.h in Headers */,
 				C4E97D331F1EF46D00ABC314 /* WXTracingManager.h in Headers */,
 				77D161381C02DE940010B15B /* WXBridgeManager.h in Headers */,
+				B8F2C70A2133A83C00635B37 /* rax_parser_statistics.h in Headers */,
 				C4D872251E5DDF7500E39BC1 /* WXBoxShadow.h in Headers */,
 				042013AD1E66CD6A001FC79C /* WXValidateProtocol.h in Headers */,
+				B8D66CE921255730003960BD /* message_pump_darwin.h in Headers */,
+				B8D66BF12125572F003960BD /* ast_visitor.h in Headers */,
+				B8D66C2F21255730003960BD /* render_action_render_success.h in Headers */,
+				B8D66BD72125572F003960BD /* ast.h in Headers */,
+				B8F2C6EC2133A83C00635B37 /* rax_jsx_ast.h in Headers */,
 				C4D872221E5DDEDA00E39BC1 /* WXInnerLayer.h in Headers */,
 				2A919DA61E321F1F006EB6B5 /* WXBridgeMethod.h in Headers */,
+				B8D66BB12125572F003960BD /* parser.h in Headers */,
+				B8A72C9A213F8BAE0024E7BE /* class_json.h in Headers */,
+				B8D66C5121255730003960BD /* render_action_remove_event.h in Headers */,
 				37B51EE41E97804D0040A743 /* WXCycleSliderComponent.h in Headers */,
 				77D161281C02DE1A0010B15B /* WXSDKManager.h in Headers */,
 				59CE27E81CC387DB000BE37A /* WXEmbedComponent.h in Headers */,
+				B8D66CC921255730003960BD /* thread_impl.h in Headers */,
+				B8D66BC72125572F003960BD /* ast_factory.h in Headers */,
+				B8D66C0F21255730003960BD /* core_side_in_platform.h in Headers */,
+				B8D66C9121255730003960BD /* render_factory_interface.h in Headers */,
 				DCE2CF9B1F46D4220021BDC4 /* WXVoiceOverModule.h in Headers */,
 				74BB5FB91DFEE81A004FC3DF /* WXMetaModule.h in Headers */,
 				DCA0EF641D6EED6F00CB18B9 /* WXGlobalEventModule.h in Headers */,
 				2A837AB21CD9DE9200AEDF03 /* WXLoadingComponent.h in Headers */,
-				17E5ACD82091F02D00EE81F1 /* WXCoreLayout.h in Headers */,
+				B8D66BBD2125572F003960BD /* vnode_exec_env.h in Headers */,
 				DCA446271EFA5DAF00D0CFA8 /* WeexSDK.h in Headers */,
 				841CD1051F974DFA0081196D /* WXExceptionUtils.h in Headers */,
 				745B2D6A1E5A8E1E0092D38A /* WXRecyclerComponent.h in Headers */,
 				C42E8F9B1F39DF07001EBE9D /* WXTracingProtocol.h in Headers */,
+				B8D66C6D21255730003960BD /* render_text.h in Headers */,
 				7423899F1C32733800D748CA /* WXType.h in Headers */,
 				59A582FC1CF5B17B0081FD3E /* WXBridgeContext.h in Headers */,
 				77D161621C02ED790010B15B /* WXLog.h in Headers */,
+				B8F2C6E42133A83C00635B37 /* rax_source_locator.h in Headers */,
 				77D1614B1C02E3790010B15B /* WXConvert.h in Headers */,
 				1746EA7320E9D253007E55BD /* WXComponent_performance.h in Headers */,
 				59A596221CB6311F0012CD52 /* WXNavigatorModule.h in Headers */,
+				B8F2C7082133A83C00635B37 /* rax_parser_context.h in Headers */,
 				C47B78CE1F2998EE001D3B0C /* WXExtendCallNativeManager.h in Headers */,
+				B8D66CA321255730003960BD /* wson.h in Headers */,
 				749DC27B1D40827B009E1C91 /* WXMonitor.h in Headers */,
+				B8D66CB521255730003960BD /* ViewUtils.h in Headers */,
 				77E659DA1C07F594008B8775 /* WXDomModule.h in Headers */,
 				74EF31AD1DE58BE200667A07 /* WXURLRewriteDefaultImpl.h in Headers */,
 				746B923B1F46BE36009AE86B /* WXCellSlotComponent.h in Headers */,
 				744D61101E49979000B624B3 /* WXFooterComponent.h in Headers */,
 				744D61141E4AF23E00B624B3 /* WXDiffUtil.h in Headers */,
+				B8F2C7022133A83C00635B37 /* rax_parser_scope.h in Headers */,
 				74862F791E02B88D00B7A041 /* JSValue+Weex.h in Headers */,
+				B8F2C6FA2133A83C00635B37 /* class_factory.h in Headers */,
 				2A1F57B71C75C6A600B58017 /* WXTextInputComponent.h in Headers */,
+				B8D66C2D21255730003960BD /* render_manager.h in Headers */,
 				74CFDD451F459443007A1A66 /* WXRecycleListUpdateManager.h in Headers */,
 				74A4BA9A1CB3BAA100195969 /* WXThreadSafeMutableDictionary.h in Headers */,
 				74A4BA9E1CB3C0A100195969 /* WXHandlerFactory.h in Headers */,
 				741DFE021DDD7D18009B020F /* WXRoundedRect.h in Headers */,
 				17C74F0F2072147B00AB4CAB /* WXAnalyzerProtocol.h in Headers */,
 				7423899B1C3174EB00D748CA /* WXWeakObjectWrapper.h in Headers */,
-				17C7B50A20452E1800A2296A /* WXCoreFlexEnum.h in Headers */,
 				74BF19F81F5139BB00AEE3D7 /* WXJSASTParser.h in Headers */,
 				59A596191CB630E50012CD52 /* WXNavigationProtocol.h in Headers */,
+				B8D66CBF21255730003960BD /* LogDefines.h in Headers */,
 				59A5962F1CB632050012CD52 /* WXBaseViewController.h in Headers */,
+				B8F2C7142133A8BC00635B37 /* vm_monitor.h in Headers */,
+				B8D66C012125572F003960BD /* constants_value.h in Headers */,
 				74AD99841D5B0E59008F0336 /* WXPolyfillSet.h in Headers */,
 				74A4BA961CB365D100195969 /* WXAppConfiguration.h in Headers */,
+				B8D66C8721255730003960BD /* simple_render_factory.h in Headers */,
 				7461F8921CFB373100F62D44 /* WXLayer.h in Headers */,
+				B8D66C052125572F003960BD /* css_value_getter.h in Headers */,
 				594C28931CF9E61A009793A4 /* WXAnimationModule.h in Headers */,
+				B8D66BE32125572F003960BD /* exec_state.h in Headers */,
+				B8D66CCD21255730003960BD /* thread.h in Headers */,
+				B8D66C6121255730003960BD /* render_cell.h in Headers */,
+				B8D66C3B21255730003960BD /* render_action_update_style.h in Headers */,
+				B8D66C7721255730003960BD /* render_appbar.h in Headers */,
+				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 */,
+				B8D66CE521255730003960BD /* message_pump.h in Headers */,
+				B8D66CCF21255730003960BD /* waitable_event.h in Headers */,
 				741081261CEDB4EC001BC6E5 /* WXComponent_internal.h in Headers */,
 				77E65A191C155F25008B8775 /* WXScrollerComponent.h in Headers */,
 				C4E375381E5FCBD3009B2D9C /* WXComponent+BoxShadow.h in Headers */,
+				B8394F3721468AF100CA1EFF /* render_action_trigger_vsync.h in Headers */,
+				B8D66C8921255730003960BD /* render_object_interface.h in Headers */,
 				74BA4AB31F70F4B600AC29BF /* WXRecycleListLayout.h in Headers */,
+				B8D66C3521255730003960BD /* render_action_move_element.h in Headers */,
+				B8D66CB921255730003960BD /* time_point.h in Headers */,
 				742AD7311DF98C45007DC46C /* WXResourceRequestHandlerDefaultImpl.h in Headers */,
 				C4F0127D1E1502A6003378D0 /* WXWebSocketHandler.h in Headers */,
+				B8D66C9D21255730003960BD /* json11.hpp in Headers */,
 				DC03ADBA1D508719003F76E7 /* WXTextAreaComponent.h in Headers */,
+				B8D66C5721255730003960BD /* render_action_layout.h in Headers */,
 				2AC750241C7565690041D390 /* WXIndicatorComponent.h in Headers */,
+				B8F2C6E82133A83C00635B37 /* class_array.h in Headers */,
 				DCAB35FE1D658EB700C0EA70 /* WXRuleManager.h in Headers */,
 				748B25181C44A6F9005D491E /* WXSDKInstance_private.h in Headers */,
 				74862F7D1E03A0F300B7A041 /* WXModuleMethod.h in Headers */,
 				742AD7331DF98C45007DC46C /* WXResourceResponse.h in Headers */,
 				77E65A0D1C155E99008B8775 /* WXDivComponent.h in Headers */,
+				B8D66CD321255730003960BD /* thread_impl_posix.h in Headers */,
+				B8D66BED2125572F003960BD /* vm.h in Headers */,
 				C41E1A971DC1FD15009C7F90 /* WXDatePickerManager.h in Headers */,
+				B8D66CB721255730003960BD /* common.h in Headers */,
 				333D9A271F41507A007CED39 /* WXTransition.h in Headers */,
 				7461F8901CFB373100F62D44 /* WXDisplayQueue.h in Headers */,
+				B8D66C2921255730003960BD /* render_page.h in Headers */,
 				DCC77C141D770AE300CE7288 /* WXSliderNeighborComponent.h in Headers */,
 				747DF6821E31AEE4005C53A8 /* WXLength.h in Headers */,
 				77E659F11C0C3612008B8775 /* WXModuleFactory.h in Headers */,
+				B8D66CE721255730003960BD /* message_pump_posix.h in Headers */,
 				77D161431C02DEE40010B15B /* WXBridgeProtocol.h in Headers */,
+				B8D66C1721255730003960BD /* script_bridge.h in Headers */,
 				59A582D41CF481110081FD3E /* WXAppMonitorProtocol.h in Headers */,
 				2A837AB61CD9DE9200AEDF03 /* WXRefreshComponent.h in Headers */,
+				B8F2C6E62133A83C00635B37 /* common_error.h in Headers */,
+				B8D66BFD2125572F003960BD /* render_performance.h in Headers */,
 				C43C03E81EC8ACA40044C7FF /* WXPrerenderManager.h in Headers */,
+				453267142140E38900DAA620 /* vcomponent.h in Headers */,
 				17C74F0C2072145100AB4CAB /* WXAnalyzerCenter.h in Headers */,
-				17C7B50B20452E1800A2296A /* WXCoreStyle.h in Headers */,
+				B8D66CD121255730003960BD /* thread_impl_darwin.h in Headers */,
+				B8D66CBD21255730003960BD /* closure.h in Headers */,
 				C4B834281DE69B09007AD27E /* WXPickerModule.h in Headers */,
 				59A596311CB632050012CD52 /* WXRootViewController.h in Headers */,
 				DCF087611DCAE161005CD6EB /* WXInvocationConfig.h in Headers */,
+				B8D66C7D21255730003960BD /* render_text_factory.h in Headers */,
+				B8D66CDD21255730003960BD /* message_loop.h in Headers */,
 				742AD7301DF98C45007DC46C /* WXResourceRequestHandler.h in Headers */,
 				77E65A151C155EB5008B8775 /* WXTextComponent.h in Headers */,
+				B8D66C9921255730003960BD /* weex_core_manager.h in Headers */,
 				C4B3D6D41E6954300013F38D /* WXEditComponent.h in Headers */,
 				74CC7A1C1C2BC5F800829368 /* WXCellComponent.h in Headers */,
 				74896F301D1AC79400D1D593 /* NSObject+WXSwizzle.h in Headers */,
+				B8D66C5921255730003960BD /* render_action_remove_element.h in Headers */,
 				DCF343671E49CAEE00A2FB34 /* WXJSExceptionInfo.h in Headers */,
-				17C7B50820452E1800A2296A /* WXScrollerComponent+Layout.h in Headers */,
 				C4F012821E1502E9003378D0 /* WXWebSocketModule.h in Headers */,
 				74EF31AA1DE58AE600667A07 /* WXURLRewriteProtocol.h in Headers */,
+				B8D66BE72125572F003960BD /* table.h in Headers */,
 				59A596241CB6311F0012CD52 /* WXStorageModule.h in Headers */,
 				74A4BA851CAD453400195969 /* WXNetworkProtocol.h in Headers */,
 				7461F8A81CFC33A800F62D44 /* WXThreadSafeMutableArray.h in Headers */,
@@ -1789,30 +2812,54 @@
 				74B8BEFE1DC47B72004A6027 /* WXRootView.h in Headers */,
 				77E65A111C155EA8008B8775 /* WXImageComponent.h in Headers */,
 				745B2D6C1E5A8E1E0092D38A /* WXRecyclerDataController.h in Headers */,
+				B8D66C8121255730003960BD /* render_type.h in Headers */,
+				B8D66CA121255730003960BD /* WeexApiHeader.h in Headers */,
+				B8D66CA921255730003960BD /* wson_util.h in Headers */,
+				B8D66C8B21255730003960BD /* render_list_factory.h in Headers */,
 				745B2D681E5A8E1E0092D38A /* WXMultiColumnLayout.h in Headers */,
+				B89543F720EB18B5006EAD63 /* WXCoreBridge.h in Headers */,
+				B8D66BD52125572F003960BD /* string_table.h in Headers */,
 				2A60CE9C1C91733E00857B9F /* WXSwitchComponent.h in Headers */,
 				DCDFED011E68238F00C228D7 /* WXJSExceptionProtocol.h in Headers */,
+				B8D66C0921255730003960BD /* core_environment.h in Headers */,
 				2A4445BF1CA8FD56009E7C6D /* WXTextComponentProtocol.h in Headers */,
 				746319021C60AFC100EFEBD4 /* WXThreadSafeCounter.h in Headers */,
 				744D610C1E49978200B624B3 /* WXHeaderComponent.h in Headers */,
+				B8D66C1521255730003960BD /* wx_type_define.h in Headers */,
+				B8D66BEB2125572F003960BD /* token.h in Headers */,
+				B8D66BEF2125572F003960BD /* op_code.h in Headers */,
+				B8D66C7921255730003960BD /* render_list.h in Headers */,
+				B8D66C3321255730003960BD /* render_action_update_attr.h in Headers */,
 				77D1613C1C02DEA60010B15B /* WXJSCoreBridge.h in Headers */,
 				74D205201E091B8000128F44 /* WXCallJSMethod.h in Headers */,
+				B8D66BAB2125572F003960BD /* code_generator.h in Headers */,
+				B8D66BB52125572F003960BD /* vnode.h in Headers */,
 				741DFE061DDD9B30009B020F /* UIBezierPath+Weex.h in Headers */,
 				BA5F00F11FC5AFFE00F76B5C /* WXLocaleModule.h in Headers */,
 				742AD72E1DF98C45007DC46C /* WXResourceRequest.h in Headers */,
+				B8D66C9321255730003960BD /* dom_wson.h in Headers */,
+				B8D66CAF21255730003960BD /* wson_parser.h in Headers */,
 				D317338C1C57257000BB7539 /* WXTransform.h in Headers */,
+				B8D66BC32125572F003960BD /* vnode_render_context.h in Headers */,
 				77D161301C02DE4E0010B15B /* WXComponent.h in Headers */,
+				B8D66CB121255730003960BD /* TimeUtils.h in Headers */,
+				B8D66C1921255730003960BD /* measure_func_adapter.h in Headers */,
 				2AFEB17B1C747139000507FA /* WXInstanceWrap.h in Headers */,
 				744BEA551D05178F00452B5D /* WXComponent+Display.h in Headers */,
 				DCE7F1EF20AD358A00D471E7 /* WXPageEventNotifyEvent.h in Headers */,
+				B8D66C7B21255730003960BD /* render_mask_factory.h in Headers */,
 				741081231CED6756001BC6E5 /* WXComponentFactory.h in Headers */,
 				59D3CA4A1CFC3CE1008835DC /* NSTimer+Weex.h in Headers */,
 				C4424E5B1F24DA3D009F52E2 /* WXExtendCallNativeProtocol.h in Headers */,
+				B8F2C6FE2133A83C00635B37 /* rax_parser_builder.h in Headers */,
 				74CFDD391F45939C007A1A66 /* WXRecycleListComponent.h in Headers */,
+				B8D66CC121255730003960BD /* time_unit.h in Headers */,
 				ED053500207F4DEB007B4568 /* JSContext+Weex.h in Headers */,
+				B8D66BCF2125572F003960BD /* tokenizer.h in Headers */,
 				D334510C1D3E19B80083598A /* WXCanvasModule.h in Headers */,
 				742AD73A1DF98C8B007DC46C /* WXResourceLoader.h in Headers */,
 				746319291C71B92600EFEBD4 /* WXModalUIModule.h in Headers */,
+				B8D66BFF2125572F003960BD /* constants_name.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1820,49 +2867,94 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4532670C213FCF2300DAA620 /* WXDisplayLinkManager.h in Headers */,
+				B8D66C1C21255730003960BD /* style.h in Headers */,
+				B8D66C2421255730003960BD /* layout.h in Headers */,
+				B8D66C2621255730003960BD /* flex_enum.h in Headers */,
+				B85ED3032126715100EBEC11 /* WXRecyclerComponent.h in Headers */,
 				DCA445D21EFA594600D0CFA8 /* WXComponent+Display.h in Headers */,
 				DCA445A81EFA572B00D0CFA8 /* WXResourceResponse.h in Headers */,
 				DCA445BC1EFA57B000D0CFA8 /* WXConvert.h in Headers */,
+				B8D66C8021255730003960BD /* render_scroller_factory.h in Headers */,
 				DCA445C11EFA57D000D0CFA8 /* WXBridgeManager.h in Headers */,
+				B8D66C3621255730003960BD /* render_action_move_element.h in Headers */,
 				DCA445A31EFA570800D0CFA8 /* WXSDKManager.h in Headers */,
 				DCA445BE1EFA57BB00D0CFA8 /* WXComponentManager.h in Headers */,
+				B8D66CD221255730003960BD /* thread_impl_darwin.h in Headers */,
 				DCA4459E1EFA56E500D0CFA8 /* WXUtility.h in Headers */,
 				DCA445B91EFA579D00D0CFA8 /* WXErrorView.h in Headers */,
+				B8D66BE42125572F003960BD /* exec_state.h in Headers */,
+				B8D66C022125572F003960BD /* constants_value.h in Headers */,
+				B8F2C7032133A83C00635B37 /* rax_parser_scope.h in Headers */,
+				B8F2C7012133A83C00635B37 /* ast_builder.h in Headers */,
 				170B4665208733BF00562666 /* WXAnalyzerCenter+Transfer.h in Headers */,
+				B8F2C6FB2133A83C00635B37 /* class_factory.h in Headers */,
+				B8D66BC22125572F003960BD /* vnode_render_manager.h in Headers */,
 				DCA445A01EFA56F400D0CFA8 /* WXType.h in Headers */,
 				DCA445B21EFA576D00D0CFA8 /* WXListComponent.h in Headers */,
 				DCA445AD1EFA575100D0CFA8 /* WXNavigationProtocol.h in Headers */,
+				B8A72C9B213F8BAE0024E7BE /* class_json.h in Headers */,
 				DCA445B01EFA576200D0CFA8 /* WXModalUIModule.h in Headers */,
 				DCA445A61EFA571E00D0CFA8 /* WXSDKEngine.h in Headers */,
-				17E5ACDA2091F05000EE81F1 /* WXCoreFlexEnum.h in Headers */,
+				B8F2C6FF2133A83C00635B37 /* rax_parser_builder.h in Headers */,
+				B8D66CD421255730003960BD /* thread_impl_posix.h in Headers */,
+				B8F2C7092133A83C00635B37 /* rax_parser_context.h in Headers */,
 				DCA445AA1EFA573900D0CFA8 /* WXResourceRequest.h in Headers */,
 				DCA445C61EFA57EE00D0CFA8 /* NSObject+WXSwizzle.h in Headers */,
 				74B81AEB1F73C3E900D3A61D /* WXRecycleListLayout.h in Headers */,
+				B8D66C8221255730003960BD /* render_type.h in Headers */,
+				B8D66C9221255730003960BD /* render_factory_interface.h in Headers */,
 				DCA445B41EFA577F00D0CFA8 /* WXJSExceptionProtocol.h in Headers */,
+				B8D66CA221255730003960BD /* WeexApiHeader.h in Headers */,
 				74B81AEF1F73C3E900D3A61D /* WXComponent+DataBinding.h in Headers */,
 				DCA445B51EFA578400D0CFA8 /* WXJSExceptionInfo.h in Headers */,
+				B8D66C9E21255730003960BD /* json11.hpp in Headers */,
 				DCA445B61EFA578B00D0CFA8 /* WXIndicatorComponent.h in Headers */,
+				B8D66C8E21255730003960BD /* render_creator.h in Headers */,
+				B8D66C7A21255730003960BD /* render_list.h in Headers */,
+				B8D66C9A21255730003960BD /* weex_core_manager.h in Headers */,
+				B8D66BB62125572F003960BD /* vnode.h in Headers */,
 				DCA445BF1EFA57C300D0CFA8 /* WXComponent.h in Headers */,
 				DCA445A71EFA572300D0CFA8 /* WXRootViewController.h in Headers */,
 				1746EA7520E9D25E007E55BD /* WXSDKInstance_performance.h in Headers */,
+				B8F2C6E92133A83C00635B37 /* class_array.h in Headers */,
+				B8D66BE82125572F003960BD /* table.h in Headers */,
 				74B81AE91F73C3E900D3A61D /* WXRecycleListUpdateManager.h in Headers */,
 				DCA445C01EFA57C900D0CFA8 /* WXBridgeProtocol.h in Headers */,
+				B8D66C2A21255730003960BD /* render_page.h in Headers */,
+				B8D66C4621255730003960BD /* render_action_createbody.h in Headers */,
+				B8D66C8A21255730003960BD /* render_object_interface.h in Headers */,
 				DCA445AC1EFA574A00D0CFA8 /* WXNetworkProtocol.h in Headers */,
 				DCA445C31EFA57DC00D0CFA8 /* WXAppMonitorProtocol.h in Headers */,
+				B8D66BC42125572F003960BD /* vnode_render_context.h in Headers */,
 				DCA445AF1EFA575D00D0CFA8 /* WXModuleProtocol.h in Headers */,
 				ED053501207F4DEB007B4568 /* JSContext+Weex.h in Headers */,
 				DCA4459F1EFA56EC00D0CFA8 /* WXURLRewriteProtocol.h in Headers */,
+				B8D66BAC2125572F003960BD /* code_generator.h in Headers */,
 				DCA445A21EFA570100D0CFA8 /* WXScrollerComponent.h in Headers */,
+				B8D66C7621255730003960BD /* render_object.h in Headers */,
 				DCA445B71EFA579200D0CFA8 /* WXImgLoaderProtocol.h in Headers */,
 				1746EA7420E9D253007E55BD /* WXComponent_performance.h in Headers */,
+				B8D66CEB21255B2A003960BD /* WXWebSocketLoader.h in Headers */,
 				DCA445C21EFA57D700D0CFA8 /* WXBaseViewController.h in Headers */,
 				DCA445AB1EFA574100D0CFA8 /* WXPrerenderManager.h in Headers */,
 				DCA445BB1EFA57AA00D0CFA8 /* WXDebugTool.h in Headers */,
+				B8D66C8621255730003960BD /* render_appbar_factory.h in Headers */,
+				B8D66BBE2125572F003960BD /* vnode_exec_env.h in Headers */,
+				B8A72C9D213F8BAE0024E7BE /* class_string.h in Headers */,
+				B8D66BB22125572F003960BD /* parser.h in Headers */,
 				DCA445A91EFA573200D0CFA8 /* WXResourceRequestHandler.h in Headers */,
 				DCA445C41EFA57E300D0CFA8 /* WXAppConfiguration.h in Headers */,
 				DCA445BA1EFA57A200D0CFA8 /* WXDefine.h in Headers */,
+				B8F2C6E72133A83C00635B37 /* common_error.h in Headers */,
+				B8D66CB221255730003960BD /* TimeUtils.h in Headers */,
+				B8D66CBA21255730003960BD /* time_point.h in Headers */,
+				B8F2C70B2133A83C00635B37 /* rax_parser_statistics.h in Headers */,
+				B8D66C8821255730003960BD /* simple_render_factory.h in Headers */,
 				DCA445A41EFA570E00D0CFA8 /* WXSDKInstance.h in Headers */,
 				DCA445C51EFA57E800D0CFA8 /* WXAComponent.h in Headers */,
+				B8D66C4A21255730003960BD /* render_action_interface.h in Headers */,
+				B8D66C002125572F003960BD /* constants_name.h in Headers */,
 				DCA445B11EFA576800D0CFA8 /* WXLog.h in Headers */,
 				DCA4459D1EFA56DB00D0CFA8 /* WXValidateProtocol.h in Headers */,
 				DCA445B81EFA579800D0CFA8 /* WXEventModuleProtocol.h in Headers */,
@@ -1871,71 +2963,115 @@
 				DCA445BD1EFA57B500D0CFA8 /* WXConfigCenterProtocol.h in Headers */,
 				DCA445A11EFA56FA00D0CFA8 /* WXScrollerProtocol.h in Headers */,
 				DCA445DE1EFA59B800D0CFA8 /* WXSectionDataController.h in Headers */,
+				B8D66BD82125572F003960BD /* ast.h in Headers */,
 				DCA445F01EFA5A1D00D0CFA8 /* WXComponent_internal.h in Headers */,
+				B8D66C3221255730003960BD /* render_action_appendtree_createfinish.h in Headers */,
 				170B4664208733AF00562666 /* WXAnalyzerCenter.h in Headers */,
+				B8D66C0621255730003960BD /* css_value_getter.h in Headers */,
+				B8D66C1621255730003960BD /* wx_type_define.h in Headers */,
+				B8D66C9021255730003960BD /* render_cell_factory.h in Headers */,
+				B8D66C5221255730003960BD /* render_action_remove_event.h in Headers */,
 				74B81AE71F73C3E900D3A61D /* WXRecycleListTemplateManager.h in Headers */,
 				DCA445ED1EFA5A1200D0CFA8 /* WXTransform.h in Headers */,
-				D0E6624F20FDD1BC00AF8914 /* WXRecyclerComponent.h in Headers */,
 				DCA445CD1EFA592E00D0CFA8 /* WXComponent+Events.h in Headers */,
+				B8D66CC021255730003960BD /* LogDefines.h in Headers */,
 				DCA445EC1EFA5A0E00D0CFA8 /* WXTextAreaComponent.h in Headers */,
-				17E5ACD92091F03700EE81F1 /* WXCoreStyle.h in Headers */,
 				DCA445D81EFA599400D0CFA8 /* WXRootView.h in Headers */,
+				B8D66C7821255730003960BD /* render_appbar.h in Headers */,
 				DCA446131EFA5A8C00D0CFA8 /* WXCallJSMethod.h in Headers */,
 				BA5F00F31FC6834900F76B5C /* WXLocaleModule.h in Headers */,
 				74B81AED1F73C3E900D3A61D /* WXCellSlotComponent.h in Headers */,
+				B8D66CCA21255730003960BD /* thread_impl.h in Headers */,
 				DCA445E41EFA59DC00D0CFA8 /* WXVideoComponent.h in Headers */,
 				DCA4460B1EFA5A7200D0CFA8 /* WXAssert.h in Headers */,
+				B8D66C3C21255730003960BD /* render_action_update_style.h in Headers */,
 				DCA445F71EFA5A3100D0CFA8 /* WXPickerModule.h in Headers */,
+				B8F2C6E52133A83C00635B37 /* rax_source_locator.h in Headers */,
 				DCA445E71EFA59E900D0CFA8 /* WXTextComponent.h in Headers */,
+				B8D66C1821255730003960BD /* script_bridge.h in Headers */,
 				DCA445D01EFA593E00D0CFA8 /* WXDisplayQueue.h in Headers */,
 				DCA445E21EFA59D700D0CFA8 /* WXRefreshComponent.h in Headers */,
+				B8D66BDE2125572F003960BD /* scanner.h in Headers */,
 				DCA445E81EFA59EF00D0CFA8 /* WXCycleSliderComponent.h in Headers */,
 				DCA4461F1EFA5AB100D0CFA8 /* WXRuleManager.h in Headers */,
 				DCA445E31EFA59DA00D0CFA8 /* WXEmbedComponent.h in Headers */,
 				DCA445DF1EFA59BC00D0CFA8 /* WXLoadingComponent.h in Headers */,
+				B8D66C2E21255730003960BD /* render_manager.h in Headers */,
 				C42E8FAD1F3C7C3F001EBE9D /* WXExtendCallNativeManager.h in Headers */,
 				DCA445CB1EFA590600D0CFA8 /* WXComponent+Layout.h in Headers */,
 				DCA4460F1EFA5A8100D0CFA8 /* WXDiffUtil.h in Headers */,
+				B8D66BEC2125572F003960BD /* token.h in Headers */,
 				DCE7F1F020AD358A00D471E7 /* WXPageEventNotifyEvent.h in Headers */,
 				DCA445F91EFA5A3700D0CFA8 /* WXClipboardModule.h in Headers */,
 				DCA445FD1EFA5A4000D0CFA8 /* WXAnimationModule.h in Headers */,
 				DCA446101EFA5A8500D0CFA8 /* WXBridgeMethod.h in Headers */,
+				B8D66C7E21255730003960BD /* render_text_factory.h in Headers */,
 				DCA446171EFA5A9900D0CFA8 /* WXPolyfillSet.h in Headers */,
 				DCA446291EFA688B00D0CFA8 /* WeexSDK.h in Headers */,
+				B8D66C6A21255730003960BD /* render_mask.h in Headers */,
 				17B122272090ABAC00387E33 /* WXSDKError.h in Headers */,
+				B8D66C1421255730003960BD /* core_side_in_script.h in Headers */,
+				B89543F820EB18B5006EAD63 /* WXCoreBridge.h in Headers */,
 				17F2D6E72087227300084378 /* WXAnalyzerProtocol.h in Headers */,
+				B8D66BEE2125572F003960BD /* vm.h in Headers */,
+				B8D66CC621255730003960BD /* thread_local.h in Headers */,
+				B8D66C6221255730003960BD /* render_cell.h in Headers */,
 				DC7764961F3C685600B5727E /* WXRecyclerDragController.h in Headers */,
 				DCA446161EFA5A9600D0CFA8 /* WXJSCoreBridge.h in Headers */,
 				DCA445F51EFA5A2A00D0CFA8 /* WXURLRewriteDefaultImpl.h in Headers */,
 				DCA445CF1EFA593A00D0CFA8 /* WXInnerLayer.h in Headers */,
+				B8D66C6E21255730003960BD /* render_text.h in Headers */,
 				DCA446041EFA5A5500D0CFA8 /* WXMetaModule.h in Headers */,
+				B8D66BCE2125572F003960BD /* statement.h in Headers */,
+				B8D66C5A21255730003960BD /* render_action_remove_element.h in Headers */,
 				DCA445FC1EFA5A3E00D0CFA8 /* WXStreamModule.h in Headers */,
+				B8D66C5C21255730003960BD /* render_action_add_element.h in Headers */,
+				B8F3323D2141A4C600701BA0 /* string_util.h in Headers */,
 				DCA446091EFA5A6D00D0CFA8 /* WXThreadSafeCounter.h in Headers */,
+				B8D66C3421255730003960BD /* render_action_update_attr.h in Headers */,
 				DCA445F11EFA5A2000D0CFA8 /* WXCanvasComponent.h in Headers */,
+				B8D66CB021255730003960BD /* wson_parser.h in Headers */,
 				DCA445D51EFA598200D0CFA8 /* WXComponent+PseudoClassManagement.h in Headers */,
+				B8D66BC82125572F003960BD /* ast_factory.h in Headers */,
 				DCA4460E1EFA5A7E00D0CFA8 /* WXLength.h in Headers */,
 				DCA445FA1EFA5A3A00D0CFA8 /* WXNavigatorModule.h in Headers */,
 				841CD1061F974DFA0081196D /* WXExceptionUtils.h in Headers */,
 				DCA446081EFA5A6A00D0CFA8 /* NSArray+Weex.h in Headers */,
+				B8D66CAA21255730003960BD /* wson_util.h in Headers */,
+				B8D66CE621255730003960BD /* message_pump.h in Headers */,
 				74B81AE51F73C3E900D3A61D /* WXRecycleListDataManager.h in Headers */,
+				B8D66C3E21255730003960BD /* render_action_createfinish.h in Headers */,
 				DCA445F21EFA5A2300D0CFA8 /* WXHeaderComponent.h in Headers */,
+				B8D66CC221255730003960BD /* time_unit.h in Headers */,
 				DCA445DD1EFA59B300D0CFA8 /* WXRecyclerUpdateController.h in Headers */,
+				B8D66CD021255730003960BD /* waitable_event.h in Headers */,
 				DCA4461E1EFA5AAF00D0CFA8 /* WXComponentFactory.h in Headers */,
+				B8D66CB621255730003960BD /* ViewUtils.h in Headers */,
 				DCA445F41EFA5A2800D0CFA8 /* WXNavigationDefaultImpl.h in Headers */,
+				B8D66C9421255730003960BD /* dom_wson.h in Headers */,
 				DCA445E51EFA59E100D0CFA8 /* WXDivComponent.h in Headers */,
 				DCA446211EFA5ABA00D0CFA8 /* WXSDKInstance_private.h in Headers */,
+				B8D66BD62125572F003960BD /* string_table.h in Headers */,
 				DCA4461D1EFA5AAA00D0CFA8 /* WXHandlerFactory.h in Headers */,
 				DCA445EE1EFA5A1500D0CFA8 /* WXWebComponent.h in Headers */,
 				DCA4460D1EFA5A7900D0CFA8 /* WXThreadSafeMutableArray.h in Headers */,
+				B8D66C3021255730003960BD /* render_action_render_success.h in Headers */,
+				B8D66BD02125572F003960BD /* tokenizer.h in Headers */,
+				B8D66C6C21255730003960BD /* render_scroller.h in Headers */,
+				B8D66BF02125572F003960BD /* op_code.h in Headers */,
+				B8D66CBE21255730003960BD /* closure.h in Headers */,
 				74B81AE31F73C3E300D3A61D /* WXRecycleListComponent.h in Headers */,
+				B8D66CE821255730003960BD /* message_pump_posix.h in Headers */,
 				DCA445DA1EFA59A600D0CFA8 /* WXMultiColumnLayout.h in Headers */,
 				DCA445E01EFA59CD00D0CFA8 /* WXLoadingIndicator.h in Headers */,
+				B8F2C6ED2133A83C00635B37 /* rax_jsx_ast.h in Headers */,
 				17036A4F20FDE72F0029AE3D /* WXApmForInstance.h in Headers */,
 				DCA445E61EFA59E500D0CFA8 /* WXImageComponent.h in Headers */,
 				DCA4461B1EFA5AA200D0CFA8 /* WXDatePickerManager.h in Headers */,
 				DCA445D71EFA598D00D0CFA8 /* WXComponent+ViewManagement.h in Headers */,
-				178EDF0D204FEC1300917F6B /* WXScrollerComponent+Layout.h in Headers */,
 				DCA445D31EFA594A00D0CFA8 /* WXRoundedRect.h in Headers */,
+				B8D66CEA21255730003960BD /* message_pump_darwin.h in Headers */,
+				B8D66BFE2125572F003960BD /* render_performance.h in Headers */,
 				DCA445EA1EFA5A0300D0CFA8 /* WXCellComponent.h in Headers */,
 				DCA446201EFA5AB800D0CFA8 /* WXComponent+Navigation.h in Headers */,
 				DCA445F81EFA5A3500D0CFA8 /* WXGlobalEventModule.h in Headers */,
@@ -1943,31 +3079,51 @@
 				DCA446071EFA5A6500D0CFA8 /* WXWeakObjectWrapper.h in Headers */,
 				DCA446111EFA5A8800D0CFA8 /* WXModuleMethod.h in Headers */,
 				DCA446011EFA5A4B00D0CFA8 /* WXTimerModule.h in Headers */,
+				B8D66C1A21255730003960BD /* measure_func_adapter.h in Headers */,
 				DCA446001EFA5A4800D0CFA8 /* WXDomModule.h in Headers */,
 				DCA446021EFA5A5000D0CFA8 /* WXWebViewModule.h in Headers */,
+				B8D66BF22125572F003960BD /* ast_visitor.h in Headers */,
 				C42E8FAA1F3C7AA1001EBE9D /* WXTracingProtocol.h in Headers */,
 				DCA446181EFA5A9B00D0CFA8 /* JSValue+Weex.h in Headers */,
 				DCA446061EFA5A5B00D0CFA8 /* NSTimer+Weex.h in Headers */,
 				DCA445D61EFA598600D0CFA8 /* WXView.h in Headers */,
+				B8D66C7C21255730003960BD /* render_mask_factory.h in Headers */,
 				DCA445FF1EFA5A4600D0CFA8 /* WXInstanceWrap.h in Headers */,
 				DCE2CF9C1F46D4310021BDC4 /* WXVoiceOverModule.h in Headers */,
 				C42E8FAB1F3C7C09001EBE9D /* WXExtendCallNativeProtocol.h in Headers */,
 				17E5ACE3209211C200EE81F1 /* WXTransition.h in Headers */,
 				DCA445F31EFA5A2500D0CFA8 /* WXFooterComponent.h in Headers */,
 				DCA446151EFA5A9000D0CFA8 /* WXBridgeContext.h in Headers */,
+				B8D66BE62125572F003960BD /* object.h in Headers */,
 				DCA4461A1EFA5AA000D0CFA8 /* WXInvocationConfig.h in Headers */,
 				DCA445DC1EFA59AD00D0CFA8 /* WXRecyclerDataController.h in Headers */,
 				DCA446191EFA5A9E00D0CFA8 /* WXServiceFactory.h in Headers */,
 				DCA446121EFA5A8A00D0CFA8 /* WXComponentMethod.h in Headers */,
+				B8D66CD821255730003960BD /* CoreConstants.h in Headers */,
+				B8D66C1021255730003960BD /* core_side_in_platform.h in Headers */,
+				B8D66CCE21255730003960BD /* thread.h in Headers */,
 				DCA445D41EFA594E00D0CFA8 /* UIBezierPath+Weex.h in Headers */,
 				DCA446031EFA5A5200D0CFA8 /* WXCanvasModule.h in Headers */,
+				B8D66C4221255730003960BD /* render_action_add_event.h in Headers */,
 				DCA445EF1EFA5A1800D0CFA8 /* WXSwitchComponent.h in Headers */,
+				B8D66CB421255730003960BD /* make_copyable.h in Headers */,
+				B8D66C0A21255730003960BD /* core_environment.h in Headers */,
+				B8D66CA421255730003960BD /* wson.h in Headers */,
+				B8D66CB821255730003960BD /* common.h in Headers */,
 				C49642EC1F73E6DF0092CC5A /* WXWebSocketHandler.h in Headers */,
+				B8D66BE22125572F003960BD /* handle.h in Headers */,
 				DCA445EB1EFA5A0B00D0CFA8 /* WXTextInputComponent.h in Headers */,
+				B8D66C5821255730003960BD /* render_action_layout.h in Headers */,
 				DCA4460C1EFA5A7600D0CFA8 /* WXThreadSafeMutableDictionary.h in Headers */,
+				B8F2C7152133A8BC00635B37 /* vm_monitor.h in Headers */,
+				B8394F3821468AF100CA1EFF /* render_action_trigger_vsync.h in Headers */,
+				B8F2C6EF2133A83C00635B37 /* class.h in Headers */,
+				B8D66CDE21255730003960BD /* message_loop.h in Headers */,
 				DCA445CE1EFA593500D0CFA8 /* WXComponent+BoxShadow.h in Headers */,
+				B8F2C70F2133A83C00635B37 /* rax_parser.h in Headers */,
 				74B81AF11F73C3E900D3A61D /* WXJSASTParser.h in Headers */,
-				178EDF0F204FF11700917F6B /* WXCoreLayout.h in Headers */,
+				B8D66C0C21255730003960BD /* platform_bridge.h in Headers */,
+				B8D66C8C21255730003960BD /* render_list_factory.h in Headers */,
 				DCA4461C1EFA5AA600D0CFA8 /* WXModuleFactory.h in Headers */,
 				DCA445D91EFA59A100D0CFA8 /* WXEditComponent.h in Headers */,
 				DCA445FB1EFA5A3C00D0CFA8 /* WXStorageModule.h in Headers */,
@@ -1990,7 +3146,7 @@
 				2A42AF811C23B33E00818EA6 /* Sources */,
 				2A42AF821C23B33E00818EA6 /* Frameworks */,
 				2A42AF831C23B33E00818EA6 /* Copy Files */,
-				2A42AF8E1C23B35900818EA6 /* ShellScript */,
+				2A42AF8E1C23B35900818EA6 /* Run Script */,
 			);
 			buildRules = (
 			);
@@ -2042,8 +3198,8 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = DCA4452C1EFA555400D0CFA8 /* Build configuration list for PBXNativeTarget "WeexSDK-Dynamic" */;
 			buildPhases = (
-				DCA445201EFA555400D0CFA8 /* Sources */,
 				DCA445C81EFA584000D0CFA8 /* Generate WeexSDK.h */,
+				DCA445201EFA555400D0CFA8 /* Sources */,
 				DCA445211EFA555400D0CFA8 /* Frameworks */,
 				DCA445221EFA555400D0CFA8 /* Headers */,
 				DCA445231EFA555400D0CFA8 /* Resources */,
@@ -2063,7 +3219,7 @@
 		77D160F41C02DBE70010B15B /* Project object */ = {
 			isa = PBXProject;
 			attributes = {
-				LastUpgradeCheck = 0940;
+				LastUpgradeCheck = 1000;
 				ORGANIZATIONNAME = taobao;
 				TargetAttributes = {
 					2A42AF841C23B33E00818EA6 = {
@@ -2142,18 +3298,19 @@
 /* End PBXResourcesBuildPhase section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		2A42AF8E1C23B35900818EA6 /* ShellScript */ = {
+		2A42AF8E1C23B35900818EA6 /* Run Script */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 			);
 			inputPaths = (
 			);
+			name = "Run Script";
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "# Sets the target folders and the final framework product.\n# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME\nFMK_NAME=${PROJECT_NAME}\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nINSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework\n# -configuration ${CONFIGURATION}\n# Clean and Building both architectures.\necho xcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nxcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nif [ \"$?\" != \"0\" ]; then\nexit 1\nfi\necho xcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nxcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nif [ \"$?\" != \"0\" ]; then\nexit 1\nfi\n# Cleaning the oldest.\nif [ -d \"${INSTALL_DIR}\" ]\nthen\nrm -rf \"${INSTALL_DIR}\"\nfi\nmkdir -p \"${INSTALL_DIR}\"\ncp -R \"${SIMULATOR_DIR}/\" \"${INSTALL_DIR}/\"\n# 移除签名资源和 Info.plist\nrm \"${INSTALL_DIR}/Info.plist\"\nrm -rf \"${INSTALL_DIR}/_CodeSignature\"\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/${FMK_NAME}\" \"${SIMULATOR_DIR}/${FMK_NAME}\" -output \"${INSTALL_DIR}/${FMK_NAME}\"\nrm -r \"${WRK_DIR}\"";
+			shellScript = "# Sets the target folders and the final framework product.\n# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME\nFMK_NAME=${PROJECT_NAME}\n# Install dir will be the final output to the framework.\n# The following line create it in the root folder of the current project.\nINSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework\n# Working dir will be deleted after the framework creation.\nWRK_DIR=build\nDEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework\nSIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework\n# -configuration ${CONFIGURATION}\n# Clean and Building both architectures.\necho xcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nxcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphoneos \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nif [ \"$?\" != \"0\" ]; then\nexit 1\nfi\necho xcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nxcodebuild -configuration \"Release\" -target \"${FMK_NAME}\" -sdk iphonesimulator \"CODE_SIGN_IDENTITY=${CODE_SIGN_IDENTITY}\" clean build\nif [ \"$?\" != \"0\" ]; then\nexit 1\nfi\n# Cleaning the oldest.\nif [ -d \"${INSTALL_DIR}\" ]\nthen\nrm -rf \"${INSTALL_DIR}\"\nfi\nmkdir -p \"${INSTALL_DIR}\"\ncp -R \"${SIMULATOR_DIR}/\" \"${INSTALL_DIR}/\"\n# 移除签名资源和 Info.plist\nrm \"${INSTALL_DIR}/Info.plist\"\nrm -rf \"${INSTALL_DIR}/_CodeSignature\"\n# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.\nlipo -create \"${DEVICE_DIR}/${FMK_NAME}\" \"${SIMULATOR_DIR}/${FMK_NAME}\" -output \"${INSTALL_DIR}/${FMK_NAME}\"\nrm -r \"${WRK_DIR}\"\n";
 		};
 		59D3CA601D003832008835DC /* Generate WeexSDK.h */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -2167,7 +3324,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = ". \"${PROJECT_DIR}/buildScripts.sh\"\n\ngenerateSDKHeader 'WeexSDK'";
+			shellScript = ". \"${PROJECT_DIR}/buildScripts.sh\"\n\ngenerateSDKHeader 'WeexSDK'\n";
 		};
 		DCA445C81EFA584000D0CFA8 /* Generate WeexSDK.h */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -2222,7 +3379,6 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				176BE43E209172E20086B6AF /* WXScrollerComponent+Layout.mm in Sources */,
 				77D161291C02DE1A0010B15B /* WXSDKManager.m in Sources */,
 				7461F8911CFB373100F62D44 /* WXDisplayQueue.m in Sources */,
 				74896F311D1AC79400D1D593 /* NSObject+WXSwizzle.m in Sources */,
@@ -2233,90 +3389,148 @@
 				747DF6831E31AEE4005C53A8 /* WXLength.m in Sources */,
 				17E5ACE2209211BD00EE81F1 /* WXTransition.mm in Sources */,
 				77E65A0E1C155E99008B8775 /* WXDivComponent.m in Sources */,
+				B8D66BF92125572F003960BD /* exec_state.cc in Sources */,
+				B8D66CAB21255730003960BD /* wson_util.cpp in Sources */,
 				ED053502207F4DEB007B4568 /* JSContext+Weex.m in Sources */,
 				2A60CE9D1C91733E00857B9F /* WXSwitchComponent.mm in Sources */,
 				744D61111E49979000B624B3 /* WXFooterComponent.m in Sources */,
+				B8D66C0721255730003960BD /* core_environment.cpp in Sources */,
 				745B2D6F1E5A8E1E0092D38A /* WXRecyclerUpdateController.m in Sources */,
 				745B2D6B1E5A8E1E0092D38A /* WXRecyclerComponent.mm in Sources */,
+				B8D66C0D21255730003960BD /* core_side_in_platform.cpp in Sources */,
+				B8D66C5D21255730003960BD /* render_action_appendtree_createfinish.cpp in Sources */,
 				2A837AB71CD9DE9200AEDF03 /* WXRefreshComponent.mm in Sources */,
 				74A4BA9B1CB3BAA100195969 /* WXThreadSafeMutableDictionary.m in Sources */,
 				77E65A1A1C155F25008B8775 /* WXScrollerComponent.mm in Sources */,
 				747A787D1D1BAAC900DED9D0 /* WXComponent+ViewManagement.mm in Sources */,
-				1771795521412A5D006F39A9 /* WXApmForInstance.m in Sources */,
 				C4E375371E5FCBD3009B2D9C /* WXComponent+BoxShadow.m in Sources */,
 				C43C03E91EC8ACA40044C7FF /* WXPrerenderManager.m in Sources */,
+				B8D66BD12125572F003960BD /* statement.cc in Sources */,
+				B8D66CDF21255730003960BD /* message_loop.cc in Sources */,
+				B8F2C6F82133A83C00635B37 /* class.cc in Sources */,
+				B8D66CC321255730003960BD /* thread_impl_posix.cc in Sources */,
+				B8D66C4B21255730003960BD /* render_action_remove_event.cpp in Sources */,
+				B8F2C6F22133A83C00635B37 /* class_factory.cc in Sources */,
+				B8D66BD32125572F003960BD /* vm.cc in Sources */,
 				2A837AB51CD9DE9200AEDF03 /* WXLoadingIndicator.m in Sources */,
+				B8D66BBF2125572F003960BD /* vnode_render_manager.cc in Sources */,
+				B8D66C6321255730003960BD /* render_text.cpp in Sources */,
 				C4F012831E1502E9003378D0 /* WXWebSocketModule.m in Sources */,
+				B8D66CE121255730003960BD /* message_pump_darwin.cc in Sources */,
 				DCF087621DCAE161005CD6EB /* WXInvocationConfig.m in Sources */,
 				C47B78CF1F2998EE001D3B0C /* WXExtendCallNativeManager.m in Sources */,
 				77D161311C02DE4E0010B15B /* WXComponent.mm in Sources */,
 				74CFDD461F459443007A1A66 /* WXRecycleListUpdateManager.m in Sources */,
+				B8F2C7102133A83C00635B37 /* ast_builder.cc in Sources */,
+				B8F2C7042133A83C00635B37 /* class_array.cc in Sources */,
 				74862F7A1E02B88D00B7A041 /* JSValue+Weex.m in Sources */,
+				B8D66BC52125572F003960BD /* tokenizer.cc in Sources */,
+				B8D66C7321255730003960BD /* render_list.cpp in Sources */,
+				B8D66BC92125572F003960BD /* ast.cc in Sources */,
 				740451EB1E14BB26004157CB /* WXServiceFactory.m in Sources */,
+				B8D66C6521255730003960BD /* render_mask.cpp in Sources */,
 				77E659DB1C07F594008B8775 /* WXDomModule.m in Sources */,
 				D3FC0DF81C508B2A002B9E31 /* WXTimerModule.m in Sources */,
 				594C28921CF9E61A009793A4 /* WXAnimationModule.m in Sources */,
+				B8D66C6F21255730003960BD /* render_object.cpp in Sources */,
+				B8D66BB92125572F003960BD /* vnode.cc in Sources */,
 				59A5961D1CB630F10012CD52 /* WXComponent+Navigation.m in Sources */,
+				B8F2C6FC2133A83C00635B37 /* rax_parser_builder.cc in Sources */,
 				77D161631C02ED790010B15B /* WXLog.m in Sources */,
 				17C74F0D2072145100AB4CAB /* WXAnalyzerCenter.m in Sources */,
-				59A582FD1CF5B17B0081FD3E /* WXBridgeContext.m in Sources */,
-				17C7B50620452E1800A2296A /* WXCoreLayout.cpp in Sources */,
 				743933B51C7ED9AA00773BB7 /* WXSimulatorShortcutManager.m in Sources */,
 				BA5F00F21FC5AFFE00F76B5C /* WXLocaleModule.m in Sources */,
+				B8D66C9F21255730003960BD /* json11.cc in Sources */,
+				B8D66CCB21255730003960BD /* thread_impl_darwin.cc in Sources */,
+				B8D66BB72125572F003960BD /* vnode_exec_env.cc in Sources */,
 				74BB5FBA1DFEE81A004FC3DF /* WXMetaModule.m in Sources */,
 				741081201CED585A001BC6E5 /* WXComponentManager.mm in Sources */,
 				1D3000F21D40B9AC004F3B4F /* WXClipboardModule.m in Sources */,
+				B8F2C6EA2133A83C00635B37 /* rax_source_locator.cc in Sources */,
 				741DFE071DDD9B30009B020F /* UIBezierPath+Weex.m in Sources */,
 				D312CE3C1C730DEB00046D68 /* WXWebComponent.m in Sources */,
+				B8D66C4721255730003960BD /* render_action_add_event.cpp in Sources */,
+				B8D66BAD2125572F003960BD /* code_generator.cc in Sources */,
 				74AD99851D5B0E59008F0336 /* WXPolyfillSet.m in Sources */,
 				D317338D1C57257000BB7539 /* WXTransform.m in Sources */,
+				B8D66BAF2125572F003960BD /* ast_factory.cc in Sources */,
 				7461F8A91CFC33A800F62D44 /* WXThreadSafeMutableArray.m in Sources */,
 				745B2D6D1E5A8E1E0092D38A /* WXRecyclerDataController.m in Sources */,
+				B8D66BF32125572F003960BD /* object.cc in Sources */,
 				2AC750251C7565690041D390 /* WXIndicatorComponent.m in Sources */,
 				591DD3311D23AD5800BE8709 /* WXErrorView.m in Sources */,
+				B8D66C1121255730003960BD /* core_side_in_script.cpp in Sources */,
+				B8D66C032125572F003960BD /* css_value_getter.cpp in Sources */,
+				B8394F3921468AF100CA1EFF /* render_action_trigger_vsync.cpp in Sources */,
+				B8F2C6F62133A83C00635B37 /* rax_parser_context.cc in Sources */,
+				B8A72C9E213F8BAE0024E7BE /* class_json.cc in Sources */,
 				59D3CA4B1CFC3CE1008835DC /* NSTimer+Weex.m in Sources */,
 				59A596321CB632050012CD52 /* WXRootViewController.m in Sources */,
 				DCC77C131D770AE300CE7288 /* WXSliderNeighborComponent.mm in Sources */,
 				2A8E658B1C7C7AA20025C7B7 /* WXVideoComponent.m in Sources */,
+				B8D66CBB21255730003960BD /* time_point.cc in Sources */,
 				74862F7E1E03A0F300B7A041 /* WXModuleMethod.m in Sources */,
+				B8D66C4D21255730003960BD /* render_action_move_element.cpp in Sources */,
 				742AD7341DF98C45007DC46C /* WXResourceResponse.m in Sources */,
 				77E65A161C155EB5008B8775 /* WXTextComponent.mm in Sources */,
 				C4D872261E5DDF7500E39BC1 /* WXBoxShadow.m in Sources */,
+				B8D66BB32125572F003960BD /* parser.cc in Sources */,
 				746319031C60AFC100EFEBD4 /* WXThreadSafeCounter.m in Sources */,
+				B8D66C8321255730003960BD /* render_creator.cpp in Sources */,
 				74A4BAA71CB4F98300195969 /* WXStreamModule.m in Sources */,
 				744D610D1E49978200B624B3 /* WXHeaderComponent.mm in Sources */,
+				B8F2C7062133A83C00635B37 /* rax_parser_scope.cc in Sources */,
 				77E659F21C0C3612008B8775 /* WXModuleFactory.m in Sources */,
+				B8D66C5F21255730003960BD /* render_action_render_success.cpp in Sources */,
 				DCF343681E49CAEE00A2FB34 /* WXJSExceptionInfo.m in Sources */,
+				B863DF322107308000EA887D /* WXBridgeContext.m in Sources */,
 				59CE27E91CC387DB000BE37A /* WXEmbedComponent.m in Sources */,
 				DCA0EF651D6EED6F00CB18B9 /* WXGlobalEventModule.m in Sources */,
+				453267152140E38900DAA620 /* vcomponent.cc in Sources */,
 				2A919DA71E321F1F006EB6B5 /* WXBridgeMethod.m in Sources */,
 				7423EB521F4ADE30001662D1 /* WXComponent+DataBinding.mm in Sources */,
 				DCAB35FF1D658EB700C0EA70 /* WXRuleManager.m in Sources */,
 				77D161251C02DDD10010B15B /* WXSDKInstance.m in Sources */,
 				DC7764931F3C2CA300B5727E /* WXRecyclerDragController.m in Sources */,
 				744D61151E4AF23E00B624B3 /* WXDiffUtil.m in Sources */,
+				B8D66C4321255730003960BD /* render_action_remove_element.cpp in Sources */,
+				B8D66BFB2125572F003960BD /* render_performance.cpp in Sources */,
 				74EF31AE1DE58BE200667A07 /* WXURLRewriteDefaultImpl.m in Sources */,
 				17B122262090AAB000387E33 /* WXSDKError.m in Sources */,
+				B8D66C1F21255730003960BD /* layout.cpp in Sources */,
+				B8D66C2B21255730003960BD /* render_manager.cpp in Sources */,
 				C4B3D6D51E6954300013F38D /* WXEditComponent.mm in Sources */,
 				C4C30DE81E1B833D00786B6C /* WXComponent+PseudoClassManagement.m in Sources */,
-				17C7B50920452E1800A2296A /* WXCoreStyle.cpp in Sources */,
+				B8D66C4F21255730003960BD /* render_action_add_element.cpp in Sources */,
+				B8D66C3F21255730003960BD /* render_action_update_style.cpp in Sources */,
 				74915F481C8EB02B00BEBCC0 /* WXAssert.m in Sources */,
 				59A596251CB6311F0012CD52 /* WXStorageModule.m in Sources */,
 				2AFEB17C1C747139000507FA /* WXInstanceWrap.m in Sources */,
 				74A4BA5C1CABBBD000195969 /* WXDebugTool.m in Sources */,
 				742AD73B1DF98C8B007DC46C /* WXResourceLoader.m in Sources */,
+				B8A72CA0213F8BAE0024E7BE /* class_string.cc in Sources */,
+				B8D66C6721255730003960BD /* render_scroller.cpp in Sources */,
+				B8D66C5321255730003960BD /* render_action_createbody.cpp in Sources */,
+				B8D66BA92125572F003960BD /* table.cc in Sources */,
+				B8D66C5521255730003960BD /* render_action_createfinish.cpp in Sources */,
 				D334510D1D3E19B80083598A /* WXCanvasModule.m in Sources */,
+				B8D66C1D21255730003960BD /* style.cpp in Sources */,
+				B89543F520EB18B5006EAD63 /* WXJSCoreBridge.mm in Sources */,
 				741081241CED6756001BC6E5 /* WXComponentFactory.m in Sources */,
 				D362F9501C83EDA20003F546 /* WXWebViewModule.m in Sources */,
 				745B2D711E5A8E1E0092D38A /* WXSectionDataController.m in Sources */,
 				DCE2CF9A1F46D4220021BDC4 /* WXVoiceOverModule.m in Sources */,
 				2A1F57B81C75C6A600B58017 /* WXTextInputComponent.m in Sources */,
 				74CC7A1D1C2BC5F800829368 /* WXCellComponent.mm in Sources */,
+				B8D66BA72125572F003960BD /* string_table.cc in Sources */,
 				74862F821E03A24500B7A041 /* WXComponentMethod.m in Sources */,
 				77E65A121C155EA8008B8775 /* WXImageComponent.m in Sources */,
 				74CFDD3E1F459400007A1A66 /* WXRecycleListDataManager.m in Sources */,
+				4532670B213FC84A00DAA620 /* WXDisplayLinkManager.m in Sources */,
 				2A837AB31CD9DE9200AEDF03 /* WXLoadingComponent.mm in Sources */,
 				2AE5B7531CAB7DBD0082FDDB /* WXAComponent.m in Sources */,
+				B8D66C9521255730003960BD /* dom_wson.cpp in Sources */,
+				B8F2C70C2133A83C00635B37 /* rax_parser.cc in Sources */,
 				176BE43C209172330086B6AF /* WXComponent+Layout.mm in Sources */,
 				74CFDD3A1F45939C007A1A66 /* WXRecycleListComponent.mm in Sources */,
 				741DFE031DDD7D18009B020F /* WXRoundedRect.mm in Sources */,
@@ -2325,28 +3539,40 @@
 				7423899C1C3174EB00D748CA /* WXWeakObjectWrapper.m in Sources */,
 				744BEA561D05178F00452B5D /* WXComponent+Display.m in Sources */,
 				7408C48F1CFB345D000BCCD0 /* WXComponent+Events.m in Sources */,
+				B89543F320EB18B5006EAD63 /* WXCoreBridge.mm in Sources */,
 				C4F012871E150307003378D0 /* WXWebSocketLoader.m in Sources */,
+				B8D66C2721255730003960BD /* render_page.cpp in Sources */,
 				C4D872211E5DDEDA00E39BC1 /* WXInnerLayer.m in Sources */,
+				B8D66C7121255730003960BD /* render_appbar.cpp in Sources */,
+				B8D66CAD21255730003960BD /* wson_parser.cpp in Sources */,
 				74BA4AB41F70F4B600AC29BF /* WXRecycleListLayout.m in Sources */,
 				745ED2DB1C5F2C7E002DB5A8 /* WXView.m in Sources */,
 				DC03ADB91D508719003F76E7 /* WXTextAreaComponent.mm in Sources */,
 				59A596231CB6311F0012CD52 /* WXNavigatorModule.m in Sources */,
+				B8D66CA721255730003960BD /* wson.c in Sources */,
 				37B51EE51E97804D0040A743 /* WXCycleSliderComponent.mm in Sources */,
 				77D161211C02DDB40010B15B /* WXSDKEngine.m in Sources */,
 				D33451091D3E19480083598A /* WXCanvasComponent.m in Sources */,
 				74A4BA971CB365D100195969 /* WXAppConfiguration.m in Sources */,
 				17B122212090AA9300387E33 /* WXSDKInstance_performance.m in Sources */,
+				B8D66C3921255730003960BD /* render_action_layout.cpp in Sources */,
 				59A583091CF5B2FD0081FD3E /* WXNavigationDefaultImpl.m in Sources */,
+				B8D66BF52125572F003960BD /* token.cc in Sources */,
 				746B923C1F46BE36009AE86B /* WXCellSlotComponent.mm in Sources */,
 				7463192A1C71B92600EFEBD4 /* WXModalUIModule.m in Sources */,
 				77D161501C02E3880010B15B /* WXUtility.m in Sources */,
+				B8F2C6F42133A83C00635B37 /* rax_parser_statistics.cc in Sources */,
+				1771795721416DF0006F39A9 /* WXApmForInstance.m in Sources */,
 				74A4BA9F1CB3C0A100195969 /* WXHandlerFactory.m in Sources */,
+				B8D66C3721255730003960BD /* render_action_update_attr.cpp in Sources */,
+				B8F2C6F02133A83C00635B37 /* rax_jsx_ast.cc in Sources */,
+				B8D66BBB2125572F003960BD /* vnode_render_context.cc in Sources */,
 				841CD1031F9739890081196D /* WXExceptionUtils.m in Sources */,
+				B8D66CD921255730003960BD /* message_pump_posix.cc in Sources */,
 				C4E97D341F1EF46D00ABC314 /* WXTracingManager.m in Sources */,
 				742AD72F1DF98C45007DC46C /* WXResourceRequest.m in Sources */,
 				7461F8931CFB373100F62D44 /* WXLayer.m in Sources */,
 				74D205211E091B8000128F44 /* WXCallJSMethod.m in Sources */,
-				77D1613D1C02DEA60010B15B /* WXJSCoreBridge.m in Sources */,
 				C41E1A981DC1FD15009C7F90 /* WXDatePickerManager.m in Sources */,
 				77D1614C1C02E3790010B15B /* WXConvert.m in Sources */,
 				749DC27C1D40827B009E1C91 /* WXMonitor.m in Sources */,
@@ -2361,81 +3587,143 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4532670D213FCFB400DAA620 /* WXDisplayLinkManager.m in Sources */,
+				B863DF332107313400EA887D /* WXBridgeContext.m in Sources */,
+				B82A159A20F857450098A509 /* WXWebSocketLoader.m in Sources */,
+				B82A159920F857200098A509 /* WXSDKError.m in Sources */,
+				B82A159820F8556F0098A509 /* WXSDKInstance_performance.m in Sources */,
+				B82A159B20F857470098A509 /* WXWebSocketModule.m in Sources */,
 				BA5F00F41FC6834C00F76B5C /* WXLocaleModule.m in Sources */,
 				DCA4452F1EFA55B300D0CFA8 /* WXResourceLoader.m in Sources */,
 				DCA445301EFA55B300D0CFA8 /* WXComponent+Events.m in Sources */,
 				DCA445311EFA55B300D0CFA8 /* WXComponent+BoxShadow.m in Sources */,
 				DCA445321EFA55B300D0CFA8 /* WXInnerLayer.m in Sources */,
+				B8D66BFA2125572F003960BD /* exec_state.cc in Sources */,
+				B8D66CAC21255730003960BD /* wson_util.cpp in Sources */,
 				DCA445331EFA55B300D0CFA8 /* WXDisplayQueue.m in Sources */,
 				DCA445341EFA55B300D0CFA8 /* WXLayer.m in Sources */,
 				DCA445351EFA55B300D0CFA8 /* WXComponent+Display.m in Sources */,
+				B8D66C0821255730003960BD /* core_environment.cpp in Sources */,
 				DCA445361EFA55B300D0CFA8 /* WXRoundedRect.mm in Sources */,
 				DCA445371EFA55B300D0CFA8 /* UIBezierPath+Weex.m in Sources */,
+				B8D66C0E21255730003960BD /* core_side_in_platform.cpp in Sources */,
+				B8D66C5E21255730003960BD /* render_action_appendtree_createfinish.cpp in Sources */,
 				DCA445381EFA55B300D0CFA8 /* WXDebugTool.m in Sources */,
 				DCA445391EFA55B300D0CFA8 /* WXComponent+PseudoClassManagement.m in Sources */,
 				DCA4453A1EFA55B300D0CFA8 /* WXView.m in Sources */,
 				DCA4453B1EFA55B300D0CFA8 /* WXErrorView.m in Sources */,
 				74B81AEC1F73C3E900D3A61D /* WXRecycleListLayout.m in Sources */,
 				DCA4453C1EFA55B300D0CFA8 /* WXComponent+ViewManagement.mm in Sources */,
+				B8D66BD22125572F003960BD /* statement.cc in Sources */,
+				B8D66CE021255730003960BD /* message_loop.cc in Sources */,
+				B8F2C6F92133A83C00635B37 /* class.cc in Sources */,
+				B8D66CC421255730003960BD /* thread_impl_posix.cc in Sources */,
+				B8D66C4C21255730003960BD /* render_action_remove_event.cpp in Sources */,
+				B8F2C6F32133A83C00635B37 /* class_factory.cc in Sources */,
+				B8D66BD42125572F003960BD /* vm.cc in Sources */,
 				74B81AE41F73C3E500D3A61D /* WXRecycleListComponent.mm in Sources */,
+				B8D66BC02125572F003960BD /* vnode_render_manager.cc in Sources */,
+				B8D66C6421255730003960BD /* render_text.cpp in Sources */,
 				DC7764951F3C685200B5727E /* WXRecyclerDragController.m in Sources */,
+				B8D66CE221255730003960BD /* message_pump_darwin.cc in Sources */,
+				B89543F420EB18B5006EAD63 /* WXCoreBridge.mm in Sources */,
 				DCA4453D1EFA55B300D0CFA8 /* WXRootView.m in Sources */,
 				DCA4453E1EFA55B300D0CFA8 /* WXBaseViewController.m in Sources */,
+				B8394F3A21468AF100CA1EFF /* render_action_trigger_vsync.cpp in Sources */,
 				DCA4453F1EFA55B300D0CFA8 /* WXRootViewController.m in Sources */,
+				B8F2C7112133A83C00635B37 /* ast_builder.cc in Sources */,
+				B8F2C7052133A83C00635B37 /* class_array.cc in Sources */,
 				DCA445401EFA55B300D0CFA8 /* WXEditComponent.mm in Sources */,
-				176BE43D209172A30086B6AF /* WXScrollerComponent+Layout.mm in Sources */,
+				B8D66BC62125572F003960BD /* tokenizer.cc in Sources */,
+				B8D66C7421255730003960BD /* render_list.cpp in Sources */,
+				B8D66BCA2125572F003960BD /* ast.cc in Sources */,
 				DCA445411EFA55B300D0CFA8 /* WXMultiColumnLayout.m in Sources */,
+				B8D66C6621255730003960BD /* render_mask.cpp in Sources */,
 				DCA445421EFA55B300D0CFA8 /* WXRecyclerComponent.mm in Sources */,
 				DCA445431EFA55B300D0CFA8 /* WXRecyclerDataController.m in Sources */,
 				DCA445441EFA55B300D0CFA8 /* WXRecyclerUpdateController.m in Sources */,
+				B8D66C7021255730003960BD /* render_object.cpp in Sources */,
+				B8D66BBA2125572F003960BD /* vnode.cc in Sources */,
 				DCA445451EFA55B300D0CFA8 /* WXSectionDataController.m in Sources */,
+				B8F2C6FD2133A83C00635B37 /* rax_parser_builder.cc in Sources */,
 				DCA445461EFA55B300D0CFA8 /* WXLoadingComponent.mm in Sources */,
 				DCA445471EFA55B300D0CFA8 /* WXSliderNeighborComponent.mm in Sources */,
 				DCA445481EFA55B300D0CFA8 /* WXLoadingIndicator.m in Sources */,
 				DCA445491EFA55B300D0CFA8 /* WXRefreshComponent.mm in Sources */,
+				B8D66CA021255730003960BD /* json11.cc in Sources */,
+				B8D66CCC21255730003960BD /* thread_impl_darwin.cc in Sources */,
+				B8D66BB82125572F003960BD /* vnode_exec_env.cc in Sources */,
 				DCA4454A1EFA55B300D0CFA8 /* WXEmbedComponent.m in Sources */,
 				74B81AE81F73C3E900D3A61D /* WXRecycleListTemplateManager.m in Sources */,
 				DCA4454B1EFA55B300D0CFA8 /* WXVideoComponent.m in Sources */,
+				B8F2C6EB2133A83C00635B37 /* rax_source_locator.cc in Sources */,
 				74B81AE61F73C3E900D3A61D /* WXRecycleListDataManager.m in Sources */,
 				DCA4454C1EFA55B300D0CFA8 /* WXComponent.mm in Sources */,
+				B8D66C4821255730003960BD /* render_action_add_event.cpp in Sources */,
+				B8D66BAE2125572F003960BD /* code_generator.cc in Sources */,
 				DCA4454D1EFA55B300D0CFA8 /* WXDivComponent.m in Sources */,
 				DCA4454E1EFA55B300D0CFA8 /* WXImageComponent.m in Sources */,
+				B8D66BB02125572F003960BD /* ast_factory.cc in Sources */,
 				DCA4454F1EFA55B300D0CFA8 /* WXTextComponent.mm in Sources */,
 				DCA445501EFA55B300D0CFA8 /* WXScrollerComponent.mm in Sources */,
+				B8D66BF42125572F003960BD /* object.cc in Sources */,
 				DCA445511EFA55B300D0CFA8 /* WXCycleSliderComponent.mm in Sources */,
 				DCE2CF9D1F46D4370021BDC4 /* WXVoiceOverModule.m in Sources */,
+				B8D66C1221255730003960BD /* core_side_in_script.cpp in Sources */,
+				B8D66C042125572F003960BD /* css_value_getter.cpp in Sources */,
+				B8F2C6F72133A83C00635B37 /* rax_parser_context.cc in Sources */,
+				B8A72C9F213F8BAE0024E7BE /* class_json.cc in Sources */,
 				DCA445531EFA55B300D0CFA8 /* WXCellComponent.mm in Sources */,
 				DCA445541EFA55B300D0CFA8 /* WXListComponent.mm in Sources */,
 				DCA445551EFA55B300D0CFA8 /* WXIndicatorComponent.m in Sources */,
 				17E5ACDB2091F05700EE81F1 /* WXComponent+Layout.mm in Sources */,
+				B8D66CBC21255730003960BD /* time_point.cc in Sources */,
 				DCA445561EFA55B300D0CFA8 /* WXTextInputComponent.m in Sources */,
+				B8D66C4E21255730003960BD /* render_action_move_element.cpp in Sources */,
 				DCA445571EFA55B300D0CFA8 /* WXTextAreaComponent.mm in Sources */,
 				DCA445581EFA55B300D0CFA8 /* WXTransform.m in Sources */,
 				DCA445591EFA55B300D0CFA8 /* WXWebComponent.m in Sources */,
+				B8D66BB42125572F003960BD /* parser.cc in Sources */,
 				DCA4455A1EFA55B300D0CFA8 /* WXSwitchComponent.mm in Sources */,
+				B8D66C8421255730003960BD /* render_creator.cpp in Sources */,
 				DCA4455B1EFA55B300D0CFA8 /* WXAComponent.m in Sources */,
+				B8F2C7072133A83C00635B37 /* rax_parser_scope.cc in Sources */,
 				DCA4455C1EFA55B300D0CFA8 /* WXCanvasComponent.m in Sources */,
 				DCA4455D1EFA55B300D0CFA8 /* WXHeaderComponent.mm in Sources */,
+				1771795821416DF1006F39A9 /* WXApmForInstance.m in Sources */,
+				B8D66C6021255730003960BD /* render_action_render_success.cpp in Sources */,
 				DCA4455E1EFA55B300D0CFA8 /* WXFooterComponent.m in Sources */,
 				DCA4455F1EFA55B300D0CFA8 /* WXNavigationDefaultImpl.m in Sources */,
 				74B81AF21F73C3E900D3A61D /* WXJSASTParser.mm in Sources */,
+				B89543F620EB18B5006EAD63 /* WXJSCoreBridge.mm in Sources */,
 				841CD1071F974E000081196D /* WXExceptionUtils.m in Sources */,
 				DCA445601EFA55B300D0CFA8 /* WXURLRewriteDefaultImpl.m in Sources */,
 				DCA445611EFA55B300D0CFA8 /* WXPrerenderManager.m in Sources */,
 				DCA445631EFA55B300D0CFA8 /* WXPickerModule.m in Sources */,
 				DCA445641EFA55B300D0CFA8 /* WXGlobalEventModule.m in Sources */,
 				DCA445651EFA55B300D0CFA8 /* WXClipboardModule.m in Sources */,
+				B8D66C4421255730003960BD /* render_action_remove_element.cpp in Sources */,
+				B8D66BFC2125572F003960BD /* render_performance.cpp in Sources */,
 				DCA445661EFA55B300D0CFA8 /* WXNavigatorModule.m in Sources */,
 				DCA445671EFA55B300D0CFA8 /* WXStorageModule.m in Sources */,
+				B8D66C2021255730003960BD /* layout.cpp in Sources */,
+				B8D66C2C21255730003960BD /* render_manager.cpp in Sources */,
 				DCA445681EFA55B300D0CFA8 /* WXStreamModule.m in Sources */,
 				C42E8FAC1F3C7C3B001EBE9D /* WXExtendCallNativeManager.m in Sources */,
+				B8D66C5021255730003960BD /* render_action_add_element.cpp in Sources */,
+				B8D66C4021255730003960BD /* render_action_update_style.cpp in Sources */,
 				DCA445691EFA55B300D0CFA8 /* WXAnimationModule.m in Sources */,
 				DCA4456B1EFA55B300D0CFA8 /* WXInstanceWrap.m in Sources */,
 				DCA4456C1EFA55B300D0CFA8 /* WXDomModule.m in Sources */,
 				DCA4456D1EFA55B300D0CFA8 /* WXTimerModule.m in Sources */,
-				17E5ACDD2091F06300EE81F1 /* WXCoreStyle.cpp in Sources */,
+				B8A72CA1213F8BAE0024E7BE /* class_string.cc in Sources */,
 				DCA4456E1EFA55B300D0CFA8 /* WXModalUIModule.m in Sources */,
+				B8D66C6821255730003960BD /* render_scroller.cpp in Sources */,
+				B8D66C5421255730003960BD /* render_action_createbody.cpp in Sources */,
+				B8D66BAA2125572F003960BD /* table.cc in Sources */,
+				B8D66C5621255730003960BD /* render_action_createfinish.cpp in Sources */,
 				DCA4456F1EFA55B300D0CFA8 /* WXWebViewModule.m in Sources */,
+				B8D66C1E21255730003960BD /* style.cpp in Sources */,
 				DCA445701EFA55B300D0CFA8 /* WXCanvasModule.m in Sources */,
 				170B4668208733E500562666 /* WXAnalyzerCenter.m in Sources */,
 				DCA445711EFA55B300D0CFA8 /* WXMetaModule.m in Sources */,
@@ -2443,12 +3731,14 @@
 				DCA445731EFA55B300D0CFA8 /* NSTimer+Weex.m in Sources */,
 				74B81AEE1F73C3E900D3A61D /* WXCellSlotComponent.mm in Sources */,
 				DCA445741EFA55B300D0CFA8 /* WXConvert.m in Sources */,
+				B8D66BA82125572F003960BD /* string_table.cc in Sources */,
 				DCA445751EFA55B300D0CFA8 /* WXUtility.m in Sources */,
 				74B81AEA1F73C3E900D3A61D /* WXRecycleListUpdateManager.m in Sources */,
 				74B81AF01F73C3E900D3A61D /* WXComponent+DataBinding.mm in Sources */,
 				DCA445761EFA55B300D0CFA8 /* WXLog.m in Sources */,
-				17E5ACDC2091F05E00EE81F1 /* WXCoreLayout.cpp in Sources */,
 				DCA445771EFA55B300D0CFA8 /* WXWeakObjectWrapper.m in Sources */,
+				B8D66C9621255730003960BD /* dom_wson.cpp in Sources */,
+				B8F2C70D2133A83C00635B37 /* rax_parser.cc in Sources */,
 				DCA445781EFA55B300D0CFA8 /* NSArray+Weex.m in Sources */,
 				DCA445791EFA55B300D0CFA8 /* WXThreadSafeCounter.m in Sources */,
 				DCA4457A1EFA55B300D0CFA8 /* WXSimulatorShortcutManager.m in Sources */,
@@ -2459,25 +3749,33 @@
 				DCA4457E1EFA55B300D0CFA8 /* WXThreadSafeMutableArray.m in Sources */,
 				DCA4457F1EFA55B300D0CFA8 /* NSObject+WXSwizzle.m in Sources */,
 				DCA445801EFA55B300D0CFA8 /* WXLength.m in Sources */,
+				B8D66C2821255730003960BD /* render_page.cpp in Sources */,
 				DCA445811EFA55B300D0CFA8 /* WXDiffUtil.m in Sources */,
+				B8D66C7221255730003960BD /* render_appbar.cpp in Sources */,
+				B8D66CAE21255730003960BD /* wson_parser.cpp in Sources */,
 				DCA445821EFA55B300D0CFA8 /* WXSDKEngine.m in Sources */,
 				DCEA54631F2B7DBA000ECB23 /* WXTracingManager.m in Sources */,
 				DCA445831EFA55B300D0CFA8 /* WXBridgeMethod.m in Sources */,
 				DCA445841EFA55B300D0CFA8 /* WXModuleMethod.m in Sources */,
+				B8D66CA821255730003960BD /* wson.c in Sources */,
 				DCA445851EFA55B300D0CFA8 /* WXComponentMethod.m in Sources */,
 				DCA445861EFA55B300D0CFA8 /* WXCallJSMethod.m in Sources */,
-				DCA445881EFA55B300D0CFA8 /* WXBridgeContext.m in Sources */,
-				DCA445891EFA55B300D0CFA8 /* WXJSCoreBridge.m in Sources */,
 				DCA4458A1EFA55B300D0CFA8 /* WXPolyfillSet.m in Sources */,
 				333D9A2A1F41507A007CED39 /* WXTransition.mm in Sources */,
 				DCA4458B1EFA55B300D0CFA8 /* JSValue+Weex.m in Sources */,
+				B8D66C3A21255730003960BD /* render_action_layout.cpp in Sources */,
 				DCA4458C1EFA55B300D0CFA8 /* WXServiceFactory.m in Sources */,
+				B8D66BF62125572F003960BD /* token.cc in Sources */,
 				DCA4458D1EFA55B300D0CFA8 /* WXInvocationConfig.m in Sources */,
 				DCA4458E1EFA55B300D0CFA8 /* WXDatePickerManager.m in Sources */,
-				1771795621412A5D006F39A9 /* WXApmForInstance.m in Sources */,
 				DCA4458F1EFA55B300D0CFA8 /* WXSDKManager.m in Sources */,
+				B8F2C6F52133A83C00635B37 /* rax_parser_statistics.cc in Sources */,
 				DCA445901EFA55B300D0CFA8 /* WXBridgeManager.m in Sources */,
+				B8D66C3821255730003960BD /* render_action_update_attr.cpp in Sources */,
+				B8F2C6F12133A83C00635B37 /* rax_jsx_ast.cc in Sources */,
+				B8D66BBC2125572F003960BD /* vnode_render_context.cc in Sources */,
 				DCA445911EFA55B300D0CFA8 /* WXModuleFactory.m in Sources */,
+				B8D66CDA21255730003960BD /* message_pump_posix.cc in Sources */,
 				DCA445921EFA55B300D0CFA8 /* WXHandlerFactory.m in Sources */,
 				DCA445931EFA55B300D0CFA8 /* WXComponentManager.mm in Sources */,
 				DCA445941EFA55B300D0CFA8 /* WXComponentFactory.m in Sources */,
@@ -2701,6 +3999,8 @@
 			buildSettings = {
 				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ENABLE_MODULES = NO;
+				CLANG_WARN_COMMA = NO;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
@@ -2709,12 +4009,18 @@
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "WeexSDK/Sources/Supporting Files/WeexSDK-Prefix.pch";
-				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"OS_IOS=1",
+				);
 				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/WeexSDK/Dependency",
+					"$(PROJECT_DIR)/../../weex_core/Source",
+					"$(PROJECT_DIR)/../../weex_core/Source/core/layout",
 				);
 				INFOPLIST_FILE = WeexSDK/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -2748,6 +4054,8 @@
 			buildSettings = {
 				CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
 				CLANG_ENABLE_MODULES = NO;
+				CLANG_WARN_COMMA = NO;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
 				DEFINES_MODULE = YES;
@@ -2755,12 +4063,18 @@
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
 				GCC_PREFIX_HEADER = "WeexSDK/Sources/Supporting Files/WeexSDK-Prefix.pch";
-				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"${inherited}",
+					"OS_IOS=1",
+				);
 				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(PROJECT_DIR)/WeexSDK/Dependency",
+					"$(PROJECT_DIR)/../../weex_core/Source",
+					"$(PROJECT_DIR)/../../weex_core/Source/core/layout",
 				);
 				INFOPLIST_FILE = WeexSDK/Info.plist;
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
@@ -2794,8 +4108,10 @@
 			buildSettings = {
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CODE_SIGN_IDENTITY = "";
 				DEFINES_MODULE = YES;
@@ -2803,6 +4119,17 @@
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				ENABLE_BITCODE = NO;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "WeexSDK/Sources/Supporting Files/WeexSDK-Prefix.pch";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"$(inherited)",
+					"OS_IOS=1",
+				);
+				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(PROJECT_DIR)/../../weex_core/Source",
+					"$(PROJECT_DIR)/../../weex_core/Source/core/layout",
+				);
 				INFOPLIST_FILE = "WeexSDK-Dynamic/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
@@ -2814,12 +4141,11 @@
 					"-framework",
 					"\"Security\"",
 					"-lstdc++",
-					"-undefined",
-					dynamic_lookup,
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.taobao.WeexSDK-Dynamic";
 				PRODUCT_NAME = WeexSDK;
 				SKIP_INSTALL = YES;
+				WARNING_CFLAGS = "-Wno-documentation";
 			};
 			name = Debug;
 		};
@@ -2828,8 +4154,10 @@
 			buildSettings = {
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_WARN_COMMA = NO;
 				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
 				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CODE_SIGN_IDENTITY = "";
 				DEFINES_MODULE = YES;
@@ -2837,6 +4165,17 @@
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
 				ENABLE_BITCODE = NO;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = "WeexSDK/Sources/Supporting Files/WeexSDK-Prefix.pch";
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"${inherited}",
+					"OS_IOS=1",
+				);
+				GCC_TREAT_WARNINGS_AS_ERRORS = YES;
+				HEADER_SEARCH_PATHS = (
+					"$(PROJECT_DIR)/../../weex_core/Source",
+					"$(PROJECT_DIR)/../../weex_core/Source/core/layout",
+				);
 				INFOPLIST_FILE = "WeexSDK-Dynamic/Info.plist";
 				INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
 				IPHONEOS_DEPLOYMENT_TARGET = 8.0;
@@ -2848,12 +4187,11 @@
 					"-framework",
 					"\"Security\"",
 					"-lstdc++",
-					"-undefined",
-					dynamic_lookup,
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.taobao.WeexSDK-Dynamic";
 				PRODUCT_NAME = WeexSDK;
 				SKIP_INSTALL = YES;
+				WARNING_CFLAGS = "-Wno-documentation";
 			};
 			name = Release;
 		};
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/sdk/WeexSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000000..18d981003d
--- /dev/null
+++ b/ios/sdk/WeexSDK.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/sdk/WeexSDK.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000000..0c67376eba
--- /dev/null
+++ b/ios/sdk/WeexSDK.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict/>
+</plist>
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
index 0801fa756f..3adc1cbaf3 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.h
@@ -21,10 +21,6 @@
 #import <JavaScriptCore/JavaScriptCore.h>
 #import "WXBridgeProtocol.h"
 
-#import "WXBridgeProtocol.h"
-
-#import "WXBridgeProtocol.h"
-
 @class WXCallJSMethod;
 @class WXSDKInstance;
 
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index a3b7bac6e0..9923f153be 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -48,6 +48,7 @@
 #import "WXConfigCenterProtocol.h"
 #import "WXSDKInstance_performance.h"
 #import "JSContext+Weex.h"
+#import "WXCoreBridge.h"
 
 #define SuppressPerformSelectorLeakWarning(Stuff) \
 do { \
@@ -104,6 +105,7 @@ - (instancetype) init
         _frameworkLoadFinished = NO;
     }
     
+    // WXDebugger is a singleton actually and should not call its init twice.
     _jsBridge = _debugJS ? [NSClassFromString(@"WXDebugger") alloc] : [[WXJSCoreBridge alloc] init];
     
     [self registerGlobalFunctions];
@@ -126,27 +128,14 @@ - (void)registerGlobalFunctions
     [_jsBridge registerCallNative:^NSInteger(NSString *instance, NSArray *tasks, NSString *callback) {
         return [weakSelf invokeNative:instance tasks:tasks callback:callback];
     }];
+    
+    [WXCoreBridge install];
+    
     [_jsBridge registerCallAddElement:^NSInteger(NSString *instanceId, NSString *parentRef, NSDictionary *elementData, NSInteger index) {
         
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:elementData[@"ref"] className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"addElement" options:nil];
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: addElement : %@",elementData[@"type"]);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
             [WXTracingManager startTracingWithInstanceId:instanceId ref:elementData[@"ref"] className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"addElement" options:@{@"threadName":WXTDOMThread}];
-            [manager startComponentTasks];
-            [manager addComponent:elementData toSupercomponent:parentRef atIndex:index appendingInTree:NO];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:elementData[@"ref"] className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"addElement" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callAddElement:instanceId parentRef:parentRef data:elementData index:(int)index];
         });
         
         return 0;
@@ -154,26 +143,9 @@ - (void)registerGlobalFunctions
     
     [_jsBridge registerCallCreateBody:^NSInteger(NSString *instanceId, NSDictionary *bodyData) {
         
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:bodyData[@"ref"] className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"createBody" options:@{@"threadName":WXTJSBridgeThread}];
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: createBody %@ ref:%@",bodyData[@"type"],bodyData[@"ref"]);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
             [WXTracingManager startTracingWithInstanceId:instanceId ref:bodyData[@"ref"] className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"createBody" options:@{@"threadName":WXTDOMThread}];
-            [manager startComponentTasks];
-            [manager createRoot:bodyData];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:bodyData[@"ref"] className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"createBody" options:@{@"threadName":WXTDOMThread}];
-            
+            [WXCoreBridge callCreateBody:instanceId data:bodyData];
         });
         
         return 0;
@@ -181,153 +153,59 @@ - (void)registerGlobalFunctions
     
     [_jsBridge registerCallRemoveElement:^NSInteger(NSString *instanceId, NSString *ref) {
         
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"removeElement" options:nil];
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: removeElement ref:%@",ref);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
             [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"removeElement" options:@{@"threadName":WXTDOMThread}];
-            [manager startComponentTasks];
-            [manager removeComponent:ref];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"removeElement" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callRemoveElement:instanceId ref:ref];
         });
         
         return 0;
     }];
     
-    [_jsBridge registerCallMoveElement:^NSInteger(NSString *instanceId,NSString *ref,NSString *parentRef,NSInteger index) {
-        
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
+    [_jsBridge registerCallMoveElement:^NSInteger(NSString *instanceId, NSString *ref, NSString *parentRef, NSInteger index) {
         
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"moveElement" options:nil];
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: moveElement ,ref:%@ to ref:%@",ref,parentRef);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
-            [manager startComponentTasks];
-            [manager moveComponent:ref toSuper:parentRef atIndex:index];
+            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"moveElement" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callMoveElement:instanceId ref:ref parentRef:parentRef index:(int)index];
         });
         
         return 0;
     }];
     
-    [_jsBridge registerCallUpdateAttrs:^NSInteger(NSString *instanceId,NSString *ref,NSDictionary *attrsData) {
-        
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
+    [_jsBridge registerCallUpdateAttrs:^NSInteger(NSString *instanceId, NSString *ref, NSDictionary *attrsData) {
         
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"updateAttrs" options:@{@"threadName":WXTJSBridgeThread}];
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: updateAttrs ref:%@,attr:%@",ref,attrsData);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
             [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"updateAttrs" options:@{@"threadName":WXTDOMThread}];
-            [manager startComponentTasks];
-            [manager updateAttributes:attrsData forComponent:ref];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"updateAttrs" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callUpdateAttrs:instanceId ref:ref data:attrsData];
         });
         
         return 0;
     }];
     
-    [_jsBridge registerCallUpdateStyle:^NSInteger(NSString *instanceId,NSString *ref,NSDictionary *stylesData) {
+    [_jsBridge registerCallUpdateStyle:^NSInteger(NSString *instanceId, NSString *ref, NSDictionary *stylesData) {
         
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"updateStyles" options:@{@"threadName":WXTJSBridgeThread}];
         WXPerformBlockOnComponentThread(^{
-            
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: updateStyles ref:%@,styles:%@",ref,stylesData);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
-            [manager startComponentTasks];
-            [manager updateStyles:stylesData forComponent:ref];
-            
+            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"updateStyle" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callUpdateStyle:instanceId ref:ref data:stylesData];
         });
-        
+
         return 0;
     }];
     
-    [_jsBridge registerCallAddEvent:^NSInteger(NSString *instanceId,NSString *ref,NSString *event) {
-        
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
+    [_jsBridge registerCallAddEvent:^NSInteger(NSString *instanceId, NSString *ref, NSString *event) {
         
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: addEvent ref:%@",ref);
-#endif
-            
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
-            [manager startComponentTasks];
-            [manager addEvent:event toComponent:ref];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"addEvent" options:nil];
+            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"addEvent" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callAddEvent:instanceId ref:ref event:event];
         });
         
         return 0;
     }];
     
-    [_jsBridge registerCallRemoveEvent:^NSInteger(NSString *instanceId,NSString *ref,NSString *event) {
-        
-        // Temporary here , in order to improve performance, will be refactored next version.
-        WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
-        
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
+    [_jsBridge registerCallRemoveEvent:^NSInteger(NSString *instanceId, NSString *ref, NSString *event) {
         
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action :removeEvent ref:%@",ref);
-#endif
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
-            [manager startComponentTasks];
-            [manager removeEvent:event fromComponent:ref];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"removeEvent" options:nil];
+            [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"removeEvent" options:@{@"threadName":WXTDOMThread}];
+            [WXCoreBridge callRemoveEvent:instanceId ref:ref event:event];
         });
         
         return 0;
@@ -335,33 +213,41 @@ - (void)registerGlobalFunctions
     
     [_jsBridge registerCallCreateFinish:^NSInteger(NSString *instanceId) {
         
-        // Temporary here , in order to improve performance, will be refactored next version.
         WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
         [instance.apmInstance onStage:KEY_PAGE_STAGES_CREATE_FINISH];
         
-        if(![weakSelf checkInstance:instance]) {
-            return -1;
-        }
-        [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTJSCall phase:WXTracingEnd functionName:@"createFinish" options:@{@"threadName":WXTJSBridgeThread}];
         WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> action: createFinish :%@",instanceId);
-#endif
-            
-            WXComponentManager *manager = instance.componentManager;
-            if (!manager.isValid) {
-                return;
-            }
             [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"createFinish" options:@{@"threadName":WXTDOMThread}];
-            [manager startComponentTasks];
-            [manager createFinish];
-            [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"createFinish" options:@{@"threadName":WXTDOMThread}];
-            
+            [WXCoreBridge callCreateFinish:instanceId];
         });
         
         return 0;
     }];
     
+    if ([_jsBridge respondsToSelector:@selector(registerCallRefreshFinish:)]) {
+        [_jsBridge registerCallRefreshFinish:^NSInteger(NSString *instanceId) {
+            
+            WXPerformBlockOnComponentThread(^{
+                [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"refreshFinish" options:@{@"threadName":WXTDOMThread}];
+                [WXCoreBridge callRefreshFinish:instanceId];
+            });
+            
+            return 0;
+        }];
+    }
+    
+    if ([_jsBridge respondsToSelector:@selector(registerCallUpdateFinish:)]) {
+        [_jsBridge registerCallUpdateFinish:^NSInteger(NSString *instanceId) {
+            
+            WXPerformBlockOnComponentThread(^{
+                [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"updateFinish" options:@{@"threadName":WXTDOMThread}];
+                [WXCoreBridge callUpdateFinish:instanceId];
+            });
+            
+            return 0;
+        }];
+    }
+    
     [_jsBridge registerCallNativeModule:^NSInvocation*(NSString *instanceId, NSString *moduleName, NSString *methodName, NSArray *arguments, NSDictionary *options) {
         
         WXSDKInstance *instance = [WXSDKManager instanceForID:instanceId];
@@ -516,6 +402,18 @@ - (void)createInstance:(NSString *)instanceIdString
     //create a sendQueue bind to the current instance
     NSMutableArray *sendQueue = [NSMutableArray array];
     [self.sendQueue setValue:sendQueue forKey:instanceIdString];
+
+    if (sdkInstance.dataRender) {
+        WX_MONITOR_INSTANCE_PERF_START(WXFirstScreenJSFExecuteTime, [WXSDKManager instanceForID:instanceIdString]);
+        WX_MONITOR_INSTANCE_PERF_START(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
+
+        WXPerformBlockOnComponentThread(^{
+            [WXCoreBridge createDataRenderInstance:instanceIdString template:jsBundleString options:options data:data];
+            WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
+        });
+        return;
+    }
+
     NSArray *args = nil;
     WX_MONITOR_INSTANCE_PERF_START(WXFirstScreenJSFExecuteTime, [WXSDKManager instanceForID:instanceIdString]);
     WX_MONITOR_INSTANCE_PERF_START(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
@@ -538,10 +436,10 @@ - (void)createInstance:(NSString *)instanceIdString
         NSString *raxAPIScriptPath = nil;
         sdkInstance.bundleType = bundleType;
         if ([bundleType.lowercaseString isEqualToString:@"rax"]) {
-             raxAPIScriptPath = [[NSBundle bundleForClass:[weakSelf class]] pathForResource:@"weex-rax-api" ofType:@"js"];
-			if (raxAPIScriptPath == nil) {
-				raxAPIScriptPath = [[NSBundle mainBundle] pathForResource:@"weex-rax-api" ofType:@"js"];
-			}
+            raxAPIScriptPath = [[NSBundle bundleForClass:[weakSelf class]] pathForResource:@"weex-rax-api" ofType:@"js"];
+            if (raxAPIScriptPath == nil) {
+                raxAPIScriptPath = [[NSBundle mainBundle] pathForResource:@"weex-rax-api" ofType:@"js"];
+            }
             raxAPIScript = [NSString stringWithContentsOfFile:raxAPIScriptPath encoding:NSUTF8StringEncoding error:nil];
             if (!raxAPIScript) {
                 WXLogError(@"weex-rax-api can not found");
@@ -559,19 +457,22 @@ - (void)createInstance:(NSString *)instanceIdString
             WX_MONITOR_INSTANCE_PERF_END(WXPTJSCreateInstance, [WXSDKManager instanceForID:instanceIdString]);
             [sdkInstance.apmInstance onStage:KEY_PAGE_STAGES_LOAD_BUNDLE_END];
         } else {
-            sdkInstance.callCreateInstanceContext = [NSString stringWithFormat:@"instanceId:%@\noptions:%@\ndata:%@",instanceIdString, newOptions,data];
+            sdkInstance.callCreateInstanceContext = [NSString stringWithFormat:@"instanceId:%@\noptions:%@\ndata:%@", instanceIdString, newOptions, data];
             [self callJSMethod:@"createInstanceContext" args:@[instanceIdString, newOptions, data?:@[]] onContext:nil completion:^(JSValue *instanceContextEnvironment) {
                 if (sdkInstance.pageName) {
                     if (@available(iOS 8.0, *)) {
-                          [sdkInstance.instanceJavaScriptContext.javaScriptContext setName:sdkInstance.pageName];
+                        [sdkInstance.instanceJavaScriptContext.javaScriptContext setName:sdkInstance.pageName];
                     } else {
                         // Fallback
                     }
                 }
-                sdkInstance.createInstanceContextResult = [NSString stringWithFormat:@"%@", [[instanceContextEnvironment toDictionary] allKeys]];
+                
+                NSDictionary* envDic = [instanceContextEnvironment toDictionary];
+                sdkInstance.createInstanceContextResult = [NSString stringWithFormat:@"%@", [envDic allKeys]];
                 JSGlobalContextRef instanceContextRef = sdkInstance.instanceJavaScriptContext.javaScriptContext.JSGlobalContextRef;
                 JSObjectRef instanceGlobalObject = JSContextGetGlobalObject(instanceContextRef);
-                for (NSString * key in [[instanceContextEnvironment toDictionary] allKeys]) {
+                
+                for (NSString * key in [envDic allKeys]) {
                     JSStringRef propertyName = JSStringCreateWithUTF8CString([key cStringUsingEncoding:NSUTF8StringEncoding]);
                     if ([key isEqualToString:@"Vue"]) {
                         JSObjectSetPrototype(instanceContextRef, JSValueToObject(instanceContextRef, [instanceContextEnvironment valueForProperty:key].JSValueRef, NULL), JSObjectGetPrototype(instanceContextRef, instanceGlobalObject));
@@ -581,9 +482,9 @@ - (void)createInstance:(NSString *)instanceIdString
                 
                 if (WX_SYS_VERSION_LESS_THAN(@"10.2")) {
                     NSString *filePath = [[NSBundle bundleForClass:[weakSelf class]] pathForResource:@"weex-polyfill" ofType:@"js"];
-					if (filePath == nil) {
-						filePath = [[NSBundle mainBundle] pathForResource:@"weex-polyfill" ofType:@"js"];
-					}
+                    if (filePath == nil) {
+                        filePath = [[NSBundle mainBundle] pathForResource:@"weex-polyfill" ofType:@"js"];
+                    }
                     NSString *script = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
                     if (script) {
                         [sdkInstance.instanceJavaScriptContext executeJavascript:script withSourceURL:[NSURL URLWithString:filePath]];
@@ -745,7 +646,14 @@ - (void)destroyInstance:(NSString *)instance
         [self.sendQueue removeObjectForKey:instance];
     }
     
-    [self callJSMethod:@"destroyInstance" args:@[instance]];
+    WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
+    if (sdkInstance.dataRender) {
+        WXPerformBlockOnComponentThread(^{
+            [WXCoreBridge destroyDataRenderInstance:instance];
+        });
+    } else {
+        [self callJSMethod:@"destroyInstance" args:@[instance]];
+    }
 }
 
 - (void)forceGarbageCollection
@@ -763,7 +671,18 @@ - (void)refreshInstance:(NSString *)instance
     
     if (!data) return;
     
-    [self callJSMethod:@"refreshInstance" args:@[instance, data]];
+    WXSDKInstance *sdkInstance = [WXSDKManager instanceForID:instance];
+    if (sdkInstance.dataRender) {
+        WXPerformBlockOnComponentThread(^{
+            if ([data isKindOfClass:[NSDictionary class]]) {
+                [WXCoreBridge refreshDataRenderInstance:instance data:[WXUtility JSONString:data]];
+            } else if ([data isKindOfClass:[NSString class]]) {
+                [WXCoreBridge refreshDataRenderInstance:instance data:data];
+            }
+        });
+    } else {
+        [self callJSMethod:@"refreshInstance" args:@[instance, data]];
+    }
 }
 
 - (void)updateState:(NSString *)instance data:(id)data
@@ -1143,10 +1062,10 @@ + (void)mountContextEnvironment:(JSContext*)context
         });
         NSArray * args = [JSContext currentArguments];
         NSString * levelStr = [[args lastObject] toString];
-        [WXBridgeContext handleConsoleOutputWithArgument:args logLevel:(WXLogFlag)levelMap[levelStr]];
-        
+        [WXBridgeContext handleConsoleOutputWithArgument:args logLevel:(WXLogFlag)[levelMap[levelStr] integerValue]];
     };
 }
+
 + (void)handleConsoleOutputWithArgument:(NSArray*)arguments logLevel:(WXLogFlag)logLevel
 {
     NSMutableString *string = [NSMutableString string];
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
new file mode 100644
index 0000000000..bb25f17dc9
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.h
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WXCORE_BRIDGE_PLATFORM_H
+#define WXCORE_BRIDGE_PLATFORM_H
+
+#if defined __cplusplus
+
+#include "core/bridge/platform_bridge.h"
+#include "core/layout/measure_func_adapter.h"
+
+namespace WeexCore
+{
+    class IOSSide : public PlatformBridge::PlatformSide
+    {
+    public:
+        WXCoreSize InvokeMeasureFunction(const char* page_id,
+                                         long render_ptr, float width,
+                                         int width_measure_mode,
+                                         float height,
+                                         int height_measure_mode) override { return WXCoreSize(); };
+        void InvokeLayoutBefore(const char* page_id, long render_ptr) override {};
+        void InvokeLayoutPlatform(const char* page_id, long render_ptr) override;
+        void InvokeLayoutAfter(const char* page_id, long render_ptr,
+                               float width, float height) override {};
+        
+        void TriggerVSync(const char* page_id) override;
+        
+        void SetJSVersion(const char* version) override;
+        
+        void ReportException(const char* pageId, const char *func, const char *exception_string) override;
+        void ReportServerCrash(const char* instance_id) override {};
+        void ReportNativeInitStatus(const char* status_code,
+                                    const char* error_msg) override {};
+        
+        int CallNative(const char* pageId, const char *task, const char *callback) override;
+        
+        std::unique_ptr<ValueWithType> CallNativeModule(const char* pageId, const char *module, const char *method,
+                               const char *arguments, int argumentsLength, const char *options, int optionsLength) override;
+        
+        void CallNativeComponent(const char* pageId, const char* ref, const char *method,
+                                 const char *arguments, int argumentsLength, const char *options, int optionsLength) override;
+        
+        void SetTimeout(const char* callbackID, const char* time) override ;
+        
+        void NativeLog(const char* str_array) override ;
+        
+        int UpdateFinish(const char* page_id, const char* task, int taskLen,
+                         const char* callback, int callbackLen) override;
+        
+        int RefreshFinish(const char* pageId, const char *task, const char *callback) override;
+        
+        int AddEvent(const char* pageId, const char* ref, const char *event) override;
+        
+        int RemoveEvent(const char* pageId, const char* ref, const char *event) override;
+        
+        int CreateBody(const char* pageId, const char *componentType, const char* ref,
+                           std::map<std::string, std::string> *styles,
+                           std::map<std::string, std::string> *attributes,
+                           std::set<std::string> *events,
+                           const WXCoreMargin &margins,
+                           const WXCorePadding &paddings,
+                           const WXCoreBorderWidth &borders) override;
+        
+        int AddElement(const char* pageId, const char *componentType, const char* ref,
+                           int &index, const char* parentRef,
+                           std::map<std::string, std::string> *styles,
+                           std::map<std::string, std::string> *attributes,
+                           std::set<std::string> *events,
+                           const WXCoreMargin &margins,
+                           const WXCorePadding &paddings,
+                           const WXCoreBorderWidth &borders,
+                           bool willLayout= true) override;
+        
+        int Layout(const char* pageId, const char* ref,
+                       float top, float bottom, float left, float right,
+                       float height, float width, int index) override;
+        
+        int UpdateStyle(const char* pageId, const char* ref,
+                            std::vector<std::pair<std::string, std::string>> *style,
+                            std::vector<std::pair<std::string, std::string>> *margin,
+                            std::vector<std::pair<std::string, std::string>> *padding,
+                            std::vector<std::pair<std::string, std::string>> *border) override;
+        
+        int UpdateAttr(const char* pageId, const char* ref,
+                           std::vector<std::pair<std::string, std::string>> *attrs) override;
+        
+        int CreateFinish(const char* pageId) override;
+        
+        int RenderSuccess(const char* pageId) override;
+        
+        int RemoveElement(const char* pageId, const char* ref) override;
+        
+        int MoveElement(const char* pageId, const char* ref, const char* parentRef, int index) override;
+        
+        int AppendTreeCreateFinish(const char* pageId, const char* ref) override;
+    
+        int HasTransitionPros(const char* pageId, const char* ref,
+                                          std::vector<std::pair<std::string, std::string>> *style) override;
+        void PostMessage(const char* vm_id, const char* data, int dataLength) override {};
+        void DispatchMessage(const char* client_id,
+                             const char* data, int dataLength, const char* callback, const char* vm_id) override {};
+    };
+    
+    class WXCoreMeasureFunctionBridge : public MeasureFunctionAdapter
+    {
+    public:
+        WXCoreSize Measure(const char* page_id, long render_ptr, float width, MeasureMode widthMeasureMode,
+                           float height, MeasureMode heightMeasureMode);
+        
+        void LayoutBefore(const char* page_id, long render_ptr);
+        
+        void LayoutAfter(const char* page_id, long render_ptr, float width, float height);
+    };
+}
+
+#endif
+
+#import <Foundation/Foundation.h>
+
+// For Objective-C use
+
+@interface WXCoreBridge : NSObject
+
++ (void)install;
+
++ (void)createDataRenderInstance:(NSString *)pageId template:(NSString *)temp options:(NSDictionary *)options data:(id)data;
+
++ (void)destroyDataRenderInstance:(NSString *)pageId;
+
++ (void)refreshDataRenderInstance:(NSString *)pageId data:(NSString *)data;
+
++ (void)setDefaultDimensionIntoRoot:(NSString*)pageId width:(CGFloat)width height:(CGFloat)height
+                 isWidthWrapContent:(BOOL)isWidthWrapContent
+                isHeightWrapContent:(BOOL)isHeightWrapContent;
+
++ (void)setViewportWidth:(NSString*)pageId width:(CGFloat)width;
+
++ (void)layoutPage:(NSString*)pageId forced:(BOOL)forced;
+
++ (void)closePage:(NSString*)pageId;
+
++ (void)layoutRenderObject:(void*)object size:(CGSize)size page:(NSString*)pageId;
+
++ (void*)copyRenderObject:(void*)source replacedRef:(NSString*)ref;
+
++ (void)addChildRenderObject:(void*)child toParent:(void*)parent;
+
++ (void)callAddElement:(NSString*)pageId parentRef:(NSString*)parentRef data:(NSDictionary*)data index:(int)index;
+
++ (void)callCreateBody:(NSString*)pageId data:(NSDictionary*)data;
+
++ (void)callRemoveElement:(NSString*)pageId ref:(NSString*)ref;
+
++ (void)callMoveElement:(NSString*)pageId ref:(NSString*)ref parentRef:(NSString*)parentRef index:(int)index;
+
++ (void)callUpdateAttrs:(NSString*)pageId ref:(NSString*)ref data:(NSDictionary*)data;
+
++ (void)callUpdateStyle:(NSString*)pageId ref:(NSString*)ref data:(NSDictionary*)data;
+
++ (void)callAddEvent:(NSString*)pageId ref:(NSString*)ref event:(NSString*)event;
+
++ (void)callRemoveEvent:(NSString*)pageId ref:(NSString*)ref event:(NSString*)event;
+
++ (void)callCreateFinish:(NSString*)pageId;
+
++ (void)callRefreshFinish:(NSString*)pageId;
+
++ (void)callUpdateFinish:(NSString*)pageId;
+
+@end
+
+#endif
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
new file mode 100644
index 0000000000..40630e47c5
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -0,0 +1,1124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"){} you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXCoreBridge.h"
+#import "JSValue+Weex.h"
+#import "WXSDKManager.h"
+#import "WXComponentManager.h"
+#import "WXSDKInstance_private.h"
+#import "WXLog.h"
+#import "WXTracingManager.h"
+#import "WXBridgeProtocol.h"
+#import "WXUtility.h"
+#import "WXAssert.h"
+#import "WXAppConfiguration.h"
+
+#include "base/CoreConstants.h"
+#include "core/manager/weex_core_manager.h"
+#include "core/render/manager/render_manager.h"
+#include "core/render/page/render_page.h"
+#include "core/render/node/render_object.h"
+#include "core/render/node/render_list.h"
+#include "core/render/node/factory/render_type.h"
+#include "core/render/node/factory/render_creator.h"
+#include "core/config/core_environment.h"
+#include "core/data_render/vnode/vnode_render_manager.h"
+#include "core/bridge/platform/core_side_in_platform.h"
+#include "core/bridge/script/core_side_in_script.h"
+#include "base/TimeUtils.h"
+
+#import <objc/runtime.h>
+
+#define NSSTRING(cstr) ((__bridge_transfer NSString*)(CFStringCreateWithCString(NULL, (const char *)(cstr), kCFStringEncodingUTF8)))
+#define NSSTRING_NO_COPY(cstr) ((__bridge_transfer NSString*)(CFStringCreateWithCStringNoCopy(NULL, (const char *)(cstr), kCFStringEncodingUTF8, kCFAllocatorNull)))
+
+namespace WeexCore
+{
+    static NSString* const JSONSTRING_SUFFIX = @"\t\n\t\r";
+    
+    static NSString* TO_JSON(id object)
+    {
+        if (object == nil) {
+            return nil;
+        }
+        
+        @try {
+            if ([object isKindOfClass:[NSArray class]] || [object isKindOfClass:[NSDictionary class]]) {
+                NSError *error = nil;
+                NSData *data = [NSJSONSerialization dataWithJSONObject:object
+                                                               options:0
+                                                                 error:&error];
+                
+                if (error) {
+                    WXLogError(@"%@", error);
+                    WXAssert(NO, @"Fail to convert object to json. %@", error);
+                    return nil;
+                }
+                
+                return [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] stringByAppendingString:JSONSTRING_SUFFIX]; // add suffix so that we know this is a json string
+            }
+        } @catch (NSException *exception) {
+            WXLogError(@"%@", exception);
+            WXAssert(NO, @"Fail to convert object to json. %@", exception);
+            return nil;
+        }
+        
+        return nil;
+    }
+    
+    static id TO_OBJECT(NSString* s)
+    {
+        if ([s hasSuffix:JSONSTRING_SUFFIX]) {
+            if ([s length] == [JSONSTRING_SUFFIX length]) {
+                return [NSNull null];
+            }
+            
+            // s is a json string
+            @try {
+                NSError* error = nil;
+                id jsonObj = [NSJSONSerialization JSONObjectWithData:[s dataUsingEncoding:NSUTF8StringEncoding]
+                                                             options:NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves
+                                                               error:&error];
+                
+                if (jsonObj == nil) {
+                    WXLogError(@"%@", error);
+                    WXAssert(NO, @"Fail to convert json to object. %@", error);
+                }
+                else {
+                    return jsonObj;
+                }
+            } @catch (NSException *exception) {
+                WXLogError(@"%@", exception);
+                WXAssert(NO, @"Fail to convert json to object. %@", exception);
+            }
+        }
+        return s; // return s instead
+    }
+    
+    static NSMutableDictionary* NSDICTIONARY(std::map<std::string, std::string>* map)
+    {
+        if (map == nullptr || map->size() == 0)
+            return [[NSMutableDictionary alloc] init];
+        
+        NSMutableDictionary* result = [[NSMutableDictionary alloc] initWithCapacity:map->size()];
+        for (auto it = map->begin(); it != map->end(); it ++) {
+            id object = TO_OBJECT(NSSTRING(it->second.c_str()));
+            if (object) {
+                [result setObject:object forKey:NSSTRING(it->first.c_str())];
+            }
+        }
+        return result;
+    }
+    
+    static NSMutableDictionary* NSDICTIONARY(std::vector<std::pair<std::string, std::string>>* vec)
+    {
+        if (vec == nullptr || vec->size() == 0)
+            return [[NSMutableDictionary alloc] init];
+        
+        NSMutableDictionary* result = [[NSMutableDictionary alloc] initWithCapacity:vec->size()];
+        for (auto& p : *vec) {
+            id object = TO_OBJECT(NSSTRING(p.second.c_str()));
+            if (object) {
+                [result setObject:object forKey:NSSTRING(p.first.c_str())];
+            }
+        }
+        return result;
+    }
+    
+    static NSMutableArray* NSARRAY(std::set<std::string>* set)
+    {
+        if (set == nullptr || set->size() == 0)
+            return [[NSMutableArray alloc] init];
+        
+        NSMutableArray* result = [[NSMutableArray alloc] initWithCapacity:set->size()];
+        for (auto& s : *set) {
+            id object = TO_OBJECT(NSSTRING(s.c_str()));
+            if (object) {
+                [result addObject:object];
+            }
+        }
+        return result;
+    }
+    
+    static void MergeBorderWidthValues(NSMutableDictionary* dict, const WXCoreBorderWidth & borders, bool isUpdate)
+    {
+        if (borders.getBorderWidth(kBorderWidthTop) != (float)0.0f || isUpdate) {
+            dict[@"borderTopWidth"] = @(borders.getBorderWidth(kBorderWidthTop));
+        }
+        if (borders.getBorderWidth(kBorderWidthLeft) != (float)0.0f || isUpdate) {
+            dict[@"borderLeftWidth"] = @(borders.getBorderWidth(kBorderWidthLeft));
+        }
+        if (borders.getBorderWidth(kBorderWidthBottom) != (float)0.0f || isUpdate) {
+            dict[@"borderBottomWidth"] = @(borders.getBorderWidth(kBorderWidthBottom));
+        }
+        if (borders.getBorderWidth(kBorderWidthRight) != (float)0.0f || isUpdate) {
+            dict[@"borderRightWidth"] = @(borders.getBorderWidth(kBorderWidthRight));
+        }
+    }
+    
+    static void MergeBorderWidthValues(NSMutableDictionary* dict, std::vector<std::pair<std::string, std::string>>* borders)
+    {
+        if (borders == nullptr) {
+            return;
+        }
+        
+        for (auto& p : *borders) {
+            dict[NSSTRING(p.first.c_str())] = NSSTRING(p.second.c_str());
+        }
+    }
+    
+    void IOSSide::SetJSVersion(const char* version)
+    {
+        NSString *jsVersion = NSSTRING(version);
+        if (jsVersion.length > 0) {
+            [WXAppConfiguration setJSFrameworkVersion:jsVersion];
+        }
+    }
+    
+    void IOSSide::ReportException(const char* pageId, const char *func, const char *exception_string)
+    {
+        // should not enter this function
+        assert(false);
+    }
+    
+    int IOSSide::CallNative(const char* pageId, const char *task, const char *callback)
+    {
+        // should not enter this function
+        assert(false);
+    }
+    
+    std::unique_ptr<ValueWithType> IOSSide::CallNativeModule(const char* pageId, const char *module, const char *method,
+                                         const char *arguments, int argumentsLength,
+                                         const char *options, int optionsLength)
+    {
+        // should not enter this function
+        assert(false);
+        return std::unique_ptr<ValueWithType>();
+    }
+        
+    void IOSSide::CallNativeComponent(const char* pageId, const char* ref, const char *method,
+                                           const char *arguments, int argumentsLength,
+                                           const char *options, int optionsLength)
+    {
+        // should not enter this function
+        assert(false);
+    }
+        
+    void IOSSide::SetTimeout(const char* callbackID, const char* time)
+    {
+        // should not enter this function
+        assert(false);
+    }
+        
+    void IOSSide::NativeLog(const char* str_array)
+    {
+        // should not enter this function
+        assert(false);
+    }
+    
+    void IOSSide::TriggerVSync(const char* page_id)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(page_id);
+        if (page == nullptr) {
+            return;
+        }
+        
+        NSString* ns_instanceId = NSSTRING(page_id);
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return;
+        }
+        [manager startComponentTasks];
+    }
+        
+    int IOSSide::UpdateFinish(const char* page_id, const char* task, int taskLen,
+                                   const char* callback, int callbackLen)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(page_id);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        NSString* ns_instanceId = NSSTRING(page_id);
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager updateFinish];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"updateFinish" options:@{@"threadName":WXTDOMThread}];
+        
+        return 0;
+    }
+        
+    int IOSSide::RefreshFinish(const char* pageId, const char *task, const char *callback)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager refreshFinish];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"refreshFinish" options:@{@"threadName":WXTDOMThread}];
+        
+        return 0;
+    }
+        
+    int IOSSide::AddEvent(const char* pageId, const char* ref, const char *event)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        NSString* ns_event = NSSTRING(event);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: addEvent ref:%@", ns_ref);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager addEvent:ns_event toComponent:ns_ref];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"addEvent" options:@{@"threadName":WXTDOMThread}];
+
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::RemoveEvent(const char* pageId, const char* ref, const char *event)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        NSString* ns_event = NSSTRING(event);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action :removeEvent ref:%@", ns_ref);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager removeEvent:ns_event fromComponent:ns_ref];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"removeEvent" options:@{@"threadName":WXTDOMThread}];
+    
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::CreateBody(const char* pageId, const char *componentType, const char* ref,
+                                     std::map<std::string, std::string> *styles,
+                                     std::map<std::string, std::string> *attributes,
+                                     std::set<std::string> *events,
+                                     const WXCoreMargin &margins,
+                                     const WXCorePadding &paddings,
+                                     const WXCoreBorderWidth &borders)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        RenderObject* renderObject = page->GetRenderObject(ref);
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        NSString* ns_type = NSSTRING(componentType);
+        NSMutableDictionary* ns_styles = NSDICTIONARY(styles);
+        NSDictionary* ns_attributes = NSDICTIONARY(attributes);
+        NSArray* ns_events = NSARRAY(events);
+        MergeBorderWidthValues(ns_styles, borders, false);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: createBody %@ ref:%@", ns_type, ns_ref);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager createBody:ns_ref type:ns_type styles:ns_styles attributes:ns_attributes events:ns_events renderObject:renderObject];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"createBody" options:@{@"threadName":WXTDOMThread}];
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::AddElement(const char* pageId, const char *componentType, const char* ref,
+                           int &index, const char* parentRef,
+                           std::map<std::string, std::string> *styles,
+                           std::map<std::string, std::string> *attributes,
+                           std::set<std::string> *events,
+                           const WXCoreMargin &margins,
+                           const WXCorePadding &paddings,
+                           const WXCoreBorderWidth &borders,
+                           bool willLayout)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        RenderObject* renderObject = page->GetRenderObject(ref);
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_componentType = NSSTRING(componentType);
+        NSString* ns_ref = NSSTRING(ref);
+        NSString* ns_parentRef = NSSTRING(parentRef);
+        NSMutableDictionary* ns_styles = NSDICTIONARY(styles);
+        NSDictionary* ns_attributes = NSDICTIONARY(attributes);
+        NSArray* ns_events = NSARRAY(events);
+        NSInteger ns_index = index;
+        MergeBorderWidthValues(ns_styles, borders, false);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: addElement : %@", ns_componentType);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        
+        [manager startComponentTasks];
+        [manager addComponent:ns_ref type:ns_componentType parentRef:ns_parentRef styles:ns_styles attributes:ns_attributes events:ns_events index:ns_index renderObject:renderObject];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"addElement" options:@{@"threadName":WXTDOMThread}];
+
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+    
+    int IOSSide::Layout(const char* pageId, const char* ref,
+                       float top, float bottom, float left, float right,
+                       float height, float width, int index)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        RenderObject* renderObject = page->GetRenderObject(ref);
+        if (renderObject->getContext() == nullptr) {
+            return -1;
+        }
+        WXComponent* component = (__bridge WXComponent *)(renderObject->getContext());
+        NSString* ns_instanceId = NSSTRING(pageId);
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        CGRect frame = CGRectMake(isnan(WXRoundPixelValue(left))?0:WXRoundPixelValue(left),
+                                  isnan(WXRoundPixelValue(top))?0:WXRoundPixelValue(top),
+                                  isnan(WXRoundPixelValue(width))?0:WXRoundPixelValue(width),
+                                  isnan(WXRoundPixelValue(height))?0:WXRoundPixelValue(height));
+        [manager layoutComponent:component frame:frame innerMainSize:renderObject->getLargestMainSize()];
+
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+    
+    void IOSSide::InvokeLayoutPlatform(const char* page_id, long render_ptr)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(page_id);
+        if (page == nullptr) {
+            return;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        RenderObject* renderObject = reinterpret_cast<RenderObject*>(render_ptr);
+        if (renderObject->getContext() == nullptr) {
+            return;
+        }
+        WXComponent* component = (__bridge WXComponent *)(renderObject->getContext());
+        NSString* ns_instanceId = NSSTRING(page_id);
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return;
+        }
+        
+        [manager layoutComponent:component];
+
+        page->CallBridgeTime(getCurrentTime() - startTime);
+    }
+    
+    int IOSSide::UpdateStyle(const char* pageId, const char* ref,
+                            std::vector<std::pair<std::string, std::string>> *style,
+                            std::vector<std::pair<std::string, std::string>> *margin,
+                            std::vector<std::pair<std::string, std::string>> *padding,
+                            std::vector<std::pair<std::string, std::string>> *border)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        NSMutableDictionary* ns_style = NSDICTIONARY(style);
+        MergeBorderWidthValues(ns_style, border);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: updateStyles ref:%@, styles:%@", ns_ref, ns_style);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        
+        [manager startComponentTasks];
+        [manager updateStyles:ns_style forComponent:ns_ref];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"updateStyles" options:@{@"threadName":WXTDOMThread}];
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::UpdateAttr(const char* pageId, const char* ref,
+                           std::vector<std::pair<std::string, std::string>> *attrs)
+    {
+        if (attrs == nullptr) {
+            return 0;
+        }
+        if (attrs->size() == 0) {
+            return 0;
+        }
+        
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        NSDictionary* ns_attributes = NSDICTIONARY(attrs);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: updateAttrs ref:%@, attr:%@", ns_ref, ns_attributes);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager updateAttributes:ns_attributes forComponent:ns_ref];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"updateAttrs" options:@{@"threadName":WXTDOMThread}];
+
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::CreateFinish(const char* pageId)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: createFinish :%@", ns_instanceId);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager createFinish];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"createFinish" options:@{@"threadName":WXTDOMThread}];
+
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+    
+    int IOSSide::RenderSuccess(const char* pageId)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: renderFinish :%@", ns_instanceId);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager renderFinish];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"renderFinish" options:@{@"threadName":WXTDOMThread}];
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::RemoveElement(const char* pageId, const char* ref)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: removeElement ref:%@", ns_ref);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        
+        [manager startComponentTasks];
+        [manager removeComponent:ns_ref];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"removeElement" options:@{@"threadName":WXTDOMThread}];
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::MoveElement(const char* pageId, const char* ref, const char* parentRef, int index)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        NSString* ns_parentRef = NSSTRING(parentRef);
+        NSInteger ns_index = index;
+        
+#ifdef DEBUG
+        WXLogDebug(@"flexLayout -> action: moveElement, ref:%@ to ref:%@", ns_ref, ns_parentRef);
+#endif
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        
+        [manager startComponentTasks];
+        [manager moveComponent:ns_ref toSuper:ns_parentRef atIndex:ns_index];
+        [WXTracingManager startTracingWithInstanceId:ns_instanceId ref:ns_ref className:nil name:WXTDomCall phase:WXTracingEnd functionName:@"moveElement" options:@{@"threadName":WXTDOMThread}];
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+        
+    int IOSSide::AppendTreeCreateFinish(const char* pageId, const char* ref)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        [manager startComponentTasks];
+        [manager appendTreeCreateFinish:ns_ref];
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return 0;
+    }
+    
+    int IOSSide::HasTransitionPros(const char* pageId, const char* ref,
+                              std::vector<std::pair<std::string, std::string>> *style)
+    {
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page == nullptr) {
+            return -1;
+        }
+        
+        long long startTime = getCurrentTime();
+        
+        NSString* ns_instanceId = NSSTRING(pageId);
+        NSString* ns_ref = NSSTRING(ref);
+        
+        WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+        if (!manager.isValid) {
+            return -1;
+        }
+        
+        // if transition is none, return directly, avoiding convert style
+        if ([manager isTransitionNoneOfComponent:ns_ref]) {
+            return 0;
+        }
+        
+        int result = [manager hasTransitionPropertyInStyles:NSDICTIONARY(style) forComponent:ns_ref] ? 1 : 0;
+        
+        page->CallBridgeTime(getCurrentTime() - startTime);
+        return result;
+    }
+    
+#pragma mark - Layout Impl
+    
+    WXCoreSize WXCoreMeasureFunctionBridge::Measure(const char* page_id, long render_ptr, float width, MeasureMode widthMeasureMode, float height, MeasureMode heightMeasureMode)
+    {
+        // should not enter this function
+        assert(false);
+    }
+    
+    void WXCoreMeasureFunctionBridge::LayoutBefore(const char* page_id, long render_ptr)
+    {
+        
+    }
+    
+    void WXCoreMeasureFunctionBridge::LayoutAfter(const char* page_id, long render_ptr, float width, float height)
+    {
+        
+    }
+}
+
+@implementation WXCoreBridge
+
+static WeexCore::PlatformBridge* platformBridge = nullptr;
+static WeexCore::ScriptBridge* jsBridge = nullptr;
+
++ (void)install
+{
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        WeexCore::WXCoreEnvironment* env = WeexCore::WXCoreEnvironment::getInstance();
+        env->SetPlatform(OS_iOS);
+        env->AddOption("scale", "1");
+        
+        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));
+        env->AddOption("status_bar_height", std::to_string([[UIApplication sharedApplication] statusBarFrame].size.height));
+        
+        platformBridge = new WeexCore::PlatformBridge();
+        platformBridge->set_platform_side(new WeexCore::IOSSide());
+        platformBridge->set_core_side(new WeexCore::CoreSideInPlatform());
+        WeexCore::WeexCoreManager::Instance()->set_platform_bridge(platformBridge);
+        
+        jsBridge = new WeexCore::ScriptBridge();
+        jsBridge->set_core_side(new WeexCore::CoreSideInScript());
+        WeexCore::WeexCoreManager::Instance()->set_script_bridge(jsBridge);
+        
+        WeexCore::WeexCoreManager::Instance()->set_measure_function_adapter(new WeexCore::WXCoreMeasureFunctionBridge());
+    });
+}
+
++ (void)createDataRenderInstance:(NSString *)pageId template:(NSString *)jsBundleString options:(NSDictionary *)options  data:(id)data
+{
+    auto node_manager = weex::core::data_render::VNodeRenderManager::GetInstance();
+    NSString *optionsString = [WXUtility JSONString:options];
+    NSString *dataString = [WXUtility JSONString:data];
+    node_manager->CreatePage([jsBundleString UTF8String] ?: "", [pageId UTF8String] ?: "", [optionsString UTF8String] ?: "", [dataString UTF8String] ?: "");
+}
+
++ (void)destroyDataRenderInstance:(NSString *)pageId
+{
+    auto node_manager = weex::core::data_render::VNodeRenderManager::GetInstance();
+    node_manager->ClosePage([pageId UTF8String] ?: "");
+}
+
++ (void)refreshDataRenderInstance:(NSString *)pageId data:(NSString *)data;
+{
+    auto node_manager = weex::core::data_render::VNodeRenderManager::GetInstance();
+    node_manager->RefreshPage([pageId UTF8String] ?: "", [data UTF8String] ?: "");
+}
+
++ (void)setDefaultDimensionIntoRoot:(NSString*)pageId width:(CGFloat)width height:(CGFloat)height
+                 isWidthWrapContent:(BOOL)isWidthWrapContent
+                isHeightWrapContent:(BOOL)isHeightWrapContent
+{
+    if (platformBridge) {
+        if (width == 0 && !isWidthWrapContent) {
+            return;
+        }
+        
+        if (height == 0 && !isHeightWrapContent) {
+            return;
+        }
+        
+        platformBridge->core_side()->SetDefaultHeightAndWidthIntoRootDom([pageId UTF8String] ?: "", (float)width, (float)height, (bool)isWidthWrapContent, (bool)isHeightWrapContent);
+    }
+}
+
++ (void)setViewportWidth:(NSString*)pageId width:(CGFloat)width
+{
+    if (platformBridge) {
+        platformBridge->core_side()->SetViewPortWidth([pageId UTF8String] ?: "", (float)width);
+    }
+}
+
++ (void)layoutPage:(NSString*)pageId forced:(BOOL)forced
+{
+    if (platformBridge) {
+        const char* page = [pageId UTF8String] ?: "";
+        if (forced) {
+            platformBridge->core_side()->SetPageDirty(page);
+        }
+        
+        if (platformBridge->core_side()->NotifyLayout(page)) {
+            platformBridge->core_side()->ForceLayout(page);
+        }
+    }
+}
+
++ (void)closePage:(NSString*)pageId
+{
+    if (platformBridge) {
+        platformBridge->core_side()->OnInstanceClose([pageId UTF8String] ?: "");
+    }
+}
+
+static void _traverseTree(WeexCore::RenderObject *render, int index, const char* pageId)
+{
+    using namespace WeexCore;
+    if (render == nullptr) return;
+
+    if (render->hasNewLayout()) {
+        /* do not call bridge->callLayout because render is not registered to page, so that
+         page->GetRenderObject will not give the correct object. */
+        RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
+        if (page != nullptr) {
+            WXComponent* component = (__bridge WXComponent *)(render->getContext());
+            NSString* ns_instanceId = NSSTRING(pageId);
+            
+            float top = render->getLayoutPositionTop();
+            float left = render->getLayoutPositionLeft();
+            float height = render->getLayoutHeight();
+            float width = render->getLayoutWidth();
+            
+            WXComponentManager* manager = [WXSDKManager instanceForID:ns_instanceId].componentManager;
+            CGRect frame = CGRectMake(isnan(WXRoundPixelValue(left))?0:WXRoundPixelValue(left),
+                                      isnan(WXRoundPixelValue(top))?0:WXRoundPixelValue(top),
+                                      isnan(WXRoundPixelValue(width))?0:WXRoundPixelValue(width),
+                                      isnan(WXRoundPixelValue(height))?0:WXRoundPixelValue(height));
+            [manager layoutComponent:component frame:frame innerMainSize:render->getLargestMainSize()];
+        }
+        render->setHasNewLayout(false);
+    }
+
+    for (auto it = render->ChildListIterBegin(); it != render->ChildListIterEnd(); it ++) {
+        WeexCore::RenderObject *child = static_cast<WeexCore::RenderObject *>(*it);
+        if (child != nullptr) {
+            _traverseTree(child, (int)(it - render->ChildListIterBegin()), pageId);
+        }
+    }
+}
+
++ (void)layoutRenderObject:(void*)object size:(CGSize)size page:(NSString*)pageId
+{
+    using namespace WeexCore;
+    RenderObject* render = static_cast<RenderObject*>(object);
+    std::pair<float, float> renderPageSize(size.width, size.height);
+    
+    render->calculateLayout(renderPageSize);
+    _traverseTree(render, 0, [pageId UTF8String] ?: "");
+}
+
++ (void*)copyRenderObject:(void*)source replacedRef:(NSString*)ref
+{
+    using namespace WeexCore;
+    RenderObject* sourceObject = static_cast<RenderObject*>(source);
+    RenderObject* copyObject = static_cast<RenderObject*>(RenderCreator::GetInstance()->CreateRender(sourceObject->type(), sourceObject->ref()));
+                                                          
+    copyObject->CopyFrom(sourceObject);
+    if (ref != nil) {
+        copyObject->set_ref([ref UTF8String] ?: "");
+    }
+
+    if (sourceObject->type() == kRenderCellSlot || sourceObject->type() == kRenderCell) {
+        RenderList* renderList = static_cast<RenderList*>(sourceObject->getParent());
+        if (renderList != nullptr) {
+            renderList->AddCellSlotCopyTrack(copyObject);
+        }
+    }
+    return copyObject;
+}
+
++ (void)addChildRenderObject:(void*)child toParent:(void*)parent
+{
+    (static_cast<WeexCore::RenderObject*>(parent))->AddRenderObject(-1, (static_cast<WeexCore::RenderObject*>(child)));
+}
+
+static void _convertToCString(id _Nonnull obj, void (^callback)(const char*))
+{
+    if ([obj isKindOfClass:[NSString class]]) {
+        callback([obj UTF8String]);
+    }
+    else if ([obj isKindOfClass:[NSNumber class]]) {
+        NSNumber* num = (NSNumber*)obj;
+        char objcType = [num objCType][0];
+        char buffer[128];
+        switch (objcType) {
+            case _C_DBL:
+            case _C_FLT:
+                snprintf(buffer, sizeof(buffer), "%f", [num doubleValue]);
+                callback(buffer);
+                break;
+            case _C_INT:
+            case _C_CHR:
+            case _C_SHT:
+                snprintf(buffer, sizeof(buffer), "%d", [num intValue]);
+                callback(buffer);
+                break;
+            case _C_USHT:
+            case _C_UINT:
+            case _C_UCHR:
+                snprintf(buffer, sizeof(buffer), "%u", [num unsignedIntValue]);
+                callback(buffer);
+                break;
+            case _C_LNG:
+            case _C_LNG_LNG:
+                snprintf(buffer, sizeof(buffer), "%lld", [num longLongValue]);
+                callback(buffer);
+                break;
+            case _C_ULNG:
+            case _C_ULNG_LNG:
+                snprintf(buffer, sizeof(buffer), "%llu", [num unsignedLongLongValue]);
+                callback(buffer);
+                break;
+            case _C_BFLD:
+            case _C_BOOL:
+                callback([num boolValue] ? "true" : "false");
+                break;
+            default:
+                callback([[num stringValue] UTF8String]);
+                break;
+        }
+    }
+    else if ([obj isKindOfClass:[NSNull class]]) {
+        callback([JSONSTRING_SUFFIX UTF8String]);
+    }
+    else {
+        NSString* jsonstring = WeexCore::TO_JSON(obj);
+        if (jsonstring != nil) {
+            callback([jsonstring UTF8String]);
+        }
+    }
+}
+
+static void _parseStyleBeforehand(NSDictionary* styles, NSString* key, WeexCore::RenderObject* render)
+{
+    id data = styles[key];
+    if (data) {
+        _convertToCString(data, ^(const char * value) {
+            if (value != nullptr) {
+                render->AddStyle([key UTF8String], value);
+            }
+        });
+    }
+}
+
+static WeexCore::RenderObject* _parseRenderObject(NSDictionary* data, WeexCore::RenderObject* parent,
+                                                  int index, const std::string& pageId)
+{
+    using namespace WeexCore;
+    
+    const char* type = [data[@"type"] UTF8String];
+    const char* ref = [data[@"ref"] UTF8String];
+    if (type != nullptr && ref != nullptr) {
+        RenderObject* render = (RenderObject *)RenderCreator::GetInstance()->CreateRender(type, ref);
+        render->set_page_id(pageId);
+        if (parent != nullptr){
+            parent->AddRenderObject(index, render);
+        }
+        
+        [data[@"attr"] enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
+            _convertToCString(obj, ^(const char * value) {
+                if (value != nullptr) {
+                    render->AddAttr([key UTF8String], value);
+                }
+            });
+        }];
+        
+        // margin/padding/borderWidth should be handled beforehand. Because maringLeft should override margin.
+        NSDictionary* styles = data[@"style"];
+        _parseStyleBeforehand(styles, @"margin", render);
+        _parseStyleBeforehand(styles, @"padding", render);
+        _parseStyleBeforehand(styles, @"borderWidth", render);
+        [styles enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
+            if ([key isEqualToString:@"margin"] || [key isEqualToString:@"padding"] || [key isEqualToString:@"borderWidth"]) {
+                return;
+            }
+            _convertToCString(obj, ^(const char * value) {
+                if (value != nullptr) {
+                    render->AddStyle([key UTF8String], value);
+                }
+            });
+        }];
+        
+        for (id obj in data[@"event"]) {
+            _convertToCString(obj, ^(const char * value) {
+                if (value != nullptr) {
+                    render->AddEvent(value);
+                }
+            });
+        }
+        
+        int childIndex = 0;
+        for (NSDictionary* obj in data[@"children"]) {
+            _parseRenderObject(obj, render, childIndex ++, pageId);
+        }
+        
+        render->ApplyDefaultStyle();
+        render->ApplyDefaultAttr();
+        
+        return render;
+    }
+    return nullptr;
+}
+
+static std::vector<std::pair<std::string, std::string>>* _parseMapValuePairs(NSDictionary* data)
+{
+    std::vector<std::pair<std::string, std::string>>* result = new std::vector<std::pair<std::string, std::string>>();
+    [data enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
+        _convertToCString(obj, ^(const char * value) {
+            if (value != nullptr) {
+                result->emplace_back([key UTF8String], value);
+            }
+        });
+    }];
+    return result;
+}
+
++ (void)callAddElement:(NSString*)pageId parentRef:(NSString*)parentRef data:(NSDictionary*)data index:(int)index
+{
+    using namespace WeexCore;
+    const std::string page([pageId UTF8String] ?: "");
+    RenderObject* child = _parseRenderObject(data, nullptr, 0, page);
+    RenderManager::GetInstance()->AddRenderObject(page, [parentRef UTF8String] ?: "", index, child);
+}
+
++ (void)callCreateBody:(NSString*)pageId data:(NSDictionary*)data
+{
+    using namespace WeexCore;
+    const std::string page([pageId UTF8String] ?: "");
+    RenderManager::GetInstance()->CreatePage(page, [&] (RenderPage* pageInstance) -> RenderObject* {
+        pageInstance->set_before_layout_needed(false); // we do not need before and after layout
+        pageInstance->set_after_layout_needed(false);
+        pageInstance->set_platform_layout_needed(true);
+        return _parseRenderObject(data, nullptr, 0, page);
+    });
+}
+
++ (void)callRemoveElement:(NSString*)pageId ref:(NSString*)ref
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->RemoveElement([pageId UTF8String] ?: "", [ref UTF8String] ?: "");
+}
+
++ (void)callMoveElement:(NSString*)pageId ref:(NSString*)ref parentRef:(NSString*)parentRef index:(int)index
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->MoveElement([pageId UTF8String] ?: "", [ref UTF8String] ?: "", [parentRef UTF8String] ?: "", index);
+}
+
++ (void)callUpdateAttrs:(NSString*)pageId ref:(NSString*)ref data:(NSDictionary*)data
+{
+    WeexCore::RenderManager::GetInstance()->UpdateAttr([pageId UTF8String] ?: "", [ref UTF8String] ?: "", _parseMapValuePairs(data));
+}
+
++ (void)callUpdateStyle:(NSString*)pageId ref:(NSString*)ref data:(NSDictionary*)data
+{
+    WeexCore::RenderManager::GetInstance()->UpdateStyle([pageId UTF8String] ?: "", [ref UTF8String] ?: "", _parseMapValuePairs(data));
+}
+
++ (void)callAddEvent:(NSString*)pageId ref:(NSString*)ref event:(NSString*)event
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->AddEvent([pageId UTF8String] ?: "", [ref UTF8String] ?: "", [event UTF8String] ?: "");
+}
+
++ (void)callRemoveEvent:(NSString*)pageId ref:(NSString*)ref event:(NSString*)event
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->RemoveEvent([pageId UTF8String] ?: "", [ref UTF8String] ?: "", [event UTF8String] ?: "");
+}
+
++ (void)callCreateFinish:(NSString*)pageId
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->CreateFinish([pageId UTF8String] ?: "");
+}
+
++ (void)callRefreshFinish:(NSString*)pageId
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->RefreshFinish([pageId UTF8String] ?: "", nullptr, nullptr);
+}
+
++ (void)callUpdateFinish:(NSString*)pageId
+{
+    WeexCore::WeexCoreManager::Instance()->script_bridge()->core_side()->UpdateFinish([pageId UTF8String] ?: "", nullptr, 0, nullptr, 0);
+}
+
+@end
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
similarity index 89%
rename from ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
rename to ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
index 885c33e8d6..ade954deb7 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXJSCoreBridge.mm
@@ -37,6 +37,7 @@
 #import "WXPolyfillSet.h"
 #import "WXAppMonitorProtocol.h"
 #import "JSContext+Weex.h"
+#import "WXCoreBridge.h"
 
 #import <dlfcn.h>
 
@@ -62,6 +63,7 @@ - (instancetype)init
     self = [super init];
     
     if(self){
+
         _jsContext = [[JSContext alloc] init];
         if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
             _jsContext.name = @"Weex Context";
@@ -73,7 +75,7 @@ - (instancetype)init
         _multiContext = NO;
 
         __weak typeof(self) weakSelf = self;
-        
+
         [WXBridgeContext mountContextEnvironment:_jsContext];
         
         _jsContext[@"setTimeout"] = ^(JSValue *function, JSValue *timeout) {
@@ -105,6 +107,7 @@ - (instancetype)init
         _jsContext[@"extendCallNative"] = ^(JSValue *value ) {
             return [weakSelf extendCallNative:[value toDictionary]];
         };
+
     }
     return self;
 }
@@ -139,6 +142,7 @@ - (void)setWeexInstanceId:(NSString *)weexInstanceId
 
 - (void)executeJSFramework:(NSString *)frameworkScript
 {
+
     WXAssertParam(frameworkScript);
     if (WX_SYS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
         NSString * fileName = @"native-bundle-main.js";
@@ -179,6 +183,7 @@ - (void)executeJavascript:(NSString *)script
 - (JSValue*)executeJavascript:(NSString *)script withSourceURL:(NSURL*)sourceURL
 {
     WXAssertParam(script);
+
     if (sourceURL) {
         return [_jsContext evaluateScript:script withSourceURL:sourceURL];
     } else {
@@ -194,12 +199,11 @@ - (void)registerCallAddElement:(WXJSCallAddElement)callAddElement
         NSDictionary *componentData = [element toDictionary];
         NSString *parentRef = [ref toString];
         NSInteger insertIndex = [[index toNumber] integerValue];
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:componentData[@"ref"] className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"addElement" options:@{@"threadName":WXTJSBridgeThread,@"componentData":componentData}];
-         WXLogDebug(@"callAddElement...%@, %@, %@, %ld", instanceIdString, parentRef, componentData, (long)insertIndex);
+        WXLogDebug(@"callAddElement...%@, %@, %@, %ld", instanceIdString, parentRef, componentData, (long)insertIndex);
         
         return [JSValue valueWithInt32:(int32_t)callAddElement(instanceIdString, parentRef, componentData, insertIndex) inContext:[JSContext currentContext]];
     };
-
+    
     _jsContext[@"callAddElement"] = callAddElementBlock;
 }
 
@@ -211,7 +215,6 @@ - (void)registerCallCreateBody:(WXJSCallCreateBody)callCreateBody
         NSDictionary *bodyData = [body toDictionary];
         
         WXLogDebug(@"callCreateBody...%@, %@,", instanceIdString, bodyData);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:bodyData[@"ref"] className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"createBody" options:@{@"threadName":WXTJSBridgeThread}];
         return [JSValue valueWithInt32:(int32_t)callCreateBody(instanceIdString, bodyData) inContext:[JSContext currentContext]];
     };
     
@@ -226,7 +229,6 @@ - (void)registerCallRemoveElement:(WXJSCallRemoveElement)callRemoveElement
         NSString *refString = [ref toString];
         
         WXLogDebug(@"callRemoveElement...%@, %@,", instanceIdString, refString);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:nil className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"removeElement" options:nil];
         return [JSValue valueWithInt32:(int32_t)callRemoveElement(instanceIdString, refString) inContext:[JSContext currentContext]];
     };
     
@@ -242,9 +244,8 @@ - (void)registerCallMoveElement:(WXJSCallMoveElement)callMoveElement
         NSString *parentRefString = [parentRef toString];
         NSInteger moveIndex = [[index toNumber] integerValue];
         
-        WXLogDebug(@"callAddElement...%@, %@,", instanceIdString, refString);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:refString className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"moveElement" options:nil];
-        return [JSValue valueWithInt32:(int32_t)callMoveElement(instanceIdString, refString,parentRefString,moveIndex) inContext:[JSContext currentContext]];
+        WXLogDebug(@"callMoveElement...%@, %@,", instanceIdString, refString);
+        return [JSValue valueWithInt32:(int32_t)callMoveElement(instanceIdString, refString, parentRefString, moveIndex) inContext:[JSContext currentContext]];
     };
     
     _jsContext[@"callMoveElement"] = WXJSCallMoveElementBlock;
@@ -259,7 +260,6 @@ - (void)registerCallUpdateAttrs:(WXJSCallUpdateAttrs)callUpdateAttrs
         NSDictionary *attrsData = [attrs toDictionary];
         
         WXLogDebug(@"callUpdateAttrs...%@, %@, %@", instanceIdString, refString,attrsData);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:refString className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"updateAttrs" options:@{@"threadName":WXTJSBridgeThread}];
         return [JSValue valueWithInt32:(int32_t)callUpdateAttrs(instanceIdString, refString,attrsData) inContext:[JSContext currentContext]];
     };
     
@@ -274,8 +274,7 @@ - (void)registerCallUpdateStyle:(WXJSCallUpdateStyle)callUpdateStyle
         NSString *refString = [ref toString];
         NSDictionary *stylessData = [styles toDictionary];
         
-        WXLogDebug(@"callUpdateStyle...%@, %@, %@", instanceIdString, refString,stylessData);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:refString className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"updateStyle" options:@{@"threadName":WXTJSBridgeThread}];
+        WXLogDebug(@"callUpdateStyle...%@, %@, %@", instanceIdString, refString, stylessData);
         return [JSValue valueWithInt32:(int32_t)callUpdateStyle(instanceIdString, refString,stylessData) inContext:[JSContext currentContext]];
     };
     
@@ -290,8 +289,7 @@ - (void)registerCallAddEvent:(WXJSCallAddEvent)callAddEvent
         NSString *refString = [ref toString];
         NSString *eventString = [event toString];
         
-        WXLogDebug(@"callAddEvent...%@, %@, %@", instanceIdString, refString,eventString);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:refString className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"addEvent" options:nil];
+        WXLogDebug(@"callAddEvent...%@, %@, %@", instanceIdString, refString, eventString);
         return [JSValue valueWithInt32:(int32_t)callAddEvent(instanceIdString, refString,eventString) inContext:[JSContext currentContext]];
     };
     
@@ -307,7 +305,6 @@ - (void)registerCallRemoveEvent:(WXJSCallRemoveEvent)callRemoveEvent
         NSString *eventString = [event toString];
         
         WXLogDebug(@"callRemoveEvent...%@, %@, %@", instanceIdString, refString,eventString);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:refString className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"removeEvent" options:nil];
         return [JSValue valueWithInt32:(int32_t)callRemoveEvent(instanceIdString, refString,eventString) inContext:[JSContext currentContext]];
     };
     
@@ -317,17 +314,36 @@ - (void)registerCallRemoveEvent:(WXJSCallRemoveEvent)callRemoveEvent
 - (void)registerCallCreateFinish:(WXJSCallCreateFinish)callCreateFinish
 {
     id WXJSCallCreateFinishBlock = ^(JSValue *instanceId, JSValue *ifCallback) {
-            
         NSString *instanceIdString = [instanceId toString];
-        
-        WXLogDebug(@"callRCreateFinish...%@", instanceIdString);
-        [WXTracingManager startTracingWithInstanceId:instanceIdString ref:nil className:nil name:WXTJSCall phase:WXTracingBegin functionName:@"createFinish" options:@{@"threadName":WXTJSBridgeThread}];
+        WXLogDebug(@"callCreateFinish...%@", instanceIdString);
         return [JSValue valueWithInt32:(int32_t)callCreateFinish(instanceIdString) inContext:[JSContext currentContext]];
     };
         
     _jsContext[@"callCreateFinish"] = WXJSCallCreateFinishBlock;
 }
 
+- (void)registerCallRefreshFinish:(WXJSCallRefreshFinish)callRefreshFinish
+{
+    id WXJSCallCreateFinishBlock = ^(JSValue *instanceId, JSValue *ifCallback) {
+        NSString *instanceIdString = [instanceId toString];
+        WXLogDebug(@"callRefreshFinish...%@", instanceIdString);
+        return [JSValue valueWithInt32:(int32_t)callRefreshFinish(instanceIdString) inContext:[JSContext currentContext]];
+    };
+    
+    _jsContext[@"callRefreshFinish"] = WXJSCallCreateFinishBlock;
+}
+
+- (void)registerCallUpdateFinish:(WXJSCallUpdateFinish)callUpdateFinish
+{
+    id WXJSCallCreateFinishBlock = ^(JSValue *instanceId, JSValue *ifCallback) {
+        NSString *instanceIdString = [instanceId toString];
+        WXLogDebug(@"callUpdateFinish...%@", instanceIdString);
+        return [JSValue valueWithInt32:(int32_t)callUpdateFinish(instanceIdString) inContext:[JSContext currentContext]];
+    };
+    
+    _jsContext[@"callUpdateFinish"] = WXJSCallCreateFinishBlock;
+}
+
 - (void)registerCallNativeModule:(WXJSCallNativeModule)callNativeModuleBlock
 {
     _jsContext[@"callNativeModule"] = ^JSValue *(JSValue *instanceId, JSValue *moduleName, JSValue *methodName, JSValue *args, JSValue *options) {
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXCellSlotComponent.mm b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXCellSlotComponent.mm
index 340b139c30..3b7b90635c 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXCellSlotComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXCellSlotComponent.mm
@@ -23,7 +23,8 @@
 #import "WXSDKInstance_private.h"
 #import "WXConvert.h"
 #import "WXAssert.h"
-#import "WXScrollerComponent+Layout.h"
+#import "WXComponent+Layout.h"
+#import "WXCoreBridge.h"
 
 @implementation WXCellSlotComponent
 
@@ -63,28 +64,22 @@ - (void)updateCellData:(NSDictionary *)data
 
 - (void)_didInserted
 {
-    [self triggerLayout];
 }
 
 - (void)triggerLayout
 {
     WXAssertComponentThread();
+    
+    if (self.flexCssNode == nullptr) {
+        return;
+    }
+    
     if (flexIsUndefined(self.flexCssNode->getStyleWidth())) {
-        self.flexCssNode->setStyleWidth(((WXScrollerComponent *)(self.supercomponent)).flexScrollerCSSNode->getStyleWidth(),NO);
+        self.flexCssNode->setStyleWidth(self.supercomponent.flexCssNode->getLayoutWidth(), NO);
     }
     
     if ([self needsLayout]) {
-        std::pair<float, float> renderPageSize;
-        renderPageSize.first = self.weexInstance.frame.size.width;
-        renderPageSize.second = self.weexInstance.frame.size.height;
-        self.flexCssNode->calculateLayout(renderPageSize);
-    }
-    NSMutableSet<WXComponent *> *dirtyComponents = [NSMutableSet set];
-    [self _calculateFrameWithSuperAbsolutePosition:CGPointZero gatherDirtyComponents:dirtyComponents];
-    for (WXComponent *dirtyComponent in dirtyComponents) {
-        [self.weexInstance.componentManager _addUITask:^{
-            [dirtyComponent _layoutDidFinish];
-        }];
+        [WXCoreBridge layoutRenderObject:self.flexCssNode size:self.weexInstance.frame.size page:self.weexInstance.instanceId];
     }
 }
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXComponent+DataBinding.mm b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXComponent+DataBinding.mm
index dccc0d2109..c925684df1 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXComponent+DataBinding.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXComponent+DataBinding.mm
@@ -19,6 +19,7 @@
 
 #import "WXComponent+DataBinding.h"
 #import "WXComponent_internal.h"
+#import "WXComponent+Layout.h"
 #import "WXSDKInstance_private.h"
 #import "WXComponentManager.h"
 #import "WXSDKManager.h"
@@ -28,6 +29,7 @@
 #import "WXUtility.h"
 #import "WXRecycleListComponent.h"
 #import "WXRecycleListDataManager.h"
+#import "WXCoreBridge.h"
 
 #import <JavaScriptCore/JavaScriptCore.h>
 
@@ -244,10 +246,18 @@ - (void)_repeat:(NSArray *)repeatData inData:(NSDictionary *)data
         
         if (!exsitingComponent) {
             [self.weexInstance.componentManager startComponentTasks];
-            [self.supercomponent _insertSubcomponent:component atIndex:startIndex + idx];
-            [self.weexInstance.componentManager _addUITask:^{
-                [self.supercomponent insertSubview:component atIndex:startIndex + idx];
-            }];
+            BOOL inserted = [self.supercomponent _insertSubcomponent:component atIndex:startIndex + idx];
+            if (inserted) {
+                // add to layout tree
+                [WXCoreBridge addChildRenderObject:component->_flexCssNode toParent:self.supercomponent->_flexCssNode];
+                
+                [self.weexInstance.componentManager _addUITask:^{
+                    [self.supercomponent insertSubview:component atIndex:startIndex + idx];
+                }];
+            }
+            else {
+                WXLogError(@"fail to insert copied component for data binding.");
+            }
         }
     }];
     
@@ -383,7 +393,15 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
     if (!expression) {
         return nil;
     }
+    
+    __weak typeof(self) weakSelf = self;
     WXDataBindingBlock block = ^id(NSDictionary *data, BOOL *needUpdate) {
+        __strong typeof(weakSelf) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            *needUpdate = NO;
+            return nil;
+        }
+        
         if (expression->is<WXJSStringLiteral>()) {
             *needUpdate = NO;
             return [NSString stringWithCString:(((WXJSStringLiteral *)expression)->value).c_str() encoding:[NSString defaultCStringEncoding]];
@@ -409,9 +427,9 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
         } else if (expression->is<WXJSMemberExpression>()) {
             WXJSMemberExpression *member = (WXJSMemberExpression *)expression;
             BOOL objectNeedUpdate = NO, propertyNeedUpdate = NO;
-            id object = [self bindingBlockWithExpression:member->object](data, &objectNeedUpdate);
+            id object = [strongSelf bindingBlockWithExpression:member->object](data, &objectNeedUpdate);
             if (member->computed) {
-                id propertyName = [self bindingBlockWithExpression:member->property](data, &propertyNeedUpdate);
+                id propertyName = [strongSelf bindingBlockWithExpression:member->property](data, &propertyNeedUpdate);
                 *needUpdate = objectNeedUpdate || propertyNeedUpdate;
                 if ([object isKindOfClass:[NSDictionary class]] && [propertyName isKindOfClass:[NSString class]]) {
                     return object[propertyName];
@@ -427,7 +445,7 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
                         return object[propertyName];
                     }
                 } else {
-                    id retvalue = [self bindingBlockWithExpression:member->property](object, &objectNeedUpdate);
+                    id retvalue = [strongSelf bindingBlockWithExpression:member->property](object, &objectNeedUpdate);
                     *needUpdate = objectNeedUpdate || propertyNeedUpdate;
                     return retvalue;
                 }
@@ -442,7 +460,7 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
                 if (expr == NULL) {
                     continue;
                 }
-                WXDataBindingBlock block = [self bindingBlockWithExpression:expr];
+                WXDataBindingBlock block = [strongSelf bindingBlockWithExpression:expr];
                 *needUpdate = NO;
                 if (block) {
                     BOOL elementNeedUpdate;
@@ -458,7 +476,7 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
         } else if (expression->is<WXJSUnaryExpression>()) {
             WXJSUnaryExpression *expr = (WXJSUnaryExpression *)expression;
             std::string operator_ = expr->operator_;
-            id argument = [self bindingBlockWithExpression:expr->argument](data, needUpdate);
+            id argument = [strongSelf bindingBlockWithExpression:expr->argument](data, needUpdate);
             if (operator_ == "+") {
                 return @([argument doubleValue]);
             } else if (operator_ == "-") {
@@ -473,8 +491,8 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
             WXJSBinaryExpression *expr = (WXJSBinaryExpression *)expression;
             std::string operator_ = expr->operator_;
             BOOL leftNeedUpdate = NO, rightNeedUpdate = NO;
-            id left = [self bindingBlockWithExpression:expr->left](data, &leftNeedUpdate);
-            id right = [self bindingBlockWithExpression:expr->right](data, &rightNeedUpdate);
+            id left = [strongSelf bindingBlockWithExpression:expr->left](data, &leftNeedUpdate);
+            id right = [strongSelf bindingBlockWithExpression:expr->right](data, &rightNeedUpdate);
             *needUpdate = leftNeedUpdate || rightNeedUpdate;
             if (operator_ == "+") {
                 return @([left doubleValue] + [right doubleValue]);
@@ -523,12 +541,12 @@ - (WXDataBindingBlock)bindingBlockWithExpression:(WXJSExpression *)expression
         } else if (expression->is<WXJSConditionalExpression>()) {
             WXJSConditionalExpression *conditional = (WXJSConditionalExpression *)expression;
             BOOL testNeedUpdate = NO, conditionalNeedUpdate = NO, alternateNeedUpdate = NO;
-            id testResult = [self bindingBlockWithExpression:conditional->test](data, &testNeedUpdate);
+            id testResult = [strongSelf bindingBlockWithExpression:conditional->test](data, &testNeedUpdate);
             id result;
             if ([testResult boolValue]) {
-                result = [self bindingBlockWithExpression:conditional->consequent](data, &conditionalNeedUpdate);
+                result = [strongSelf bindingBlockWithExpression:conditional->consequent](data, &conditionalNeedUpdate);
             } else {
-                result = [self bindingBlockWithExpression:conditional->alternate](data, &alternateNeedUpdate);
+                result = [strongSelf bindingBlockWithExpression:conditional->alternate](data, &alternateNeedUpdate);
             }
             *needUpdate = testNeedUpdate || conditionalNeedUpdate || alternateNeedUpdate;
             return result;
@@ -607,7 +625,7 @@ - (void)_componentInfoOfRef:(WXComponent *)component subInfo:(NSMutableDictionar
                 indexPath = data[key][@"indexPath"];
             }
         }
-        NSString *virtualElementInfo = [NSString stringWithFormat:@"%@@%lu",component.ref,indexPath.row];
+        NSString *virtualElementInfo = [NSString stringWithFormat:@"%@@%ld",component.ref,(long)indexPath.row];
         NSDictionary *refInfo = @{@"attrs":component.attributes,@"type":component->_type,@"ref":virtualElementInfo,@"[[VirtualElement]]":@"true"};
         if (subInfo[component.attributes[@"ref"]]) {
             [subInfo[component.attributes[@"ref"]] addObject:refInfo];
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
index 1994bb2df8..011c4322de 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
@@ -510,9 +510,9 @@ - (BOOL)_parseCssSelector:(NSString *)cssSelector component:(WXComponent *)compo
 
 #pragma mark - WXComponent Internal Methods
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
-   [super _insertSubcomponent:subcomponent atIndex:index];
+    BOOL inserted = [super _insertSubcomponent:subcomponent atIndex:index];
     if ([subcomponent isKindOfClass:[WXCellSlotComponent class]]) {
         WXCellSlotComponent *cell = (WXCellSlotComponent*)subcomponent;
         [self.weexInstance.componentManager _addUITask:^{
@@ -520,6 +520,7 @@ - (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
         }];
         //TODO: update collection view if adding template
     }
+    return inserted;
 }
 
 #pragma mark - Private
@@ -584,7 +585,9 @@ - (void)_updateListData:(NSArray *)newData
 {
     if (![newData isKindOfClass:[NSArray class]]) {
         WXLogError(@"wrong format of list data:%@", newData);
-        completion(NO);
+        if (completion) {
+            completion(NO);
+        }
         return;
     }
     
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListUpdateManager.m b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListUpdateManager.m
index d500895c30..25b7282cfc 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListUpdateManager.m
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListUpdateManager.m
@@ -96,7 +96,9 @@ - (void)updateWithNewData:(NSArray *)newData
     
     if (!_collectionView) {
         WXLogError(@"Update list with no collection view");
-        completion(NO);
+        if (completion) {
+            completion(NO);
+        }
         return;
     }
     
diff --git a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.h b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.h
index 3311cdea00..ed12a1560f 100644
--- a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.h
+++ b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.h
@@ -54,4 +54,7 @@ extern NSString * const kCollectionSupplementaryViewKindHeader;
 @property (nonatomic, assign, readonly) int computedColumnCount;
 @property (nonatomic, assign, readonly) CGFloat computedHeaderWidth;
 
+//Under system version 10.0, UICollectionViewLayout.collectionView seems be unsafe_unretain rather than weak. so here add one weak collectionview to use inside the imp to avoid bad access.
+@property (nonatomic, weak) UICollectionView *weak_collectionView;
+
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.m b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.m
index c7a35a1bcb..9ded7247dd 100644
--- a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.m
+++ b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXMultiColumnLayout.m
@@ -22,34 +22,6 @@
 #import "WXUtility.h"
 #import "WXAssert.h"
 
-void computeColumnWidthAndCount(float availableWidth, WXLength *columnCount, WXLength *columnWidth, float columnGap, int *N, float *W)
-{
-    /* Pseudo-algorithm according to
-     * https://www.w3.org/TR/css3-multicol/
-     * Note that, in most cases, only one of ‘column-width’ and ‘column-count’ affect the layout. 
-     * If ‘column-width’ has a value other than ‘auto’, ‘column-count’ indicates the maximum number of columns.
-     **/
-    if (columnWidth.isAuto && columnCount.isAuto) {
-        WXAssert(NO, @"Unsupport both of column-width and column-count being auto.");
-        return;
-    }
-    
-    if (columnWidth.isAuto && !columnCount.isAuto) {
-        *N = columnCount.intValue;
-        *W = MAX(0, (availableWidth - ((*N -1) * columnGap)) / *N);
-    }
-    
-    if (!columnWidth.isAuto && columnCount.isAuto) {
-        *N = MAX(1, WXFloorPixelValue((availableWidth + columnGap) / (columnWidth.floatValue + columnGap)));
-        *W = ((availableWidth + columnGap) / *N) - columnGap;
-    }
-    
-    if (!columnWidth.isAuto && !columnCount.isAuto) {
-        *N = MIN(columnCount.intValue, WXFloorPixelValue((availableWidth + columnGap) / (columnWidth.floatValue + columnGap)));
-        *W = ((availableWidth + columnGap) / *N) - columnGap;
-    }
-}
-
 NSString * const kCollectionSupplementaryViewKindHeader = @"WXCollectionSupplementaryViewKindHeader";
 NSString * const kMultiColumnLayoutHeader = @"WXMultiColumnLayoutHeader";
 NSString * const kMultiColumnLayoutCell = @"WXMultiColumnLayoutCell";
@@ -77,9 +49,6 @@ @interface WXMultiColumnLayout ()
 @property (nonatomic, strong) NSMutableDictionary<NSString *, NSDictionary<id, UICollectionViewLayoutAttributes *> *> *layoutAttributes;
 @property (nonatomic, strong) NSMutableArray<NSNumber *> *columnsMaxHeights;
 
-@property (nonatomic, assign, readwrite) CGFloat computedColumnWidth;
-@property (nonatomic, assign, readwrite) int computedColumnCount;
-
 @end
 
 @implementation WXMultiColumnLayout
@@ -94,6 +63,16 @@ - (instancetype)init
     return self;
 }
 
+//Under system version 10.0, UICollectionViewLayout.collectionView seems be unsafe_unretain rather than weak. sometime when the collectionView is released, and the layout is not released, it may crash.
+- (UICollectionView *)weakCollectionView
+{
+    if ([[[UIDevice currentDevice] systemVersion] floatValue]<10.0f) {
+        return self.weak_collectionView;
+    } else {
+        return self.collectionView;
+    }
+}
+
 #pragma mark - Public Accessors
 
 - (void)setColumnCount:(WXLength *)columnCount
@@ -138,25 +117,19 @@ - (void)setRightGap:(float)rightGap
 
 - (CGFloat)computedColumnWidth
 {
-    if (!_computedColumnWidth && !_computedColumnCount) {
-        [self _computeColumnWidthAndCount];
-    }
-    
-    return _computedColumnWidth;
+    WXAssert([_columnWidth isFixed], @"column width must be calculated by core.");
+    return _columnWidth.floatValue;
 }
 
 - (int)computedColumnCount
 {
-    if (!_computedColumnWidth && !_computedColumnCount) {
-        [self _computeColumnWidthAndCount];
-    }
-    
-    return _computedColumnCount;
+    WXAssert([_columnCount isFixed], @"column count must be calculated by core.");
+    return _columnCount.intValue;
 }
 
 - (CGFloat)computedHeaderWidth
 {
-    UIEdgeInsets insets = [self.delegate collectionView:self.collectionView insetForLayout:self];
+    UIEdgeInsets insets = [self.delegate collectionView:[self weakCollectionView] insetForLayout:self];
     return self.contentWidth - (insets.left + insets.right);
 }
 
@@ -168,8 +141,8 @@ - (void)prepareLayout
     
     [self _cleanup];
     
-    NSInteger numberOfSections = [self.collectionView numberOfSections];
-    UIEdgeInsets insets = [self.delegate collectionView:self.collectionView insetForLayout:self];
+    NSInteger numberOfSections = [[self weakCollectionView]  numberOfSections];
+    UIEdgeInsets insets = [self.delegate collectionView:[self weakCollectionView]  insetForLayout:self];
     
     float columnWidth = self.computedColumnWidth;
     int columnCount = self.computedColumnCount;
@@ -183,13 +156,13 @@ - (void)prepareLayout
     }
     
     for (NSInteger section = 0; section < numberOfSections; section++) {
-        BOOL hasHeader = [self.delegate collectionView:self.collectionView layout:self hasHeaderInSection:section];
+        BOOL hasHeader = [self.delegate collectionView:[self weakCollectionView]  layout:self hasHeaderInSection:section];
         // header
         if (hasHeader) {
-            CGFloat headerHeight = [self.delegate collectionView:self.collectionView layout:self heightForHeaderInSection:section];
+            CGFloat headerHeight = [self.delegate collectionView:[self weakCollectionView]  layout:self heightForHeaderInSection:section];
             WXMultiColumnLayoutHeaderAttributes *headerAttributes = [WXMultiColumnLayoutHeaderAttributes layoutAttributesForSupplementaryViewOfKind:kCollectionSupplementaryViewKindHeader withIndexPath:[NSIndexPath indexPathForItem:0 inSection:section]];
             headerAttributes.frame = CGRectMake(insets.left, currentHeight, self.contentWidth - (insets.left + insets.right), headerHeight);
-            headerAttributes.isSticky = [self.delegate collectionView:self.collectionView layout:self isNeedStickyForHeaderInSection:section];
+            headerAttributes.isSticky = [self.delegate collectionView:[self weakCollectionView] layout:self isNeedStickyForHeaderInSection:section];
             headerAttributes.zIndex = headerAttributes.isSticky ? 1 : 0;
             headersAttributes[@(section)] = headerAttributes;
             
@@ -200,9 +173,9 @@ - (void)prepareLayout
         // cells
         
         @try {
-            for (NSInteger item = 0; item < [self.collectionView numberOfItemsInSection:section]; item++) {
+            for (NSInteger item = 0; item < [[self weakCollectionView] numberOfItemsInSection:section]; item++) {
                 NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section];
-                CGFloat itemHeight = [self.delegate collectionView:self.collectionView layout:self heightForItemAtIndexPath:indexPath];
+                CGFloat itemHeight = [self.delegate collectionView:[self weakCollectionView] layout:self heightForItemAtIndexPath:indexPath];
                 UICollectionViewLayoutAttributes *itemAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
                 NSUInteger column = [self _minHeightColumnForAllColumns];
                 CGFloat x = insets.left + (columnWidth + columnGap) * column+_leftGap;
@@ -234,7 +207,7 @@ - (void)prepareLayout
 
 - (CGSize)collectionViewContentSize
 {
-    NSInteger numberOfSections = [self.collectionView numberOfSections];
+    NSInteger numberOfSections = [[self weakCollectionView] numberOfSections];
     if (numberOfSections == 0) {
         return CGSizeZero;
     }
@@ -250,7 +223,7 @@ - (CGSize)collectionViewContentSize
     [self.layoutAttributes enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull kind, NSDictionary<id,UICollectionViewLayoutAttributes *> * _Nonnull dictionary, BOOL * _Nonnull stop) {
         [dictionary enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, UICollectionViewLayoutAttributes * _Nonnull attributes, BOOL * _Nonnull stop) {
             if (attributes.representedElementKind == kCollectionSupplementaryViewKindHeader
-                && [self.delegate collectionView:self.collectionView layout:self isNeedStickyForHeaderInSection:attributes.indexPath.section]) {
+                && [self.delegate collectionView:[self weakCollectionView] layout:self isNeedStickyForHeaderInSection:attributes.indexPath.section]) {
                 [stickyHeaders addObject:(WXMultiColumnLayoutHeaderAttributes *)attributes];
             } else if (CGRectIntersectsRect(rect, attributes.frame)) {
                 [result addObject:attributes];
@@ -280,10 +253,10 @@ - (CGSize)collectionViewContentSize
 - (void)_adjustStickyForHeaderAttributes:(WXMultiColumnLayoutHeaderAttributes *)header
                                    next:(WXMultiColumnLayoutHeaderAttributes *)nextHeader
 {
-    CGRect bounds = self.collectionView.bounds;
+    CGRect bounds = [self weakCollectionView].bounds;
     CGFloat originY = header.frame.origin.y;
     CGFloat maxY = nextHeader ? (nextHeader.frame.origin.y - header.frame.size.height) : (CGRectGetMaxY(bounds) - header.frame.size.height);
-    CGFloat currentY = CGRectGetMaxY(bounds) - bounds.size.height + self.collectionView.contentInset.top;
+    CGFloat currentY = CGRectGetMaxY(bounds) - bounds.size.height + [self weakCollectionView].contentInset.top;
     
     CGFloat resultY = MIN(MAX(currentY, originY), maxY);
     CGPoint origin = header.frame.origin;
@@ -336,7 +309,7 @@ - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
         // always return yes no trigger resetting sticky header's frame.
         return YES;
     } else {
-        CGRect oldBounds = self.collectionView.bounds;
+        CGRect oldBounds = [self weakCollectionView].bounds;
         if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) {
             return YES;
         }
@@ -349,7 +322,7 @@ - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
 
 - (CGFloat)contentWidth
 {
-    return [self.delegate collectionView:self.collectionView contentWidthForLayout:self];
+    return [self.delegate collectionView:[self weakCollectionView] contentWidthForLayout:self];
 }
 
 - (CGFloat)contentHeight
@@ -357,25 +330,6 @@ - (CGFloat)contentHeight
     return [self _maxHeightForAllColumns];
 }
 
-- (void)_computeColumnWidthAndCount
-{
-    UIEdgeInsets insets = [self.delegate collectionView:self.collectionView insetForLayout:self];
-    
-    int columnCount;
-    float columnWidth ;
-    float availableWidth = self.contentWidth - (insets.left + insets.right+_leftGap + _rightGap);
-    
-    computeColumnWidthAndCount(availableWidth, self.columnCount, self.columnWidth, self.columnGap, &columnCount, &columnWidth);
-    if (availableWidth <= 0) {
-        return;
-    }
-    WXAssert(columnCount > 0, @"invalid column count");
-    WXAssert(columnWidth > 0, @"invalid column width");
-    
-    _computedColumnWidth = columnWidth;
-    _computedColumnCount = columnCount;
-}
-
 - (CGFloat)_maxHeightForAllColumns
 {
     CGFloat maxHeight = 0.0;
@@ -420,8 +374,6 @@ - (void)_cleanup
 
 - (void)_cleanComputed
 {
-    _computedColumnWidth = 0;
-    _computedColumnCount = 0;
 }
 
 - (void)invalidateLayout
@@ -431,5 +383,4 @@ - (void)invalidateLayout
     [self _cleanComputed];
 }
 
-
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.mm b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.mm
index 37bc5ef577..bc246b4fc6 100644
--- a/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/Recycler/WXRecyclerComponent.mm
@@ -35,7 +35,6 @@
 #import "WXComponent+Events.h"
 #import "WXRecyclerDragController.h"
 #import "WXComponent+Layout.h"
-#import "WXScrollerComponent+Layout.h"
 
 static NSString * const kCollectionCellReuseIdentifier = @"WXRecyclerCell";
 static NSString * const kCollectionHeaderReuseIdentifier = @"WXRecyclerHeader";
@@ -53,6 +52,16 @@ @interface WXCollectionView : UICollectionView
 
 @implementation WXCollectionView
 
+- (void)dealloc
+{
+    self.delegate = nil;
+    self.dataSource = nil;
+    if ([self.collectionViewLayout isKindOfClass:[WXMultiColumnLayout class]]) {
+        WXMultiColumnLayout* wxLayout = (WXMultiColumnLayout *)self.collectionViewLayout;
+        wxLayout.weak_collectionView = nil;
+    }
+}
+
 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index
 {
     [super insertSubview:view atIndex:index];
@@ -171,6 +180,10 @@ - (void)dealloc
 {
     _collectionView.delegate = nil;
     _collectionView.dataSource = nil;
+    if ([_collectionViewlayout isKindOfClass:[WXMultiColumnLayout class]]) {
+        WXMultiColumnLayout* wxLayout = (WXMultiColumnLayout *)_collectionViewlayout;
+        wxLayout.weak_collectionView = nil;
+    }
 }
 
 #pragma mark - Public Subclass Methods
@@ -189,7 +202,10 @@ - (void)viewDidLoad
     _collectionView.allowsMultipleSelection = NO;
     _collectionView.dataSource = self;
     _collectionView.delegate = self;
-    
+    if ([_collectionViewlayout isKindOfClass:[WXMultiColumnLayout class]]) {
+        WXMultiColumnLayout* wxLayout = (WXMultiColumnLayout *)_collectionViewlayout;
+        wxLayout.weak_collectionView = _collectionView;
+    }
     [_collectionView registerClass:[WXCollectionViewCell class] forCellWithReuseIdentifier:kCollectionCellReuseIdentifier];
     [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:kCollectionSupplementaryViewKindHeader withReuseIdentifier:kCollectionHeaderReuseIdentifier];
     
@@ -207,6 +223,10 @@ - (void)viewWillUnload
     
     _collectionView.dataSource = nil;
     _collectionView.delegate = nil;
+    if ([_collectionViewlayout isKindOfClass:[WXMultiColumnLayout class]]) {
+        WXMultiColumnLayout* wxLayout = (WXMultiColumnLayout *)_collectionViewlayout;
+        wxLayout.weak_collectionView = nil;
+    }
 }
 
 - (void)updateAttributes:(NSDictionary *)attributes
@@ -340,7 +360,7 @@ - (void)performUpdatesWithCompletion:(void (^)(BOOL finished))completion
     [_updateController performUpdatesWithNewData:newData oldData:oldData view:_collectionView];
 }
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
     if ([subcomponent isKindOfClass:[WXCellComponent class]]) {
         ((WXCellComponent *)subcomponent).delegate = self;
@@ -348,18 +368,20 @@ - (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
         ((WXHeaderComponent *)subcomponent).delegate = self;
     }
     
-    [super _insertSubcomponent:subcomponent atIndex:index];
+    BOOL inserted = [super _insertSubcomponent:subcomponent atIndex:index];
     
     if (![subcomponent isKindOfClass:[WXHeaderComponent class]]
         && ![subcomponent isKindOfClass:[WXCellComponent class]]) {
-        return;
+        return inserted;
     }
     
     WXPerformBlockOnMainThread(^{
         [self performUpdatesWithCompletion:^(BOOL finished) {
-            
+            // void
         }];
     });
+    
+    return inserted;
 }
 
 - (void)insertSubview:(WXComponent *)subcomponent atIndex:(NSInteger)index
@@ -468,7 +490,7 @@ - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView insetForLayout
 
 - (CGFloat)collectionView:(UICollectionView *)collectionView contentWidthForLayout:(UICollectionViewLayout *)collectionViewLayout
 {
-        return self.flexScrollerCSSNode->getStyleWidth();
+    return [self safeContainerStyleWidth];
 }
 
 - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout heightForItemAtIndexPath:(NSIndexPath *)indexPath
@@ -638,6 +660,10 @@ - (float)_floatValueForColumnGap:(WXLength *)gap
 
 - (void)_fillPadding
 {
+    if (self.flexCssNode == nullptr) {
+        return;
+    }
+    
     UIEdgeInsets padding = {
             WXFloorPixelValue(self.flexCssNode->getPaddingTop() + self.flexCssNode->getBorderWidthTop()),
             WXFloorPixelValue(self.flexCssNode->getPaddingLeft() + self.flexCssNode->getBorderWidthLeft()),
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.mm
index e6b6f725a5..bb59c8b78e 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXCellComponent.mm
@@ -66,11 +66,6 @@ - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDict
     return self;
 }
 
-- (void)dealloc
-{
-    
-}
-
 - (BOOL)weex_isEqualTo:(id<WXDiffable>)object
 {
     return self == object;
@@ -136,23 +131,31 @@ - (void)removeFromSuperview
     // do nothing
 }
 
-- (void)_calculateFrameWithSuperAbsolutePosition:(CGPoint)superAbsolutePosition gatherDirtyComponents:(NSMutableSet<WXComponent *> *)dirtyComponents
+- (BOOL)_isCaculatedFrameChanged:(CGRect)frame
 {
-        if (self.delegate && (flexIsUndefined(self.flexCssNode->getStyleWidth()) || _isUseContainerWidth)) {
-            self.flexCssNode->setStyleWidth([self.delegate containerWidthForLayout:self],NO);
-            _isUseContainerWidth = YES;
-        }
-        
-        if ([self needsLayout]) {
-            std::pair<float, float> renderPageSize;
-            renderPageSize.first = self.weexInstance.frame.size.width;
-            renderPageSize.second = self.weexInstance.frame.size.height;
-            self.flexCssNode->calculateLayout(renderPageSize);
-            if ([WXLog logLevel] >= WXLogLevelDebug) {
-                
-            }
-        }
-    [super _calculateFrameWithSuperAbsolutePosition:superAbsolutePosition gatherDirtyComponents:dirtyComponents];
+    /*
+     For list(aka UITableView), we cannot ignore left value generated by layout engine.
+     For water-fall(aka UICollectionView), we must ignore left value generated by layout engine.
+     */
+    
+    if ([self.supercomponent.type isEqualToString:@"waterfall"]) {
+        return !CGSizeEqualToSize(frame.size, _calculatedFrame.size);
+    }
+    else {
+        return (!CGSizeEqualToSize(frame.size, _calculatedFrame.size)) || (frame.origin.x != _calculatedFrame.origin.x);
+    }
 }
+
+- (void)_assignCalculatedFrame:(CGRect)frame
+{
+    if ([self.supercomponent.type isEqualToString:@"waterfall"]) {
+        frame.origin = CGPointZero;
+    }
+    else {
+        frame.origin.y = 0.0f; // only ignore y
+    }
+    _calculatedFrame = frame;
+}
+
 @end
 
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
index a0371473e4..f5719ab5ee 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
@@ -164,9 +164,8 @@ typedef id (^WXDataBindingBlock)(NSDictionary *data, BOOL *needUpdate);
 ///--------------------------------------
 
 - (void)_layoutDidFinish;
-- (void)_calculateFrameWithSuperAbsolutePosition:(CGPoint)superAbsolutePosition
-                           gatherDirtyComponents:(NSMutableSet<WXComponent *> *)dirtyComponents;
 
+- (void)_layoutPlatform;
 
 - (void)_willDisplayLayer:(CALayer *)layer;
 
@@ -174,10 +173,14 @@ typedef id (^WXDataBindingBlock)(NSDictionary *data, BOOL *needUpdate);
 
 - (id<WXScrollerProtocol>)ancestorScroller;
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index;
+// return if the component is actually inserted
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index;
+
 - (void)_removeFromSupercomponent;
 - (void)_moveToSupercomponent:(WXComponent *)newSupercomponent atIndex:(NSUInteger)index;
 
+- (BOOL)_isTransitionNone;
+- (BOOL)_hasTransitionPropertyInStyles:(NSDictionary *)styles;
 - (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:(BOOL)isUpdateStyles;
 - (void)_updateAttributesOnComponentThread:(NSDictionary *)attributes;
 - (void)_updateStylesOnMainThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles;
@@ -188,6 +191,8 @@ typedef id (^WXDataBindingBlock)(NSDictionary *data, BOOL *needUpdate);
 - (void)_addEventOnMainThread:(NSString *)eventName;
 - (void)_removeEventOnMainThread:(NSString *)eventName;
 
+- (void)_collectSubcomponents:(NSMutableArray *)components;
+
 ///--------------------------------------
 /// @name Protected Methods
 ///--------------------------------------
@@ -198,26 +203,28 @@ typedef id (^WXDataBindingBlock)(NSDictionary *data, BOOL *needUpdate);
 
 - (void)_frameDidCalculated:(BOOL)isChanged;
 
-- (NSUInteger)_childrenCountForLayout;
-
 ///--------------------------------------
 /// @name Private Methods
 ///--------------------------------------
 
-- (void)_modifyStyles:(NSDictionary *)styles;
+- (void)_setRenderObject:(void *)object;
 
-- (void)_transitionUpdateViewProperty:(NSDictionary *)styles;
+- (BOOL)_isCaculatedFrameChanged:(CGRect)frame;
+
+- (CGFloat)_getInnerContentMainSize;
 
-- (void)_initCSSNodeWithStyles:(NSDictionary *)styles;
+- (void)_assignInnerContentMainSize:(CGFloat)value;
 
-- (void)_initFlexCssNodeWithStyles:(NSDictionary *)styles;
+- (void)_assignCalculatedFrame:(CGRect)frame;
+
+- (void)_modifyStyles:(NSDictionary *)styles;
+
+- (void)_transitionUpdateViewProperty:(NSDictionary *)styles;
 
 - (void)_updateCSSNodeStyles:(NSDictionary *)styles;
 
 - (void)_resetCSSNodeStyles:(NSArray *)styles;
 
-- (void)_recomputeCSSNodeChildren;
-
 - (void)_handleBorders:(NSDictionary *)styles isUpdating:(BOOL)updating;
 
 - (void)_initViewPropertyWithStyles:(NSDictionary *)styles;
@@ -267,5 +274,3 @@ typedef id (^WXDataBindingBlock)(NSDictionary *data, BOOL *needUpdate);
 - (void)_buildViewHierarchyLazily;
 
 @end
-
-
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm
index 2d4a3af175..402e592c7a 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXCycleSliderComponent.mm
@@ -666,7 +666,6 @@ - (void)recycleSliderView:(WXRecycleSliderView *)recycleSliderView didScroll:(UI
 
 - (void)recycleSliderView:(WXRecycleSliderView *)recycleSliderView didScrollToItemAtIndex:(NSInteger)index
 {
-    
     if (_sliderChangeEvent) {
         [self fireEvent:@"change" params:@{@"index":@(index)} domChanges:@{@"attrs": @{@"index": @(index)}}];
     }
@@ -691,6 +690,10 @@ @implementation WXRecycleSliderScrollView
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
 {
     WXRecycleSliderView *view = (WXRecycleSliderView *)self.delegate;
+    if (![view isKindOfClass:[UIView class]]) {
+        return YES;
+    }
+    
     if ([(id <WXRecycleSliderViewDelegate>) view.wx_component respondsToSelector:@selector(requestGestureShouldStopPropagation:shouldReceiveTouch:)]) {
         return [(id <WXRecycleSliderViewDelegate>) view.wx_component requestGestureShouldStopPropagation:gestureRecognizer shouldReceiveTouch:touch];
     }
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.mm
index f702c617dd..d93b19c75b 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXEditComponent.mm
@@ -486,6 +486,10 @@ - (void)updateStyles:(NSDictionary *)styles
 
 -(void)updatePattern
 {
+    if (self.flexCssNode == nullptr) {
+        return;
+    }
+    
         UIEdgeInsets padding_flex = UIEdgeInsetsMake(
                                                      self.flexCssNode->getPaddingTop(),
                                                      self.flexCssNode->getPaddingLeft(),
@@ -499,10 +503,7 @@ -(void)updatePattern
         
         
         UIEdgeInsets border_flex = UIEdgeInsetsMake(self.flexCssNode->getBorderWidthTop(), self.flexCssNode->getBorderWidthLeft(), self.flexCssNode->getBorderWidthBottom(), self.flexCssNode->getBorderWidthRight());
-        
-        
-        
-        
+
         if (!UIEdgeInsetsEqualToEdgeInsets(border_flex, _border)) {
             [self setBorder:border_flex];
         }
@@ -512,22 +513,30 @@ -(void)updatePattern
 {
     __weak typeof(self) weakSelf = self;
     return ^CGSize (CGSize constrainedSize) {
+        __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return CGSizeZero;
+        }
+        
+        if (strongSelf.flexCssNode == nullptr) {
+            return CGSizeZero;
+        }
         
         CGSize computedSize = [[[NSString alloc] init]sizeWithAttributes:nil];
-            if (!isnan(weakSelf.flexCssNode->getMinWidth())) {
-                computedSize.width = MAX(computedSize.width, weakSelf.flexCssNode->getMinWidth());
+            if (!isnan(strongSelf.flexCssNode->getMinWidth())) {
+                computedSize.width = MAX(computedSize.width, strongSelf.flexCssNode->getMinWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxWidth())) {
-                computedSize.width = MIN(computedSize.width, weakSelf.flexCssNode->getMaxWidth());
+            if (!isnan(strongSelf.flexCssNode->getMaxWidth())) {
+                computedSize.width = MIN(computedSize.width, strongSelf.flexCssNode->getMaxWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMinHeight())) {
-                computedSize.height = MAX(computedSize.height, weakSelf.flexCssNode->getMinHeight());
+            if (!isnan(strongSelf.flexCssNode->getMinHeight())) {
+                computedSize.height = MAX(computedSize.height, strongSelf.flexCssNode->getMinHeight());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxHeight())) {
-                computedSize.height = MIN(computedSize.height, weakSelf.flexCssNode->getMaxHeight());
+            if (!isnan(strongSelf.flexCssNode->getMaxHeight())) {
+                computedSize.height = MIN(computedSize.height, strongSelf.flexCssNode->getMaxHeight());
             }
         return (CGSize) {
             WXCeilPixelValue(computedSize.width),
@@ -928,8 +937,8 @@ - (void)keyboardWillHide:(NSNotification*)notification
         UIView * rootView = self.weexInstance.rootView;
         if (!CGRectEqualToRect(self.weexInstance.frame, rootView.frame)) {
             [self setViewMovedUp:NO];
-            self.weexInstance.isRootViewFrozen = NO;
         }
+        self.weexInstance.isRootViewFrozen = NO;
     }
     if (_keyboardEvent) {
         [self fireEvent:@"keyboard" params:@{ @"isShow": @NO }];
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXHeaderComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXHeaderComponent.mm
index 642dac70ca..b97057e032 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXHeaderComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXHeaderComponent.mm
@@ -67,21 +67,15 @@ - (void)_removeFromSupercomponent
     [self.delegate headerDidRemove:self];
 }
 
-- (void)_calculateFrameWithSuperAbsolutePosition:(CGPoint)superAbsolutePosition gatherDirtyComponents:(NSMutableSet<WXComponent *> *)dirtyComponents
+- (BOOL)_isCaculatedFrameChanged:(CGRect)frame
 {
-        if (self.delegate && ( isnan(self.flexCssNode->getStyleWidth()) || _isUseContainerWidth)) {
-            self.flexCssNode->setStyleWidth([self.delegate headerWidthForLayout:self],NO);
-            //TODO: set _isUseContainerWidth to NO if updateStyles have width
-            _isUseContainerWidth = YES;
-        }
-        
-        if ([self needsLayout]) {
-            std::pair<float, float> renderPageSize;
-            renderPageSize.first = self.weexInstance.frame.size.width;
-            renderPageSize.second = self.weexInstance.frame.size.height;
-            self.flexCssNode->calculateLayout(renderPageSize);
-        }
-    [super _calculateFrameWithSuperAbsolutePosition:superAbsolutePosition gatherDirtyComponents:dirtyComponents];
+    return !CGSizeEqualToSize(frame.size, _calculatedFrame.size); // only compares sizes
+}
+
+- (void)_assignCalculatedFrame:(CGRect)frame
+{
+    frame.origin = CGPointZero;
+    _calculatedFrame = frame;
 }
 
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
index a13a1ba48f..f80a5408d2 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Component/WXImageComponent.m
@@ -97,7 +97,12 @@ - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDict
             WXLogWarning(@"image src is nil");
         }
         [self configPlaceHolder:attributes];
-        _resizeMode = [WXConvert UIViewContentMode:attributes[@"resize"]];
+        
+        NSString *resizeMode = attributes[@"resize"];
+        if (!resizeMode) {
+            resizeMode = styles[@"resizeMode"];
+        }
+        _resizeMode = [WXConvert UIViewContentMode:resizeMode];
         
         _imageQuality = WXImageQualityNone;
         if (styles[@"quality"]) {
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXListComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXListComponent.mm
index 5f14aa0228..26949909c0 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXListComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXListComponent.mm
@@ -22,6 +22,7 @@
 #import "WXHeaderComponent.h"
 #import "WXComponent.h"
 #import "WXComponent_internal.h"
+#import "WXComponent+Layout.h"
 #import "NSArray+Weex.h"
 #import "WXAssert.h"
 #import "WXMonitor.h"
@@ -30,7 +31,6 @@
 #import "WXSDKInstance_private.h"
 #import "WXRefreshComponent.h"
 #import "WXLoadingComponent.h"
-#import "WXScrollerComponent+Layout.h"
 #import "WXThreadSafeMutableArray.h"
 
 @interface WXTableView : UITableView
@@ -252,7 +252,7 @@ - (void)scrollToComponent:(WXComponent *)component withOffset:(CGFloat)offset an
 
 #pragma mark - Inheritance
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
     if ([subcomponent isKindOfClass:[WXCellComponent class]]) {
         ((WXCellComponent *)subcomponent).delegate = self;
@@ -262,15 +262,15 @@ - (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
                && ![subcomponent isKindOfClass:[WXLoadingComponent class]]
                && subcomponent->_positionType != WXPositionTypeFixed) {
         WXLogError(@"list only support cell/header/refresh/loading/fixed-component as child.");
-        return;
+        return NO;
     }
     
-    [super _insertSubcomponent:subcomponent atIndex:index];
+    BOOL inserted = [super _insertSubcomponent:subcomponent atIndex:index];
     
     if (![subcomponent isKindOfClass:[WXHeaderComponent class]]
         && ![subcomponent isKindOfClass:[WXCellComponent class]]) {
         // Don't insert section if subcomponent is not header or cell
-        return;
+        return inserted;
     }
     
     NSIndexPath *indexPath = [self indexPathForSubIndex:index];
@@ -340,6 +340,8 @@ - (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
         }];
         
     }
+    
+    return inserted;
 }
 
 - (void)insertSubview:(WXComponent *)subcomponent atIndex:(NSInteger)index
@@ -355,7 +357,7 @@ - (void)insertSubview:(WXComponent *)subcomponent atIndex:(NSInteger)index
 
 - (float)headerWidthForLayout:(WXHeaderComponent *)cell
 {
-        return self.flexScrollerCSSNode->getStyleWidth();
+    return [self safeContainerStyleWidth];
 }
 
 - (void)headerDidLayout:(WXHeaderComponent *)header
@@ -443,7 +445,7 @@ - (void)headerDidRemove:(WXHeaderComponent *)header
 
 - (float)containerWidthForLayout:(WXCellComponent *)cell
 {
-        return self.flexScrollerCSSNode->getStyleWidth();
+    return [self safeContainerStyleWidth];
 }
 
 - (void)cellDidRemove:(WXCellComponent *)cell
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXLoadingComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXLoadingComponent.mm
index a9f90fab6b..d4002a0662 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXLoadingComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXLoadingComponent.mm
@@ -129,14 +129,13 @@ - (void)setDisplay
     }
 }
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
-    if (subcomponent) {
-        [super _insertSubcomponent:subcomponent atIndex:index];
-        if ([subcomponent isKindOfClass:[WXLoadingIndicator class]]) {
-            _indicator = (WXLoadingIndicator*)subcomponent;
-        }
+    BOOL inserted = [super _insertSubcomponent:subcomponent atIndex:index];
+    if ([subcomponent isKindOfClass:[WXLoadingIndicator class]]) {
+        _indicator = (WXLoadingIndicator*)subcomponent;
     }
+    return inserted;
 }
 
 - (BOOL)displayState
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.mm
index e53144ce90..d00ce3b8e9 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXRefreshComponent.mm
@@ -105,14 +105,13 @@ - (void)pullingdown:(NSDictionary*)param
     [self fireEvent:@"pullingdown" params:param];
 }
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
-    if (subcomponent) {
-        [super _insertSubcomponent:subcomponent atIndex:index];
-        if ([subcomponent isKindOfClass:[WXLoadingIndicator class]]) {
-            _indicator = (WXLoadingIndicator*)subcomponent;
-        }
+    BOOL inserted = [super _insertSubcomponent:subcomponent atIndex:index];
+    if ([subcomponent isKindOfClass:[WXLoadingIndicator class]]) {
+        _indicator = (WXLoadingIndicator*)subcomponent;
     }
+    return inserted;
 }
 
 - (void)updateAttributes:(NSDictionary *)attributes
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
index ec85b80f48..ff27871abc 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.h
@@ -30,8 +30,6 @@
 
 @property (nonatomic, assign) CGSize contentSize;
 
-- (NSUInteger)childrenCountForScrollerLayout;
-
 - (void)handleAppear;
 
 - (CGPoint)absolutePositionForComponent:(WXComponent *)component;
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm
index 1cb3e9aba1..ded029e1f7 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXScrollerComponent.mm
@@ -29,11 +29,10 @@
 #import "WXConfigCenterProtocol.h"
 #import "WXSDKEngine.h"
 #import "WXComponent+Events.h"
-#import "WXScrollerComponent+Layout.h"
-#import "WXCoreLayout.h"
 #import "WXPageEventNotifyEvent.h"
+#import "WXComponent+Layout.h"
 
-@interface WXScrollerComponentView:UIScrollView
+@interface WXScrollerComponentView : UIScrollView
 @end
 
 @implementation WXScrollerComponentView
@@ -72,6 +71,7 @@ @interface WXScrollerComponent()
 @implementation WXScrollerComponent
 {
     CGSize _contentSize;
+    BOOL _needsPlatformLayout;
     BOOL _listenLoadMore;
     BOOL _scrollEvent;
     BOOL _scrollStartEvent;
@@ -116,9 +116,9 @@ - (void)resetLoadmore
     _previousLoadMoreContentHeight=0;
 }
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
-    [super _insertSubcomponent:subcomponent atIndex:index];
+    BOOL inserted = [super _insertSubcomponent:subcomponent atIndex:index];
     
     if ([subcomponent isKindOfClass:[WXRefreshComponent class]]) {
         _refreshComponent = (WXRefreshComponent*)subcomponent;
@@ -126,6 +126,21 @@ - (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
     else if ([subcomponent isKindOfClass:[WXLoadingComponent class]]) {
         _loadingComponent = (WXLoadingComponent*)subcomponent;
     }
+    
+    // If a vertical list is added to a horizontal scroller, we need platform dependent layout
+    if (_flexCssNode && [self isMemberOfClass:[WXScrollerComponent class]] && (_scrollDirection == WXScrollDirectionHorizontal) &&
+        [subcomponent isKindOfClass:[WXScrollerComponent class]] &&
+        subcomponent->_positionType != WXPositionTypeFixed &&
+        (((WXScrollerComponent*)subcomponent).scrollDirection == WXScrollDirectionVertical)) {
+        if (subcomponent->_flexCssNode) {
+            if (subcomponent->_flexCssNode->getFlex() > 0 && !isnan(subcomponent->_flexCssNode->getStyleWidth())) {
+                _needsPlatformLayout = YES;
+                _flexCssNode->setNeedsPlatformDependentLayout(true);
+            }
+        }
+    }
+    
+    return inserted;
 }
 
 -(instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDictionary *)styles attributes:(NSDictionary *)attributes events:(NSArray *)events weexInstance:(WXSDKInstance *)weexInstance
@@ -161,15 +176,6 @@ -(instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDicti
         _scrollable = attributes[@"scrollable"] ? [WXConvert BOOL:attributes[@"scrollable"]] : YES;
         _offsetAccuracy = attributes[@"offsetAccuracy"] ? [WXConvert WXPixelType:attributes[@"offsetAccuracy"] scaleFactor:self.weexInstance.pixelScaleFactor] : 0;
         
-            _flexScrollerCSSNode = new WeexCore::WXCoreLayoutNode();
-            // let scroller fill the rest space if it is a child component and has no fixed height & width
-            if (((_scrollDirection == WXScrollDirectionVertical &&
-                  flexIsUndefined(self.flexCssNode->getStyleHeight())) ||
-                 (_scrollDirection == WXScrollDirectionHorizontal &&
-                  flexIsUndefined(self.flexCssNode->getStyleWidth()))) &&
-                self.flexCssNode->getFlex() <= 0.0) {
-                self.flexCssNode->setFlex(1.0);
-            }
         id configCenter = [WXSDKEngine handlerForProtocol:@protocol(WXConfigCenterProtocol)];
         if ([configCenter respondsToSelector:@selector(configForKey:defaultValue:isDefault:)]) {
             BOOL shouldNotifiAppearDescendantView = [[configCenter configForKey:@"iOS_weex_ext_config.shouldNotifiAppearDescendantView" defaultValue:@(YES) isDefault:NULL] boolValue];
@@ -267,11 +273,6 @@ - (void)dealloc
     ((UIScrollView *)_view).delegate = nil;
     [self.stickyArray removeAllObjects];
     [self.listenerArray removeAllObjects];
-        if(_flexScrollerCSSNode){
-            [WXComponent recycleNodeOnComponentThread:_flexScrollerCSSNode gabRef:self.ref];
-            
-            _flexScrollerCSSNode=nullptr;
-        }
 }
 
 - (void)updateAttributes:(NSDictionary *)attributes
@@ -624,6 +625,7 @@ - (BOOL)requestGestureShouldStopPropagation:(UIGestureRecognizer *)gestureRecogn
 }
 
 #pragma mark UIScrollViewDelegate
+
 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
 {
     if ([_refreshType isEqualToString:@"refreshForAppear"] && _refreshComponent) {
@@ -697,6 +699,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView
     if (self.onScroll) {
         self.onScroll(scrollView);
     }
+    
     if (_scrollEvent || _scrollEventListener) {
         CGFloat distance = 0;
         if (_scrollDirection == WXScrollDirectionHorizontal) {
@@ -720,6 +723,7 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView
             _lastScrollEventFiredOffset = scrollView.contentOffset;
         }
     }
+    
     NSHashTable *delegates = [_delegates copy];
     for (id<UIScrollViewDelegate> delegate in delegates) {
         if ([delegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
@@ -773,6 +777,7 @@ - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
             }
         }
     }
+    
     if (!_isScrolling) {
         _scrollEndPoint = scrollView.contentOffset;
         id<WXPageEventNotifyEventProtocol> eventNotify = [WXSDKEngine handlerForProtocol:@protocol(WXPageEventNotifyEventProtocol)];
@@ -794,15 +799,50 @@ - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoi
     // Page stop effect
     if (_pagingEnabled && _pageSize > 0) {
         if (_scrollDirection == WXScrollDirectionVertical) {
-            CGFloat targetY = scrollView.contentOffset.y + velocity.y * 60.0;
+            CGFloat targetY = scrollView.contentOffset.y + velocity.y * 120.0;
             CGFloat targetIndex = round(targetY / _pageSize);
+            
+            /*
+             When user's finger departs from screen with any velocity (like swipe gesture).
+             We make sure that target index is changed.
+             */
+            CGFloat sourceIndex = round(_scrollStartPoint.y / _pageSize);
+            if (velocity.y > 0.3) {
+                if (targetIndex <= sourceIndex) {
+                    targetIndex = sourceIndex + 1;
+                }
+            }
+            else if (velocity.y < -0.3) {
+                if (targetIndex >= sourceIndex) {
+                    targetIndex = sourceIndex - 1;
+                }
+            }
+            
             if (targetIndex < 0)
                 targetIndex = 0;
+            
             targetContentOffset->y = targetIndex * _pageSize;
         }
         else {
-            CGFloat targetX = scrollView.contentOffset.x + velocity.x * 60.0;
+            CGFloat targetX = scrollView.contentOffset.x + velocity.x * 120.0;
             CGFloat targetIndex = round(targetX / _pageSize);
+            
+            /*
+             When user's finger departs from screen with any velocity (like swipe gesture).
+             We make sure that target index is changed.
+             */
+            CGFloat sourceIndex = round(_scrollStartPoint.x / _pageSize);
+            if (velocity.x > 0.3) {
+                if (targetIndex <= sourceIndex) {
+                    targetIndex = sourceIndex + 1;
+                }
+            }
+            else if (velocity.x < -0.3) {
+                if (targetIndex >= sourceIndex) {
+                    targetIndex = sourceIndex - 1;
+                }
+            }
+            
             if (targetIndex < 0)
                 targetIndex = 0;
             targetContentOffset->x = targetIndex * _pageSize;
@@ -955,55 +995,63 @@ - (void)handleLoadMore
 
 #pragma mark Layout
 
-- (NSUInteger)_childrenCountForLayout;
+- (CGFloat)_getInnerContentMainSize
 {
-    return 0;
+    if (_scrollDirection == WXScrollDirectionVertical) {
+        return _contentSize.height;
+    }
+    else if (_scrollDirection == WXScrollDirectionHorizontal) {
+        return _contentSize.width;
+    }
+    else {
+        return -1.0f;
+    }
 }
 
-- (NSUInteger)childrenCountForScrollerLayout
+- (void)_assignInnerContentMainSize:(CGFloat)value
 {
-    return [super _childrenCountForLayout];
+    if (_scrollDirection == WXScrollDirectionVertical) {
+        _contentSize.height = value;
+    }
+    else if (_scrollDirection == WXScrollDirectionHorizontal) {
+        _contentSize.width = value;
+    }
 }
 
-- (void)_calculateFrameWithSuperAbsolutePosition:(CGPoint)superAbsolutePosition
-                          gatherDirtyComponents:(NSMutableSet<WXComponent *> *)dirtyComponents
+- (void)_layoutPlatform
 {
-    /**
-     *  Pretty hacky way
-     *  layout from root to scroller to get scroller's frame,
-     *  layout from children to scroller to get scroller's contentSize
-     */
-    if ([self needsLayout]) {
-            _flexScrollerCSSNode->copyStyle(_flexCssNode);
-            _flexScrollerCSSNode->copyMeasureFunc(_flexCssNode);
+    /* Handle multiple vertical scrollers inside horizontal scroller case. In weexcore,
+     a verticall list with NAN height will be set flex=1, which suppresses its style-width property.
+     This will cause two lists with style-width 750px in a horizontal scroller sharing one screen width.
+     Here we respect its style-width property so that the two lists will both be screen width wide. */
+    
+    if (_needsPlatformLayout) {
+        if (_flexCssNode) {
+            float top = _flexCssNode->getLayoutPositionTop();
+            float left = _flexCssNode->getLayoutPositionLeft();
+            float width = _flexCssNode->getLayoutWidth();
+            float height = _flexCssNode->getLayoutHeight();
             
-            if (_scrollDirection == WXScrollDirectionVertical) {
-                _flexScrollerCSSNode->setFlexDirection(WeexCore::kFlexDirectionColumn,NO);
-                _flexScrollerCSSNode->setStyleWidth(self.flexCssNode->getLayoutWidth(),NO);
-                _flexScrollerCSSNode->setStyleHeight(FlexUndefined);
-            } else {
-                _flexScrollerCSSNode->setFlexDirection(WeexCore::kFlexDirectionRow,NO);
-                _flexScrollerCSSNode->setStyleHeight(self.flexCssNode->getLayoutHeight());
-                _flexScrollerCSSNode->setStyleWidth(FlexUndefined,NO);
-            }
-            _flexScrollerCSSNode->markDirty();
+            _flexCssNode->setFlexDirection(WeexCore::kFlexDirectionRow, NO);
+            _flexCssNode->setStyleHeight(_flexCssNode->getLayoutHeight());
+            _flexCssNode->setStyleWidth(FlexUndefined, NO);
+            _flexCssNode->markAllDirty();
             std::pair<float, float> renderPageSize;
             renderPageSize.first = self.weexInstance.frame.size.width;
             renderPageSize.second = self.weexInstance.frame.size.height;
-            _flexScrollerCSSNode->calculateLayout(renderPageSize);
-            CGSize size = {
-                WXRoundPixelValue(_flexScrollerCSSNode->getLayoutWidth()),
-                WXRoundPixelValue(_flexScrollerCSSNode->getLayoutHeight())
-            };
+            auto parent = _flexCssNode->getParent(); // clear parent temporarily
+            _flexCssNode->setParent(nullptr, _flexCssNode);
+            _flexCssNode->calculateLayout(renderPageSize);
+            _flexCssNode->setParent(parent, _flexCssNode);
             
-            if (!CGSizeEqualToSize(size, _contentSize)) {
-                // content size
-                _contentSize = size;
-                [dirtyComponents addObject:self];
-            }
+            // set origin and size back
+            _flexCssNode->rewriteLayoutResult(left, top, width, height);
+        }
+    }
+    else {
+        // should not happen, set platform layout to false
+        _flexCssNode->setNeedsPlatformDependentLayout(false);
     }
-    
-    [super _calculateFrameWithSuperAbsolutePosition:superAbsolutePosition gatherDirtyComponents:dirtyComponents];
 }
 
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXSwitchComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXSwitchComponent.mm
index c62a680bb6..a18c4560e2 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXSwitchComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXSwitchComponent.mm
@@ -68,7 +68,7 @@ - (instancetype)initWithRef:(NSString *)ref type:(NSString *)type styles:(NSDict
         if(attributes[@"tintColor"]){
             _tintColor = [WXConvert UIColor:attributes[@"tintColor"]];
         }
-        self.flexCssNode->setStyleWidth(51,NO);
+        self.flexCssNode->setStyleWidth(51, NO);
         self.flexCssNode->setStyleHeight(31);
     }
     return self;
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.mm
index 30ab79bdf3..f64df8af38 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextAreaComponent.mm
@@ -73,23 +73,30 @@ - (UIView *)loadView
 {
     __weak typeof(self) weakSelf = self;
     return ^CGSize (CGSize constrainedSize) {
+        __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return CGSizeZero;
+        }
+        if (strongSelf.flexCssNode == nullptr) {
+            return CGSizeZero;
+        }
         
-        CGSize computedSize = [[[NSString alloc] init]sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:weakSelf.textView.font.pointSize]}];
-        computedSize.height = _rows? computedSize.height *weakSelf.rows + (CorrectY + CorrectY/2):0;
-            if (!isnan(weakSelf.flexCssNode->getMinWidth())) {
-                computedSize.width = MAX(computedSize.width, weakSelf.flexCssNode->getMinWidth());
+        CGSize computedSize = [[[NSString alloc] init]sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:strongSelf.textView.font.pointSize]}];
+        computedSize.height = strongSelf.rows ? computedSize.height * strongSelf.rows + (CorrectY + CorrectY/2):0;
+            if (!isnan(strongSelf.flexCssNode->getMinWidth())) {
+                computedSize.width = MAX(computedSize.width, strongSelf.flexCssNode->getMinWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxWidth())) {
-                computedSize.width = MIN(computedSize.width, weakSelf.flexCssNode->getMaxWidth());
+            if (!isnan(strongSelf.flexCssNode->getMaxWidth())) {
+                computedSize.width = MIN(computedSize.width, strongSelf.flexCssNode->getMaxWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMinHeight())) {
-                computedSize.height = MAX(computedSize.height, weakSelf.flexCssNode->getMinHeight());
+            if (!isnan(strongSelf.flexCssNode->getMinHeight())) {
+                computedSize.height = MAX(computedSize.height, strongSelf.flexCssNode->getMinHeight());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxHeight())) {
-                computedSize.height = MIN(computedSize.height, weakSelf.flexCssNode->getMaxHeight());
+            if (!isnan(strongSelf.flexCssNode->getMaxHeight())) {
+                computedSize.height = MIN(computedSize.height, strongSelf.flexCssNode->getMaxHeight());
             }
         return (CGSize) {
             WXCeilPixelValue(computedSize.width),
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.mm b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.mm
index 4918deae4d..f28b9103ae 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/WXTextComponent.mm
@@ -280,8 +280,12 @@ - (void)fillCSSStyles:(NSDictionary *)styles
         _observerIconfont = YES;
     }
     
+    if (self.flexCssNode == nullptr) {
+        return;
+    }
+    
         UIEdgeInsets flex_padding = {
-            WXFloorPixelValue(self.flexCssNode->getPaddingTop()+ self.flexCssNode->getBorderWidthTop()),
+            WXFloorPixelValue(self.flexCssNode->getPaddingTop() + self.flexCssNode->getBorderWidthTop()),
             WXFloorPixelValue(self.flexCssNode->getPaddingLeft() + self.flexCssNode->getBorderWidthLeft()),
             WXFloorPixelValue(self.flexCssNode->getPaddingBottom() + self.flexCssNode->getBorderWidthBottom()),
             WXFloorPixelValue(self.flexCssNode->getPaddingRight() + self.flexCssNode->getBorderWidthRight())
@@ -379,6 +383,15 @@ - (UIImage *)drawRect:(CGRect)rect;
 {
     __weak typeof(self) weakSelf = self;
     return ^CGSize (CGSize constrainedSize) {
+        __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return CGSizeZero;
+        }
+        
+        if (strongSelf.flexCssNode == nullptr) {
+            return CGSizeZero;
+        }
+        
 #ifdef DEBUG
         WXLogDebug(@"flexLayout -> measureblock %@, constrainedSize:%@",
               self.type,
@@ -389,36 +402,36 @@ - (UIImage *)drawRect:(CGRect)rect;
         NSTextStorage *textStorage = nil;
         
         //TODO:more elegant way to use max and min constrained size
-            if (!isnan(weakSelf.flexCssNode->getMinWidth())) {
-                constrainedSize.width = MAX(constrainedSize.width, weakSelf.flexCssNode->getMinWidth());
+            if (!isnan(strongSelf.flexCssNode->getMinWidth())) {
+                constrainedSize.width = MAX(constrainedSize.width, strongSelf.flexCssNode->getMinWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxWidth())) {
-                constrainedSize.width = MIN(constrainedSize.width, weakSelf.flexCssNode->getMaxWidth());
+            if (!isnan(strongSelf.flexCssNode->getMaxWidth())) {
+                constrainedSize.width = MIN(constrainedSize.width, strongSelf.flexCssNode->getMaxWidth());
             }
         
         if (![self useCoreText]) {
-            textStorage = [weakSelf textStorageWithWidth:constrainedSize.width];
+            textStorage = [strongSelf textStorageWithWidth:constrainedSize.width];
             NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject;
             NSTextContainer *textContainer = layoutManager.textContainers.firstObject;
             computedSize = [layoutManager usedRectForTextContainer:textContainer].size;
         } else {
-            computedSize = [weakSelf calculateTextHeightWithWidth:constrainedSize.width];
+            computedSize = [strongSelf calculateTextHeightWithWidth:constrainedSize.width];
         }
-            if (!isnan(weakSelf.flexCssNode->getMinWidth())) {
-                computedSize.width = MAX(computedSize.width, weakSelf.flexCssNode->getMinWidth());
+            if (!isnan(strongSelf.flexCssNode->getMinWidth())) {
+                computedSize.width = MAX(computedSize.width, strongSelf.flexCssNode->getMinWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxWidth())) {
-                computedSize.width = MIN(computedSize.width, weakSelf.flexCssNode->getMaxWidth());
+            if (!isnan(strongSelf.flexCssNode->getMaxWidth())) {
+                computedSize.width = MIN(computedSize.width, strongSelf.flexCssNode->getMaxWidth());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMinHeight())) {
-                computedSize.height = MAX(computedSize.height, weakSelf.flexCssNode->getMinHeight());
+            if (!isnan(strongSelf.flexCssNode->getMinHeight())) {
+                computedSize.height = MAX(computedSize.height, strongSelf.flexCssNode->getMinHeight());
             }
             
-            if (!isnan(weakSelf.flexCssNode->getMaxHeight())) {
-                computedSize.height = MIN(computedSize.height, weakSelf.flexCssNode->getMaxHeight());
+            if (!isnan(strongSelf.flexCssNode->getMaxHeight())) {
+                computedSize.height = MIN(computedSize.height, strongSelf.flexCssNode->getMaxHeight());
             }
         if (textStorage && [WXUtility isBlankString:textStorage.string]) {
             //  if the text value is empty or nil, then set the height is 0.
diff --git a/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m b/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
index 3a059f6685..6cc53cdced 100644
--- a/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
+++ b/ios/sdk/WeexSDK/Sources/Events/WXComponent+Events.m
@@ -312,7 +312,14 @@ - (void)_removeAllEvents
     [self removeTouchCancelEvent];
     [self removeSwipeEvent];
     [self removePseudoTouchEvent];
+}
 
+- (void)_collectSubcomponents:(NSMutableArray *)components
+{
+    for (WXComponent* c in _subcomponents) {
+        [components addObject:c];
+        [c _collectSubcomponents:components];
+    }
 }
 
 #pragma mark - Appear & Disappear
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h
index 2f77976beb..57dc21eb7b 100644
--- a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.h
@@ -20,11 +20,12 @@
 #import "WXComponent.h"
 #import "WXSDKInstance.h"
 #import "WXUtility.h"
-#import "WXCoreLayout.h"
 
 #define FlexUndefined NAN
 
 #ifdef __cplusplus
+#include "layout.h"
+
 extern "C" {
 #endif
     bool flexIsUndefined(float value);
@@ -38,7 +39,7 @@ extern "C" {
 #ifdef __cplusplus
     WeexCore::WXCoreLayoutNode *_flexCssNode;
 #endif // __cplusplus
-    BOOL _isLayoutDirty;
+
     CGRect _calculatedFrame;
     CGPoint _absolutePosition;
     WXPositionType _positionType;
@@ -53,13 +54,14 @@ extern "C" {
 @property(nonatomic, readonly, assign) WeexCore::WXCoreLayoutNode *flexCssNode;
 #endif
 
-@end
+/**
+ * @abstract Convert layout dimension value like 'left', 'width' to style value in js considering viewport and scale.
+ */
+- (NSString*)convertLayoutValueToStyleValue:(NSString*)valueName;
+
+/**
+ * @abstract Get style width of a container(scroller like) with safe value. No NAN, No zero.
+ */
+- (CGFloat)safeContainerStyleWidth;
 
-@interface WXComponent (Layout)
-- (void)_insertChildCssNode:(WXComponent*)subcomponent atIndex:(NSInteger)index;
-- (void)_rmChildCssNode:(WXComponent*)subcomponent;
-- (NSInteger) getActualNodeIndex:(WXComponent*)subcomponent atIndex:(NSInteger) index;
-#ifdef __cplusplus
-+ (void) recycleNodeOnComponentThread:(WeexCore::WXCoreLayoutNode * ) garbageNode gabRef:(NSString *)ref;
-#endif
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.mm b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.mm
index 83c7986134..7ee51754e1 100644
--- a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.mm
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.mm
@@ -42,24 +42,19 @@ @implementation WXComponent (Layout)
 
 - (void)setNeedsLayout
 {
-    _isLayoutDirty = YES;
-    WXComponent *supercomponent = [self supercomponent];
-    
-    //protet nil ptr
-    if (self.flexCssNode) {
-        self.flexCssNode->markDirty();
-    }else{
-        WXLogError(@"flexCssNode is nil");
-    }
-    
-    if(supercomponent){
-        [supercomponent setNeedsLayout];
+    if (_flexCssNode != nullptr) {
+        _flexCssNode->markDirty();
     }
 }
 
 - (BOOL)needsLayout
 {
-    return _isLayoutDirty;
+    if (_flexCssNode != nullptr) {
+        return _flexCssNode->isDirty();
+    }
+    else {
+        return false;
+    }
 }
 
 - (CGSize (^)(CGSize))measureBlock
@@ -74,25 +69,19 @@ - (void)layoutDidFinish
 
 #pragma mark Private
 
-- (void)_initCSSNodeWithStyles:(NSDictionary *)styles
+- (void)_setRenderObject:(void *)object
 {
-        _flexCssNode = new WeexCore::WXCoreLayoutNode();
+    if (object) {
+        _flexCssNode = static_cast<WeexCore::WXCoreLayoutNode*>(object);
+        _flexCssNode->setContext((__bridge void *)self); // bind
         if ([self measureBlock]) {
             _flexCssNode->setMeasureFunc(flexCssNodeMeasure);
         }
-        _flexCssNode->setContext((__bridge void *)self);
-        [self _recomputeCSSNodeChildren];
-        [self _fillCSSNode:styles isUpdate:NO];
-        
-        if ([self.ref isEqualToString:WX_SDK_ROOT_REF]) {
-            if (flexIsUndefined(_flexCssNode->getStyleHeight()) && self.weexInstance.frame.size.height) {
-                _flexCssNode->setStyleHeight(self.weexInstance.frame.size.height);
-            }
-            
-            if (flexIsUndefined(_flexCssNode->getStyleWidth()) && self.weexInstance.frame.size.width) {
-                _flexCssNode->setStyleWidth(self.weexInstance.frame.size.width,NO);
-            }
-        }
+    }
+    else if (_flexCssNode) {
+        _flexCssNode->setContext(nullptr);
+        _flexCssNode = nullptr;
+    }
 }
 
 - (void)_updateCSSNodeStyles:(NSDictionary *)styles
@@ -105,23 +94,6 @@ -(void)_resetCSSNodeStyles:(NSArray *)styles
     [self _resetCSSNode:styles];
 }
 
-- (void)_recomputeCSSNodeChildren
-{
-}
-
-- (NSUInteger)_childrenCountForLayout
-{
-    NSArray *subcomponents = _subcomponents;
-    NSUInteger count = subcomponents.count;
-    for (WXComponent *component in subcomponents) {
-        if (!component->_isNeedJoinLayoutSystem) {
-            count--;
-        }
-    }
-    return (int)(count);
-}
-
-
 - (void)_frameDidCalculated:(BOOL)isChanged
 {
     WXAssertComponentThread();
@@ -160,10 +132,10 @@ - (void)_frameDidCalculated:(BOOL)isChanged
             if (!CGRectEqualToRect(strongSelf.view.frame,strongSelf.calculatedFrame)) {
                 strongSelf.view.frame = strongSelf.calculatedFrame;
                 strongSelf->_absolutePosition = CGPointMake(NAN, NAN);
-                [strongSelf configBoxShadow:_boxShadow];
+                [strongSelf configBoxShadow:strongSelf->_boxShadow];
             } else {
-                if (![strongSelf equalBoxShadow:_boxShadow withBoxShadow:_lastBoxShadow]) {
-                    [strongSelf configBoxShadow:_boxShadow];
+                if (![strongSelf equalBoxShadow:strongSelf->_boxShadow withBoxShadow:strongSelf->_lastBoxShadow]) {
+                    [strongSelf configBoxShadow:strongSelf->_boxShadow];
                 }
             }
             
@@ -181,41 +153,6 @@ - (void)_frameDidCalculated:(BOOL)isChanged
     }
 }
 
-- (void)_calculateFrameWithSuperAbsolutePosition:(CGPoint)superAbsolutePosition
-                           gatherDirtyComponents:(NSMutableSet<WXComponent *> *)dirtyComponents
-{
-    WXAssertComponentThread();
-
-        if (self.flexCssNode->hasNewLayout()) {
-            self.flexCssNode->setHasNewLayout(false);
-            _isLayoutDirty = NO;
-            CGRect newFrame = CGRectMake(
-                                         isnan(WXRoundPixelValue(_flexCssNode->getLayoutPositionLeft()))?0:WXRoundPixelValue(_flexCssNode->getLayoutPositionLeft())
-                                         ,isnan(WXRoundPixelValue(_flexCssNode->getLayoutPositionTop()))?0:WXRoundPixelValue(_flexCssNode->getLayoutPositionTop())
-                                         ,isnan(WXRoundPixelValue(_flexCssNode->getLayoutWidth()))?0:WXRoundPixelValue(_flexCssNode->getLayoutWidth())
-                                         ,isnan(WXRoundPixelValue(_flexCssNode->getLayoutHeight()))?0:WXRoundPixelValue(_flexCssNode->getLayoutHeight())
-                                         );
-            BOOL isFrameChanged = NO;
-            
-            if (!CGRectEqualToRect(newFrame, _calculatedFrame)) {
-                
-                isFrameChanged = YES;
-                _calculatedFrame = newFrame;
-                [dirtyComponents addObject:self];
-            }
-            
-            [self _frameDidCalculated:isFrameChanged];
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> newFrame ,type:%@,ref:%@, parentRef:%@,size :%@ ,instance:%@",self.type,self.ref,self.supercomponent.ref,NSStringFromCGRect(newFrame),self.weexInstance.instanceId);
-#endif
-        }
-    
-        NSArray * subcomponents = [_subcomponents copy];
-        for (WXComponent *subcomponent in subcomponents) {
-            [subcomponent _calculateFrameWithSuperAbsolutePosition:superAbsolutePosition gatherDirtyComponents:dirtyComponents];
-        }
-}
-
 - (void)_layoutDidFinish
 {
     WXAssertMainThread();
@@ -235,17 +172,21 @@ - (CGFloat)WXPixelType:(id)value
 
 - (void)_fillCSSNode:(NSDictionary *)styles isUpdate:(BOOL)isUpdate
 {
+    if (_flexCssNode == nullptr) {
+        return;
+    }
+    
         // flex
         if (styles[@"flex"]) {
-            _flexCssNode->setFlex([WXConvert CGFloat:styles[@"flex"]]);
+            _flexCssNode->set_flex([WXConvert CGFloat:styles[@"flex"]]);
         }
         if (isnan(_flexCssNode->getFlex())) {
             // to make the default flex value is zero, yoga is nan, maybe this can configured by yoga config
-            _flexCssNode->setFlex(0);
+            _flexCssNode->set_flex(0);
         }
         
         if (styles[@"flexDirection"]) {
-            _flexCssNode->setFlexDirection([self fxFlexDirection:styles[@"flexDirection"]],isUpdate);
+            _flexCssNode->setFlexDirection([self fxFlexDirection:styles[@"flexDirection"]], isUpdate);
         }
         if (styles[@"alignItems"]) {
             _flexCssNode->setAlignItems([self fxAlign:styles[@"alignItems"]]);
@@ -375,7 +316,8 @@ - (void)_fillCSSNode:(NSDictionary *)styles isUpdate:(BOOL)isUpdate
         [self setNeedsLayout];
 }
 
--(CGFloat)judgePropValuePropValue:(NSString *)propValue defaultValue:(CGFloat)defaultValue{
+-(CGFloat)judgePropValuePropValue:(id)propValue defaultValue:(CGFloat)defaultValue
+{
     CGFloat convertValue = (CGFloat)[WXConvert WXFlexPixelType:propValue scaleFactor:self.weexInstance.pixelScaleFactor];
     if (!isnan(convertValue)) {
         return convertValue;
@@ -383,6 +325,59 @@ -(CGFloat)judgePropValuePropValue:(NSString *)propValue defaultValue:(CGFloat)de
     return defaultValue;
 }
 
+- (NSString*)convertLayoutValueToStyleValue:(NSString*)valueName
+{
+    if (_flexCssNode == nullptr) {
+        return @"0";
+    }
+    
+    float layoutValue = 0;
+    if ([valueName isEqualToString:@"left"])
+        layoutValue = _flexCssNode->getLayoutPositionLeft();
+    else if ([valueName isEqualToString:@"right"])
+        layoutValue = _flexCssNode->getLayoutPositionRight();
+    else if ([valueName isEqualToString:@"top"])
+        layoutValue = _flexCssNode->getLayoutPositionTop();
+    else if ([valueName isEqualToString:@"bottom"])
+        layoutValue = _flexCssNode->getLayoutPositionBottom();
+    else if ([valueName isEqualToString:@"width"])
+        layoutValue = _flexCssNode->getLayoutWidth();
+    else if ([valueName isEqualToString:@"height"])
+        layoutValue = _flexCssNode->getLayoutHeight();
+    else
+        return @"0";
+    
+    layoutValue /= self.weexInstance.pixelScaleFactor;
+    return [NSString stringWithFormat:@"%f", layoutValue];
+}
+
+- (CGFloat)safeContainerStyleWidth
+{
+    if (_flexCssNode == nullptr) {
+        return 0.0f;
+    }
+    
+    CGFloat thisValue = _flexCssNode->getStyleWidth();
+    if (isnan(thisValue)) {
+        if (_flexCssNode->getParent()) {
+            thisValue = _flexCssNode->getParent()->getLayoutWidth(); // parent may be layout done
+            if (isnan(thisValue)) {
+                thisValue = _flexCssNode->getParent()->getStyleWidth();
+            }
+        }
+    }
+    
+    if (isnan(thisValue)) {
+        thisValue = self.weexInstance.frame.size.width;
+    }
+    
+    if (isnan(thisValue) || thisValue == 0.0f) {
+        thisValue = [UIScreen mainScreen].bounds.size.width;
+    }
+    
+    return thisValue;
+}
+
 #define WX_FLEX_STYLE_RESET_CSS_NODE(key, defaultValue)\
 do {\
     WX_FLEX_STYLE_RESET_CSS_NODE_GIVEN_KEY(key,key,defaultValue)\
@@ -619,51 +614,4 @@ - (void)_resetCSSNode:(NSArray *)styles
     return WeexCore::kJustifyFlexStart;
 }
 
-
-- (NSInteger) getActualNodeIndex:(WXComponent*)subcomponent atIndex:(NSInteger) index
-{
-    NSInteger actualIndex = 0; //实际除去不需要布局的subComponent,此时所在的正确位置
-    for (WXComponent *child in _subcomponents) {
-        if ([child.ref isEqualToString:subcomponent.ref]) {
-            break;
-        }
-        if (child->_isNeedJoinLayoutSystem) {
-            actualIndex ++;
-        }
-    }
-    return actualIndex;
-}
-
-- (void)_insertChildCssNode:(WXComponent*)subcomponent atIndex:(NSInteger)index
-{
-    self.flexCssNode->addChildAt(subcomponent.flexCssNode, (uint32_t)index);
-}
-
-- (void)_rmChildCssNode:(WXComponent *)subcomponent
-{
-    self.flexCssNode->removeChild(subcomponent->_flexCssNode);
-#ifdef DEBUG
-    WXLogDebug(@"flexLayout -> ref:%@ ,flexCssNode->removeChild ,childRef:%@",self.ref,subcomponent.ref);
-#endif
-}
-
-
-+ (void) recycleNodeOnComponentThread:(WeexCore::WXCoreLayoutNode * ) garbageNode gabRef:(NSString *)ref {
-    if (nullptr == garbageNode) {
-#ifdef DEBUG
-        WXLogDebug(@"flexlayout->recycle garbageNode ref:%@ is null ",ref);
-#endif
-        return;
-    }
-    WXPerformBlockOnComponentThread(^{
-#ifdef DEBUG
-        WXLogDebug(@"flexlayout->recycle  ref:%@ ,node:%p",ref,garbageNode );
-#endif
-        if(nullptr != garbageNode){
-            delete garbageNode;
-        }
-    });
-    //domthread
-}
-
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXCoreFlexEnum.h b/ios/sdk/WeexSDK/Sources/Layout/WXCoreFlexEnum.h
deleted file mode 100644
index 3ef76efc3b..0000000000
--- a/ios/sdk/WeexSDK/Sources/Layout/WXCoreFlexEnum.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#ifdef __cplusplus
-
-#ifndef WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUM_H
-#define WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUM_H
-
-namespace WeexCore {
-
-  /**
-   * MainAxis direction
-   */
-  enum WXCoreFlexDirection {
-    kFlexDirectionColumn,
-    kFlexDirectionColumnReverse,
-    kFlexDirectionRow,
-    kFlexDirectionRowReverse,
-  };
-
-  /**
-   * Controls the position of the element on the MainAxis
-   */
-  enum WXCoreJustifyContent {
-    kJustifyFlexStart,
-    kJustifyCenter,
-    kJustifyFlexEnd,
-    kJustifySpaceBetween,
-    kJustifySpaceAround,
-  };
-
-  /**
-   * Controls the position of the element on the CrossAxis and whether Stretch
-   */
-  enum WXCoreAlignItems {
-    kAlignItemsFlexStart,
-    kAlignItemsCenter,
-    kAlignItemsFlexEnd,
-    kAlignItemsStretch,
-  };
-
-  /**
-   * Controls the count of flexlines
-   */
-  enum WXCoreFlexWrap {
-    kNoWrap,
-    kWrap,
-    kWrapReverse,
-  };
-
-  /**
-   * The align-self will overrides the align-items specified by the Flex container.
-   * The two attributes have the same range of values.
-   */
-  enum WXCoreAlignSelf {
-    kAlignSelfAuto = -1,
-    kAlignSelfFlexStart = kAlignItemsFlexStart,
-    kAlignSelfCenter = kAlignItemsCenter,
-    kAlignSelfFlexEnd = kAlignItemsFlexEnd,
-    kAlignSelfStretch = kAlignItemsStretch,
-  };
-
-  enum WXCorePositionType {
-    kRelative,
-    kAbsolute,
-    kFixed,
-    kSticky = kRelative
-  };
-
-  enum WXCorePositionEdge {
-    kPositionEdgeTop,
-    kPositionEdgeBottom,
-    kPositionEdgeLeft,
-    kPositionEdgeRight,
-  };
-
-  enum WXCoreMarginEdge {
-    kMarginALL,
-    kMarginTop,
-    kMarginBottom,
-    kMarginLeft,
-    kMarginRight,
-  };
-
-  enum WXCorePaddingEdge {
-    kPaddingALL,
-    kPaddingTop,
-    kPaddingBottom,
-    kPaddingLeft,
-    kPaddingRight,
-  };
-
-  enum WXCoreBorderWidthEdge {
-    kBorderWidthALL,
-    kBorderWidthTop,
-    kBorderWidthBottom,
-    kBorderWidthLeft,
-    kBorderWidthRight,
-  };
-
-  enum WXCoreEdge{
-    kTop,
-    kRight,
-    kBottom,
-    kLeft,
-  };
-
-}
-#endif //WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUM_H
-#endif
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXCoreLayout.cpp b/ios/sdk/WeexSDK/Sources/Layout/WXCoreLayout.cpp
deleted file mode 100644
index 5451853e3a..0000000000
--- a/ios/sdk/WeexSDK/Sources/Layout/WXCoreLayout.cpp
+++ /dev/null
@@ -1,1084 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "WXCoreLayout.h"
-#include <tuple>
-
-using namespace WeexCore;
-
-namespace WeexCore {
-
-  /**
-   * Entry function to calculate layout
-   */
-  void WXCoreLayoutNode::calculateLayout(const std::pair<float,float> &renderPageSize) {
-    BFCs.clear();
-    initFormatingContext(BFCs);
-    auto bfcDimension = calculateBFCDimension(renderPageSize);
-    if (std::get<0>(bfcDimension) || isDirty()) {
-      mChildrenFrozen.assign(getChildCount(kNonBFC), false);
-      measure(std::get<1>(bfcDimension), std::get<2>(bfcDimension), true);
-      checkSizeConstraints(this, false);
-    }
-    layout(mCssStyle->mMargin.getMargin(kMarginLeft),
-           mCssStyle->mMargin.getMargin(kMarginTop),
-           mCssStyle->mMargin.getMargin(kMarginLeft) + getLayoutWidth(),
-           mCssStyle->mMargin.getMargin(kMarginTop) + getLayoutHeight(),
-           false, &renderPageSize);
-    for (Index i = 0; i < getChildCount(kBFC); ++i) {
-      WXCoreLayoutNode *child = getChildAt(kBFC, i);
-      child->calculateLayout(renderPageSize);
-    }
-  }
-
-  void WXCoreLayoutNode::initFormatingContext(std::vector<WXCoreLayoutNode *> &BFCs) {
-    NonBFCs.clear();
-    for(auto it = ChildListIterBegin(); it != ChildListIterEnd(); it++) {
-      WXCoreLayoutNode* child = *it;
-      if (child != nullptr) {
-        if (isBFC(child)) {
-          BFCs.push_back(child);
-        } else {
-          NonBFCs.push_back(child);
-          child->initFormatingContext(BFCs);
-        }
-      }
-    }
-    reset();
-  }
-
-  std::tuple<bool, float, float> WXCoreLayoutNode::calculateBFCDimension(const std::pair<float,float>& renderPageSize) {
-    bool sizeChanged = false;
-    float width = mCssStyle->mStyleWidth, height = mCssStyle->mStyleHeight;
-    std::pair<bool,float> ret;
-    if (isBFC(this)) {
-      ret = calculateBFCWidth(width, renderPageSize.first);
-      sizeChanged |=ret.first;
-      width = ret.second;
-
-      ret = calculateBFCHeight(height,renderPageSize.second);
-      sizeChanged |=ret.first;
-      height = ret.second;
-    }
-    return std::make_tuple(sizeChanged, width, height);
-  }
-
-  std::pair<bool,float> WXCoreLayoutNode::calculateBFCWidth(float width, const float renderPageWidth){
-    bool sizeChanged = false;
-    if (isnan(width) &&
-        mParent != nullptr &&
-        !isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft)) &&
-        !isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeRight))) {
-      float containingBlockWidth = NAN;
-      switch (mCssStyle->mPositionType) {
-        case kAbsolute:
-          containingBlockWidth = mParent->mLayoutResult->mLayoutSize.width;
-          break;
-        case kFixed:
-          if (!isnan(renderPageWidth)) {
-            containingBlockWidth = renderPageWidth;
-          }
-          break;
-        default:
-              break;
-      }
-      if (!isnan(containingBlockWidth)) {
-        width = containingBlockWidth -
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft) -
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeRight);
-        if (!isnan(mCssStyle->mMargin.getMargin(kMarginLeft))) {
-            width -= mCssStyle->mMargin.getMargin(kMarginLeft);
-        }
-        if (!isnan(mCssStyle->mMargin.getMargin(kMarginRight))) {
-            width -= mCssStyle->mMargin.getMargin(kMarginRight);
-        }
-        setWidthMeasureMode(kExactly);
-        sizeChanged = true;
-      }
-    }
-    return std::make_pair(sizeChanged, width);
-  }
-
-
-  std::pair<bool,float> WXCoreLayoutNode::calculateBFCHeight(float height, const float renderPageHeight){
-    bool sizeChanged = false;
-    if (isnan(mCssStyle->mStyleHeight) &&
-        mParent != nullptr &&
-        !isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeTop)) &&
-        !isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom))) {
-      float containingBlockHeight = NAN;
-      switch (mCssStyle->mPositionType) {
-        case kAbsolute:
-          containingBlockHeight = mParent->mLayoutResult->mLayoutSize.height;
-          break;
-        case kFixed:
-          if (!isnan(renderPageHeight)) {
-            containingBlockHeight = renderPageHeight;
-          }
-          break;
-        default:
-          break;
-      }
-      if (!isnan(containingBlockHeight)) {
-        height = containingBlockHeight -
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeTop) -
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom);
-        if (!isnan(mCssStyle->mMargin.getMargin(kMarginTop))) {
-          height -= mCssStyle->mMargin.getMargin(kMarginTop);
-        }
-        if (!isnan(mCssStyle->mMargin.getMargin(kMarginBottom))) {
-          height -= mCssStyle->mMargin.getMargin(kMarginBottom);
-        }
-        setHeightMeasureMode(kExactly);
-        sizeChanged = true;
-      }
-    }
-    return std::make_pair(sizeChanged, height);
-  }
-
-  void WXCoreLayoutNode::measure(const float width, const float height, const bool hypotheticalMeasurment){
-    if(hypotheticalMeasurment){
-      //Only BFC will enter this case.
-      hypotheticalMeasure(width, height);
-    }
-
-    if(getChildCount(kNonBFC) > 0){
-      if((isMainAxisHorizontal(this) && widthDirty) || (!isMainAxisHorizontal(this) && heightDirty)){
-        measureInternalNode(width, height, false, false);
-      }
-      determineMainSize(width, height);
-      determineCrossSize(width, height, true);
-      measureInternalNode(width, height, true, false);
-      determineCrossSize(width, height, false);
-    }
-    else {
-      if (widthDirty || heightDirty) {
-        measureLeafNode(width, height, hypotheticalMeasurment, false);
-      }
-    }
-    clearDirty();
-  }
-
-  void WXCoreLayoutNode::hypotheticalMeasure(const float width, const float height, const bool stretch){
-    if (getChildCount(kNonBFC) > 0) {
-      measureInternalNode(width, height, true, true);
-    } else {
-      measureLeafNode(width, height, true, stretch);
-    }
-
-    widthDirty = false;
-    heightDirty = false;
-    mLayoutResult->mLayoutSize.hypotheticalWidth = mLayoutResult->mLayoutSize.width;
-    mLayoutResult->mLayoutSize.hypotheticalHeight = mLayoutResult->mLayoutSize.height;
-  }
-
-  void WXCoreLayoutNode::measureLeafNode(float width, float height, const bool hypothetical, const bool stretch) {
-    if ((measureFunc != nullptr) &&
-        (widthMeasureMode == kUnspecified
-            || heightMeasureMode == kUnspecified)) {
-      float constrainsWidth = width;
-      if(isnan(width)){
-        if(!isnan(mCssStyle->mMaxWidth)){
-          constrainsWidth = mCssStyle->mMaxWidth;
-        }
-      }
-
-      if((!isnan(width)&&widthMeasureMode == kExactly) ||
-          (isnan(width) && !isnan(mCssStyle->mMaxWidth))) {
-        constrainsWidth -= sumPaddingBorderAlongAxis(this, true);
-      }
-      WXCoreSize dimension = measureFunc(this, constrainsWidth,
-                                         (stretch && !isnan(width)) ? kExactly:widthMeasureMode,
-                                         height, heightMeasureMode);
-      if (widthMeasureMode == kUnspecified) {
-        float actualWidth = dimension.width + sumPaddingBorderAlongAxis(this, true);
-        if (isnan(width)) {
-          width = actualWidth;
-        } else if (!stretch) {
-          width = std::min(width, actualWidth);
-        }
-      }
-      if (heightMeasureMode == kUnspecified) {
-        float actualHeight = dimension.height + sumPaddingBorderAlongAxis(this, false);
-        if (isnan(height)) {
-          height = actualHeight;
-        } else if (!stretch) {
-          height = std::min(height, actualHeight);
-        }
-      }
-    } else {
-      width = widthMeasureMode == kUnspecified ? sumPaddingBorderAlongAxis(this, true)
-                                               : width;
-      height = heightMeasureMode == kUnspecified ? sumPaddingBorderAlongAxis(this, false)
-                                                 : height;
-    }
-    setMeasuredDimension(width, height);
-  }
-
-
-  /**
-   * Determine the main size by expanding the individual flexGrow attribute.
-   */
-  void WXCoreLayoutNode::determineMainSize(const float width, const float height) {
-      bool horizontal = isMainAxisHorizontal(this);
-      if((horizontal && widthMeasureMode == kExactly) || (!horizontal && heightMeasureMode == kExactly)) {
-        //The measureMode along main axis is exactly
-        float maxMainSize = horizontal ? width: height;
-        maxMainSize -= sumPaddingBorderAlongAxis(this, isMainAxisHorizontal(this));
-        Index childIndex = 0;
-        for (WXCoreFlexLine *flexLine : mFlexLines) {
-          childIndex = expandItemsInFlexLine(flexLine, maxMainSize, childIndex);
-        }
-      }
-    }
-
-  /**
-   * @param flexDirection         the flex direction attribute
-   * @param width                 stylewidth by this node
-   * @param height                styleheight by this node
-   * @param paddingAlongCrossAxis the padding value for this node along the cross axis
-   */
-    void WXCoreLayoutNode::determineCrossSize(const float width, const float height, const bool stretch) {
-      if (mFlexLines.size() == 1 && isCrossExactly()) {
-        bool horizontal = isMainAxisHorizontal(this);
-        float size = mFlexLines[0]->mCrossSize;
-        float paddingAlongCrossAxis = sumPaddingBorderAlongAxis(this, !horizontal);
-        if (horizontal) {
-          if (heightMeasureMode == kExactly) {
-            size = height - paddingAlongCrossAxis;
-          }
-        } else {
-          if (widthMeasureMode == kExactly) {
-            size = width - paddingAlongCrossAxis;
-          }
-        }
-        mFlexLines[0]->mCrossSize = size;
-      }
-      if (stretch) {
-        stretchViewCrossSize();
-      }
-    }
-
-
-    void WXCoreLayoutNode::measureInternalNode(const float width, const float height, const bool needMeasure,
-                                               const bool hypotheticalMeasurment) {
-      for (WXCoreFlexLine *flexLine : mFlexLines) {
-        if(flexLine!= nullptr) {
-          delete flexLine;
-        }
-        flexLine = nullptr;
-      }
-      mFlexLines.clear();
-      Index childCount = getChildCount(kNonBFC);
-      WXCoreFlexLine *flexLine = new WXCoreFlexLine();
-
-      for (Index i = 0; i < childCount; i++) {
-        WXCoreLayoutNode *child = getChildAt(kNonBFC, i);
-        if (child->mCssStyle->mAlignSelf == kAlignSelfStretch) {
-          flexLine->mIndicesAlignSelfStretch.push_back(i);
-        }
-        measureChild(child, flexLine->mMainSize, width, height, needMeasure, hypotheticalMeasurment);
-        checkSizeConstraints(child, hypotheticalMeasurment);
-
-        if (isWrapRequired(width, height, flexLine->mMainSize,
-                           calcItemSizeAlongAxis(child, isMainAxisHorizontal(this)))) {
-          if (flexLine->mItemCount > 0) {
-            mFlexLines.push_back(flexLine);
-          }
-          flexLine = new WXCoreFlexLine();
-          flexLine->mItemCount = 1;
-        } else {
-          flexLine->mItemCount++;
-        }
-        updateCurrentFlexline(childCount, flexLine, i, child, hypotheticalMeasurment || (!hypotheticalMeasurment && !needMeasure));
-      }
-      setMeasuredDimensionForFlex(width, widthMeasureMode, height, heightMeasureMode);
-    }
-
-    void WXCoreLayoutNode::updateCurrentFlexline(const Index childCount, WXCoreFlexLine* const flexLine, const Index i,
-                                                 const WXCoreLayoutNode* const child, const bool useHypotheticalSize){
-      flexLine->mMainSize += calcItemSizeAlongAxis(child, isMainAxisHorizontal(this), useHypotheticalSize);
-      sumFlexGrow(child, flexLine, i);
-      flexLine->mCrossSize =
-          std::max(flexLine->mCrossSize, calcItemSizeAlongAxis(child, !isMainAxisHorizontal(this), useHypotheticalSize));
-      if (i == childCount - 1 && flexLine->mItemCount != 0) {
-        mFlexLines.push_back(flexLine);
-      }
-    }
-
-    void WXCoreLayoutNode::measureChild(WXCoreLayoutNode* const child, const float currentMainSize,
-                                        const float parentWidth, const float parentHeight,
-                                        const bool needMeasure, const bool hypotheticalMeasurment) {
-      if (needMeasure && child->isDirty()) {
-        if (hypotheticalMeasurment) {
-          float childWidth = child->mCssStyle->mStyleWidth;
-          float childHeight = child->mCssStyle->mStyleHeight;
-          bool stretch = !isMainAxisHorizontal(this) &&
-              child->measureFunc != nullptr &&
-              widthMeasureMode == kExactly &&
-              isSingleFlexLine(parentHeight) &&
-              ((child->mCssStyle->mAlignSelf == kAlignSelfStretch) ||
-                  (mCssStyle->mAlignItems == kAlignItemsStretch
-                      && child->mCssStyle->mAlignSelf == kAlignSelfAuto));
-
-          adjustChildSize(child, currentMainSize, parentWidth,
-                          parentHeight, childWidth, childHeight);
-          child->hypotheticalMeasure(childWidth, childHeight, stretch);
-        } else {
-          if(isSingleFlexLine(isMainAxisHorizontal(this) ? parentWidth : parentHeight)
-              && !isMainAxisHorizontal(this)){
-            if(child->widthMeasureMode == kUnspecified) {
-              child->setLayoutWidth(parentWidth - sumPaddingBorderAlongAxis(this, true)
-                                        - child->mCssStyle->sumMarginOfDirection(true));
-            }
-            if(child->heightMeasureMode == kUnspecified && child->widthDirty) {
-              child->mLayoutResult->mLayoutSize.height = NAN;
-            }
-          }
-          child->measure(child->mLayoutResult->mLayoutSize.width,
-                         child->mLayoutResult->mLayoutSize.height, hypotheticalMeasurment);
-        }
-      }
-    }
-
-    void WXCoreLayoutNode::adjustChildSize(const WXCoreLayoutNode *child,
-                                        const float currentMainSize,
-                                        const float parentWidth,
-                                        const float parentHeight,
-                                        float &childWidth,
-                                        float &childHeight) const {
-      if(child->measureFunc == nullptr) {
-        if(!isnan(childWidth)){
-          childWidth = std::max(childWidth, child->sumPaddingBorderAlongAxis(child, true));
-        }
-        if(!isnan(childHeight)){
-          childHeight = std::max(childHeight, child->sumPaddingBorderAlongAxis(child, false));
-        }
-      }
-
-      if (isSingleFlexLine(isMainAxisHorizontal(this) ? parentWidth : parentHeight)) {
-        if (isMainAxisHorizontal(this)) {
-          if (!isnan(parentHeight) && isnan(child->mCssStyle->mStyleHeight)
-              && child->mCssStyle->mAlignSelf == kAlignSelfAuto
-              && mCssStyle->mAlignItems == kAlignItemsStretch) {
-            childHeight = parentHeight - sumPaddingBorderAlongAxis(this, false) -
-                child->mCssStyle->sumMarginOfDirection(false);
-          }
-        } else {
-          if (!isnan(parentWidth) && isnan(child->mCssStyle->mStyleWidth)) {
-            childWidth = parentWidth - sumPaddingBorderAlongAxis(this, true) -
-                child->mCssStyle->sumMarginOfDirection(true);
-          }
-       }
-      }
-    }
-
-    void WXCoreLayoutNode::checkSizeConstraints(WXCoreLayoutNode* const node, const bool hypotheticalMeasurment) {
-      bool widthRemeasure = false, heightRemeasure = false;
-      float nodeWidth,nodeHeight;
-      nodeWidth = node->mLayoutResult->mLayoutSize.width;
-      nodeHeight = node->mLayoutResult->mLayoutSize.height;
-
-      if (!isnan(node->mCssStyle->mMinWidth) &&
-          nodeWidth < node->mCssStyle->mMinWidth) {
-        widthRemeasure = true;
-        nodeWidth = node->mCssStyle->mMinWidth;
-      } else if (!isnan(node->mCssStyle->mMaxWidth)
-          && nodeWidth > node->mCssStyle->mMaxWidth) {
-        widthRemeasure = true;
-        nodeWidth = node->mCssStyle->mMaxWidth;
-      }
-
-      if (!isnan(node->mCssStyle->mMinHeight) &&
-          nodeHeight < node->mCssStyle->mMinHeight) {
-        heightRemeasure = true;
-        nodeHeight = node->mCssStyle->mMinHeight;
-      } else if (!isnan(node->mCssStyle->mMaxHeight) &&
-          nodeHeight > node->mCssStyle->mMaxHeight) {
-        heightRemeasure = true;
-        nodeHeight = node->mCssStyle->mMaxHeight;
-      }
-
-      node->setWidthMeasureMode(widthRemeasure ? kExactly : node->widthMeasureMode);
-      node->setHeightMeasureMode(heightRemeasure ? kExactly : node->heightMeasureMode);
-
-      if (hypotheticalMeasurment) {
-        if (widthRemeasure) {
-          node->setLayoutWidth(nodeWidth);
-          node->mLayoutResult->mLayoutSize.hypotheticalWidth = nodeWidth;
-        }
-        if (heightRemeasure) {
-          node->setLayoutHeight(nodeHeight);
-          node->mLayoutResult->mLayoutSize.hypotheticalHeight = nodeHeight;
-        }
-      } else {
-        if (widthRemeasure || heightRemeasure) {
-          node->measure(nodeWidth, nodeHeight, hypotheticalMeasurment);
-        }
-      }
-    }
-
-    Index WXCoreLayoutNode::expandItemsInFlexLine(WXCoreFlexLine* const flexLine,
-                                      const float maxMainSize,
-                                      const Index startIndex) {
-      Index childIndex = startIndex;
-      if (flexLine->mTotalFlexGrow <= 0) {
-        childIndex += flexLine->mItemCount;
-      } else {
-        bool needsReexpand = false;
-        const float unitSpace = (maxMainSize - flexLine->mMainSize + flexLine->mTotalFlexibleSize) /
-                                (flexLine->mTotalFlexGrow > 1 ? flexLine->mTotalFlexGrow : 1);
-        float sizeBeforeExpand = flexLine->mMainSize;
-        flexLine->mMainSize = 0;
-
-        for (Index i = 0; i < flexLine->mItemCount; i++) {
-          WXCoreLayoutNode *child = getChildAt(kNonBFC, childIndex);
-          if (!mChildrenFrozen[childIndex]) {
-            float childSizeAlongMainAxis = unitSpace * child->mCssStyle->mFlexGrow;
-            std::pair<bool, float> limitSize = limitChildMainSize(flexLine, child,
-                                                                childSizeAlongMainAxis, childIndex);
-            needsReexpand = limitSize.first;
-            adjustChildSize(child, limitSize.second);
-          }
-          flexLine->mMainSize += calcItemSizeAlongAxis(child, isMainAxisHorizontal(this));
-          childIndex++;
-        }
-
-        if (needsReexpand && sizeBeforeExpand != flexLine->mMainSize) {
-          // Re-invoke the method with the same startIndex to distribute the positive free space
-          // that wasn't fully distributed (because of maximum/minimum length constraint)
-          expandItemsInFlexLine(flexLine, maxMainSize, startIndex);
-        }
-      }
-      return childIndex;
-    }
-
-    void WXCoreLayoutNode::adjustChildSize(WXCoreLayoutNode* const child, const float childMainSize) {
-      if (isMainAxisHorizontal(this)) {
-        child->setWidthMeasureMode(kExactly);
-        child->setLayoutWidth(childMainSize);
-        //TODO Fix https://jsplayground.taobao.org/raxplayground/97efee70-775f-45a6-b07d-d84c8d1b4387
-        //TODO This is just a temporary fix, we need to make things beauty and clean.
-        if(child->heightMeasureMode == kUnspecified && child->measureFunc != nullptr && child->getChildCount() == 0){
-          child->setLayoutHeight(NAN);
-        }
-      } else {
-        child->setHeightMeasureMode(kExactly);
-        child->setLayoutHeight(childMainSize);
-      }
-    }
-
-    void WXCoreLayoutNode::stretchViewCrossSize(){
-      if (mCssStyle->mAlignItems == kAlignItemsStretch) {
-        Index viewIndex = 0;
-        for (Index i = 0; i< mFlexLines.size(); i++ ) {
-            WXCoreFlexLine *flexLine = mFlexLines.at(i);
-            for (Index j = 0; j < flexLine->mItemCount; j++, viewIndex++) {
-                WXCoreLayoutNode* child = getChildAt(kNonBFC, viewIndex);
-              if (child->mCssStyle->mAlignSelf == kAlignSelfAuto ||
-                  child->mCssStyle->mAlignSelf == kAlignSelfStretch) {
-                stretchViewCrossSize(child, flexLine->mCrossSize);
-              }
-          }
-        }
-      } else {
-        for (WXCoreFlexLine *flexLine : mFlexLines) {
-          for (auto index : flexLine->mIndicesAlignSelfStretch) {
-            stretchViewCrossSize(getChildAt(kNonBFC, index), flexLine->mCrossSize);
-          }
-        }
-      }
-    }
-
-    void WXCoreLayoutNode::stretchViewCrossSize(WXCoreLayoutNode* const child, float crossSize){
-      if (isMainAxisHorizontal(this)) {
-        if (child->heightMeasureMode != kExactly &&
-            !(child->measureFunc != nullptr && child->getChildCount() == 0)) {
-          crossSize -=
-              child->mCssStyle->mMargin.getMargin(kMarginTop) +
-                  child->mCssStyle->mMargin.getMargin(kMarginBottom);
-          child->setHeightMeasureMode(kExactly);
-          child->setLayoutHeight(std::max(0.f, crossSize));
-        }
-      } else {
-        if (child->widthMeasureMode != kExactly) {
-            crossSize -=
-                child->mCssStyle->mMargin.getMargin(kMarginLeft) +
-                    child->mCssStyle->mMargin.getMargin(kMarginRight);
-          child->setWidthMeasureMode(kExactly);
-          child->setLayoutWidth(std::max(0.f, crossSize));
-        }
-      }
-    }
-
-    void WXCoreLayoutNode::setFrame(const float l, const float t, const float r, const float b) {
-      if (mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeLeft) != l
-          || mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeTop) != t
-          || mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeRight) != r
-          || mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeBottom) != b) {
-        setHasNewLayout(true);
-        setFrame(&mLayoutResult->mLayoutPosition, l, t, r, b);
-      }
-    }
-
-  void WXCoreLayoutNode::setFrame(WXCorePosition* position,const float l, const float t, const float r, const float b){
-    position->setPosition(kPositionEdgeLeft, l);
-    position->setPosition(kPositionEdgeTop, t);
-    position->setPosition(kPositionEdgeRight, r);
-    position->setPosition(kPositionEdgeBottom, b);
-  }
-
-  void WXCoreLayoutNode::layout(float left, float top, float right, float bottom, const bool absoluteFlexItem, const std::pair<float,float>* const renderPageSize) {
-    if(absoluteFlexItem) {
-      absoultePositon = new WXCorePosition();
-      setFrame(absoultePositon, left, top, right, bottom);
-    }
-    else{
-      switch (mCssStyle->mPositionType) {
-        case kFixed:
-        case kAbsolute:
-          calcAbsoluteOffset(left, top, right, bottom, renderPageSize);
-          break;
-        default:
-        case kRelative:
-          calcRelativeOffset(left, top, right, bottom);
-          break;
-      }
-      setFrame(left, top, right, bottom);
-      onLayout(left, top, right, bottom);
-    }
-  }
-
-  void WXCoreLayoutNode::calcRelativeOffset(float &left, float &top, float &right, float &bottom) const {
-    if (!isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft))) {
-      left += mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft);
-      right += mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft);
-    } else if (!isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeRight))) {
-      left -= mCssStyle->mStylePosition.getPosition(kPositionEdgeRight);
-      right -= mCssStyle->mStylePosition.getPosition(kPositionEdgeRight);
-    }
-
-    if (!isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeTop))) {
-      top += mCssStyle->mStylePosition.getPosition(kPositionEdgeTop);
-      bottom += mCssStyle->mStylePosition.getPosition(kPositionEdgeTop);
-    } else if (!isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom))) {
-      top -= mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom);
-      bottom -= mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom);
-    }
-  }
-
-  void WXCoreLayoutNode::calcAbsoluteOffset(float &left, float &top, float &right, float &bottom, const std::pair<float,float>* const renderPageSize){
-    WXCorePadding parentPadding;
-    WXCoreBorderWidth parentBorder;
-    WXCoreSize parentSize;
-    if (mCssStyle->mPositionType == kAbsolute && mParent != nullptr) {
-      parentPadding = mParent->mCssStyle->mPadding;
-      parentBorder = mParent->mCssStyle->mBorderWidth;
-      parentSize = mParent->mLayoutResult->mLayoutSize;
-      positionAbsoluteFlexItem(left, top, right, bottom);
-    } else if(mCssStyle->mPositionType == kFixed && renderPageSize!= nullptr){
-      parentSize.width = renderPageSize->first;
-      parentSize.height = renderPageSize->second;
-    }
-    updateLeftRightForAbsolute(left, right, parentPadding, parentBorder, parentSize);
-    updateTopBottomForAbsolute(top, bottom, parentPadding, parentBorder, parentSize);
-  }
-
-  void WXCoreLayoutNode::positionAbsoluteFlexItem(float &left, float &top, float &right, float &bottom){
-    if ((isnan(getStylePositionLeft()) && isnan(getStylePositionRight())) ||
-        (isnan(getStylePositionTop()) && isnan(getStylePositionBottom()))) {
-      WXCoreFlexLine tempLine;
-      mParent->updateFlexLineForAbsoluteItem(this, &tempLine);
-      mParent->onLayout(mParent->getLayoutPositionLeft(),
-                        mParent->getLayoutPositionTop(),
-                        mParent->getLayoutPositionRight(),
-                        mParent->getLayoutPositionBottom(),
-                        this, &tempLine);
-      if(absoultePositon != nullptr) {
-        if (isnan(getStylePositionLeft()) && isnan(getStylePositionRight())) {
-          left = absoultePositon->getPosition(kPositionEdgeLeft);
-          right = absoultePositon->getPosition(kPositionEdgeRight);
-        }
-        if (isnan(getStylePositionTop()) && isnan(getStylePositionBottom())) {
-          top = absoultePositon->getPosition(kPositionEdgeTop);
-          bottom = absoultePositon->getPosition(kPositionEdgeBottom);
-        }
-        delete absoultePositon;
-        absoultePositon = nullptr;
-      }
-    }
-  }
-
-  void WXCoreLayoutNode::updateFlexLineForAbsoluteItem(WXCoreLayoutNode *const absoluteFlexItem, WXCoreFlexLine *const flexLine){
-    flexLine->mMainSize = isMainAxisHorizontal(this) ?
-                         absoluteFlexItem->getLayoutWidth() + absoluteFlexItem->getMarginLeft()
-                             + absoluteFlexItem->getMarginRight() :
-                         absoluteFlexItem->getLayoutHeight() + absoluteFlexItem->getMarginTop()
-                             + absoluteFlexItem->getMarginBottom();
-    flexLine->mCrossSize = isMainAxisHorizontal(this) ?
-                          absoluteFlexItem->getLayoutHeight() + absoluteFlexItem->getMarginTop()
-                              + absoluteFlexItem->getMarginBottom() :
-                          absoluteFlexItem->getLayoutWidth() + absoluteFlexItem->getMarginLeft()
-                              + absoluteFlexItem->getMarginRight();
-    flexLine->mItemCount = 1;
-  }
-
-  void WXCoreLayoutNode::onLayout(const float left, const float top, const float right, const float bottom,
-                                  WXCoreLayoutNode *const absoulteItem, WXCoreFlexLine *const flexLine) {
-    switch (mCssStyle->mFlexDirection) {
-      case kFlexDirectionRow:
-        layoutHorizontal(false, left, top, right, bottom, absoulteItem, flexLine);
-        break;
-      case kFlexDirectionRowReverse:
-        layoutHorizontal(true, left, top, right, bottom, absoulteItem, flexLine);
-        break;
-      case kFlexDirectionColumnReverse:
-        layoutVertical(mCssStyle->mFlexWrap == kWrapReverse, true, left, top, right, bottom, absoulteItem, flexLine);
-        break;
-      case kFlexDirectionColumn:
-      default:
-        layoutVertical(mCssStyle->mFlexWrap == kWrapReverse, false, left, top, right, bottom, absoulteItem, flexLine);
-        break;
-    }
-  }
-
-  /**
-   * Sub method for {@link WXCoreLayoutNode #onLayout(int, int, int, int)} when the
-   * {@link #mFlexDirection} is either {@link WXCoreFlexDirection #WXCore_Flex_Direction_Row} or
-   * {@link WXCoreFlexDirection #WXCore_Flex_Direction_Row_REVERSE}.
-   *
-   * @param isRtl  {@code true} if the horizontal layout direction is mStyleRight to mStyleLeft, {@code
-   *               false} otherwise.
-   * @param left   the mStyleLeft position of this View
-   * @param top    the mStyleTop position of this View
-   * @param right  the mStyleRight position of this View
-   * @param bottom the mStyleBottom position of this View
-   */
-  void WXCoreLayoutNode::layoutHorizontal(const bool isRtl,
-                                          const float left, const float top,
-                                          const float right, const float bottom,
-                                          WXCoreLayoutNode *const absoulteItem,
-                                          WXCoreFlexLine *const flexLine) {
-    Index currentViewIndex = 0;
-    float height = bottom - top;
-    float width = right - left;
-
-    // childBottom is used if the mFlexWrap is FLEX_WRAP_WRAP_REVERSE otherwise
-    // childTop is used to align the vertical position of the children views.
-    float childBottom = height - getPaddingBottom() - getBorderWidthBottom();
-    float childTop = getPaddingTop() + getBorderWidthTop();
-
-    // Used only for RTL layout
-    // Use float to reduce the round error that may happen in when justifyContent ==
-    // SPACE_BETWEEN or SPACE_AROUND
-    float childLeft, childRight;
-    const std::vector<WXCoreFlexLine*> &lines = (flexLine == nullptr? mFlexLines: std::vector<WXCoreFlexLine*>{flexLine});
-
-    for (WXCoreFlexLine *flexLine: lines) {
-      float spaceBetweenItem = 0.f;
-      layoutFlexlineHorizontal(width, flexLine, childLeft, childRight, spaceBetweenItem);
-      spaceBetweenItem = std::max(spaceBetweenItem, 0.f);
-
-      if(absoulteItem == nullptr) {
-        for (Index j = 0; j < flexLine->mItemCount; j++) {
-          WXCoreLayoutNode *child = getChildAt(kNonBFC, currentViewIndex);
-          if (child == nullptr) {
-            continue;
-          }
-          layoutSingleChildHorizontal(isRtl, false, childBottom, childTop,
-                                     flexLine, child, childLeft, childRight);
-          childLeft += child->mLayoutResult->mLayoutSize.width + spaceBetweenItem + child->getMarginRight();
-          childRight -= child->mLayoutResult->mLayoutSize.width + spaceBetweenItem + child->getMarginLeft();
-          currentViewIndex++;
-        }
-        childTop += flexLine->mCrossSize;
-        childBottom -= flexLine->mCrossSize;
-      }
-      else{
-        layoutSingleChildHorizontal(isRtl, true, childBottom, childTop,
-                                   flexLine, absoulteItem, childLeft, childRight);
-      }
-    }
-  }
-
-  void WXCoreLayoutNode::layoutFlexlineHorizontal(const float width,
-                              const WXCoreFlexLine *const flexLine,
-                              float &childLeft,
-                              float &childRight,
-                              float &spaceBetweenItem) const {
-    Index visibleCount, visibleItem;
-    float denominator;
-    switch (mCssStyle->mJustifyContent) {
-      case kJustifyFlexEnd:
-        childLeft = width - flexLine->mMainSize - getPaddingRight() - getBorderWidthRight();
-        childRight = width - getPaddingLeft() - getBorderWidthLeft();
-        break;
-      case kJustifyCenter:
-        childLeft = (width - flexLine->mMainSize - mCssStyle->sumPaddingBorderOfEdge(kRight)
-            + mCssStyle->sumPaddingBorderOfEdge(kLeft)) / 2;
-        childRight = childLeft + flexLine->mMainSize;
-        break;
-      case kJustifySpaceAround:
-        visibleCount = flexLine->mItemCount;
-        if (visibleCount != 0) {
-          spaceBetweenItem =
-              (width - flexLine->mMainSize - sumPaddingBorderAlongAxis(this, true)) / visibleCount;
-        }
-        childLeft = getPaddingLeft() + getBorderWidthLeft() + spaceBetweenItem / 2.f;
-        childRight = width - getPaddingRight() - getBorderWidthRight() - spaceBetweenItem / 2.f;
-        break;
-      case kJustifySpaceBetween:
-        childLeft = getPaddingLeft() + getBorderWidthLeft();
-        visibleItem = flexLine->mItemCount;
-        denominator = visibleItem != 1 ? visibleItem - 1 : 1.f;
-        spaceBetweenItem =
-            (width - flexLine->mMainSize - sumPaddingBorderAlongAxis(this, true)) / denominator;
-        childRight = width - getPaddingRight() - getBorderWidthRight();
-        break;
-      case kJustifyFlexStart:
-      default:
-        childLeft = getPaddingLeft() + getBorderWidthLeft();
-        childRight = width - getPaddingRight() - getBorderWidthRight();
-        break;
-    }
-  }
-
-  void WXCoreLayoutNode::layoutSingleChildHorizontal(const bool isRtl, const bool absoulteItem,
-                                                  float childBottom, float childTop,
-                                                  WXCoreFlexLine *const flexLine,
-                                                  WXCoreLayoutNode *const child,
-                                                  float &childLeft, float &childRight) {
-    childLeft += child->getMarginLeft();
-    childRight -= child->getMarginRight();
-    if (mCssStyle->mFlexWrap == kWrapReverse) {
-      if (isRtl) {
-        layoutSingleChildHorizontal(child,
-                                    flexLine,
-                                    mCssStyle->mFlexWrap,
-                                    mCssStyle->mAlignItems,
-                                    childRight - child->mLayoutResult->mLayoutSize.width,
-                                    childBottom - child->mLayoutResult->mLayoutSize.height,
-                                    childRight,
-                                    childBottom,
-                                    absoulteItem);
-      } else {
-        layoutSingleChildHorizontal(child,
-                                    flexLine,
-                                    mCssStyle->mFlexWrap,
-                                    mCssStyle->mAlignItems,
-                                    childLeft,
-                                    childBottom - child->mLayoutResult->mLayoutSize.height,
-                                    childLeft + child->mLayoutResult->mLayoutSize.width,
-                                    childBottom,
-                                    absoulteItem);
-      }
-    } else {
-      if (isRtl) {
-        layoutSingleChildHorizontal(child, flexLine, mCssStyle->mFlexWrap, mCssStyle->mAlignItems,
-                                    childRight - child->mLayoutResult->mLayoutSize.width, childTop,
-                                    childRight, childTop + child->mLayoutResult->mLayoutSize.height,
-                                    absoulteItem);
-      } else {
-        layoutSingleChildHorizontal(child, flexLine, mCssStyle->mFlexWrap, mCssStyle->mAlignItems,
-                                    childLeft, childTop,
-                                    childLeft + child->mLayoutResult->mLayoutSize.width,
-                                    childTop + child->mLayoutResult->mLayoutSize.height,
-                                    absoulteItem);
-      }
-    }
-  }
-
-  /**
-   * Place a single View when the layout direction is horizontal ({@link #mFlexDirection} is
-   * either {@link WXCoreFlexDirection #WXCore_Flex_Direction_Row} or
-   * {@link WXCoreFlexDirection #WXCore_Flex_Direction_Row_REVERSE}).
-   *
-   * @param node       the View to be placed
-   * @param flexLine   the {@link WXCoreFlexLine} where the View belongs to
-   * @param flexWrap   the flex wrap attribute of this BasicLayoutNode
-   * @param alignItems the align items attribute of this BasicLayoutNode
-   * @param left       the mStyleLeft position of the View, which the View's margin is already taken
-   *                   into account
-   * @param top        the mStyleTop position of the flex line where the View belongs to. The actual
-   *                   View's mStyleTop position is shifted depending on the flexWrap and alignItems
-   *                   attributes
-   * @param right      the mStyleRight position of the View, which the View's margin is already taken
-   *                   into account
-   * @param bottom     the mStyleBottom position of the flex line where the View belongs to. The actual
-   *                   View's mStyleBottom position is shifted depending on the flexWrap and alignItems
-   *                   attributes
-   */
-  void WXCoreLayoutNode::layoutSingleChildHorizontal(WXCoreLayoutNode *const node, WXCoreFlexLine* const flexLine,
-                                                     const WXCoreFlexWrap flexWrap, WXCoreAlignItems alignItems,
-                                                     const float left, const float top, const float right, const float bottom, const bool absoluteFlexItem) {
-    if (node->mCssStyle->mAlignSelf != kAlignSelfAuto) {
-      // Expecting the values for alignItems and alignSelf match except for ALIGN_SELF_AUTO.
-      // Assigning the alignSelf value as alignItems should work.
-      alignItems = static_cast<WXCoreAlignItems>(node->mCssStyle->mAlignSelf);
-    }
-
-    float crossSize = flexLine->mCrossSize;
-
-    switch (alignItems) {
-      case kAlignItemsFlexStart:
-      case kAlignItemsStretch:
-        if (flexWrap != kWrapReverse) {
-          node->layout(left, top + node->getMarginTop(), right, bottom + node->getMarginTop(), absoluteFlexItem);
-        } else {
-          node->layout(left, top - node->getMarginBottom(), right, bottom - node->getMarginBottom(), absoluteFlexItem);
-        }
-        break;
-      case kAlignItemsFlexEnd:
-        if (flexWrap != kWrapReverse) {
-          node->layout(left,
-                       top + crossSize - node->mLayoutResult->mLayoutSize.height - node->getMarginBottom(),
-                       right, top + crossSize - node->getMarginBottom(), absoluteFlexItem);
-        } else {
-          // If the flexWrap == FLEX_WRAP_WRAP_REVERSE, the direction of the
-          // flexEnd is flipped (from mStyleTop to mStyleBottom).
-          node->layout(left, top - crossSize + node->mLayoutResult->mLayoutSize.height + node->getMarginTop(),
-                       right, bottom - crossSize + node->mLayoutResult->mLayoutSize.height + node->getMarginTop(), absoluteFlexItem);
-        }
-        break;
-      case kAlignItemsCenter:
-        float topFromCrossAxis = (crossSize - node->mLayoutResult->mLayoutSize.height
-                                  + node->getMarginTop() - node->getMarginBottom()) / 2;
-        if (flexWrap != kWrapReverse) {
-          node->layout(left, top + topFromCrossAxis,
-                       right, top + topFromCrossAxis + node->mLayoutResult->mLayoutSize.height, absoluteFlexItem);
-        } else {
-          node->layout(left, top - topFromCrossAxis,
-                       right, top - topFromCrossAxis + node->mLayoutResult->mLayoutSize.height, absoluteFlexItem);
-        }
-        break;
-    }
-  }
-
-  /**
-   * Sub method for {@link WXCoreLayoutNode #onLayout(int, int, int, int)} when the
-   * {@link #mFlexDirection} is either {@link WXCoreFlexDirection #WXCore_Flex_Direction_Column} or
-   * {@link WXCoreFlexDirection #WXCore_Flex_Direction_Column_Reverse}.
-   *
-   * @param isRtl           {@code true} if the horizontal layout direction is mStyleRight to mStyleLeft,
-   *                        {@code false}
-   *                        otherwise
-   * @param fromBottomToTop {@code true} if the layout direction is mStyleBottom to mStyleTop, {@code false}
-   *                        otherwise
-   * @param left            the mStyleLeft position of this View
-   * @param top             the mStyleTop position of this View
-   * @param right           the mStyleRight position of this View
-   * @param bottom          the mStyleBottom position of this View
-   */
-  void
-  WXCoreLayoutNode::layoutVertical(const bool isRtl,
-                                   const bool fromBottomToTop,
-                                   const float left, const float top,
-                                   const float right, const float bottom,
-                                   WXCoreLayoutNode *const absoulteItem,
-                                   WXCoreFlexLine *const flexLine) {
-    float childLeft = getPaddingLeft() + getBorderWidthLeft();
-    Index currentViewIndex = 0;
-    float width = right - left;
-    float height = bottom - top;
-
-    // childRight is used if the mFlexWrap is FLEX_WRAP_WRAP_REVERSE otherwise
-    // childLeft is used to align the horizontal position of the children views.
-    float childRight = width - getPaddingRight() - getBorderWidthRight();
-
-    // Use float to reduce the round error that may happen in when justifyContent ==
-    // SPACE_BETWEEN or SPACE_AROUND
-    float childTop, childBottom;
-    const std::vector<WXCoreFlexLine*> &lines = (flexLine == nullptr? mFlexLines: std::vector<WXCoreFlexLine*>{flexLine});
-
-    for (WXCoreFlexLine *flexLine : lines) {
-      float spaceBetweenItem = 0.f;
-      layoutFlexlineVertical(height, flexLine, childTop, childBottom, spaceBetweenItem);
-      spaceBetweenItem = std::max(spaceBetweenItem, 0.f);
-      if(absoulteItem == nullptr) {
-        for (Index j = 0; j < flexLine->mItemCount; j++) {
-          WXCoreLayoutNode *child = getChildAt(kNonBFC, currentViewIndex);
-          if (child == nullptr) {
-            continue;
-          }
-          layoutSingleChildVertical(isRtl, fromBottomToTop, false,
-                                    childLeft, childRight, flexLine,
-                                    child, childTop, childBottom);
-          childTop += child->mLayoutResult->mLayoutSize.height + spaceBetweenItem + child->getMarginBottom();
-          childBottom -= child->mLayoutResult->mLayoutSize.height + spaceBetweenItem + child->getMarginTop();
-          currentViewIndex++;
-        }
-        childLeft += flexLine->mCrossSize;
-        childRight -= flexLine->mCrossSize;
-      }
-      else{
-        layoutSingleChildVertical(isRtl, fromBottomToTop, true,
-                                  childLeft, childRight, flexLine,
-                                  absoulteItem, childTop, childBottom);
-      }
-    }
-  }
-
-  void WXCoreLayoutNode::layoutFlexlineVertical(const float height,
-                            const WXCoreFlexLine *const flexLine,
-                            float &childTop,
-                            float &childBottom,
-                            float &spaceBetweenItem) const {
-    Index visibleCount, visibleItem;
-    float denominator;
-    switch (mCssStyle->mJustifyContent) {
-      case kJustifyFlexEnd:
-        childTop = height - flexLine->mMainSize - getPaddingBottom() - getBorderWidthBottom();
-        childBottom = height - getPaddingTop() - getBorderWidthTop();
-        break;
-      case kJustifyCenter:
-        childTop = (height - flexLine->mMainSize - mCssStyle->sumPaddingBorderOfEdge(kBottom)
-            + mCssStyle->sumPaddingBorderOfEdge(kTop)) / 2;
-        childBottom = childTop + flexLine->mMainSize;
-        break;
-      case kJustifySpaceAround:
-        visibleCount = flexLine->mItemCount;
-        if (visibleCount != 0) {
-          spaceBetweenItem = (height - flexLine->mMainSize - sumPaddingBorderAlongAxis(this, false))
-              / visibleCount;
-        }
-        childTop = getPaddingTop() + getBorderWidthTop() + spaceBetweenItem / 2;
-        childBottom = height - getPaddingBottom() - getBorderWidthBottom() - spaceBetweenItem / 2;
-        break;
-      case kJustifySpaceBetween:
-        childTop = getPaddingTop() + getBorderWidthTop();
-        visibleItem = flexLine->mItemCount;
-        denominator = visibleItem != 1 ? visibleItem - 1 : 1.f;
-        spaceBetweenItem =
-            (height - flexLine->mMainSize - sumPaddingBorderAlongAxis(this, false)) / denominator;
-        childBottom = height - getPaddingBottom() - getBorderWidthBottom();
-        break;
-      case kJustifyFlexStart:
-      default:
-        childTop = getPaddingTop() + getBorderWidthTop();
-        childBottom = height - getPaddingBottom() - getBorderWidthBottom();
-        break;
-    }
-  }
-
-  void WXCoreLayoutNode::layoutSingleChildVertical(const bool isRtl, const bool fromBottomToTop,
-                                                   const bool absoluteFlexItem,
-                                                   const float childLeft, const float childRight,
-                                                   WXCoreFlexLine *const flexLine,
-                                                   WXCoreLayoutNode *const child,
-                                                   float &childTop, float &childBottom) {
-    childTop += child->getMarginTop();
-    childBottom -= child->getMarginBottom();
-    if (isRtl) {
-      if (fromBottomToTop) {
-        layoutSingleChildVertical(child, flexLine, true,
-                                  mCssStyle->mAlignItems,
-                                  childRight - child->mLayoutResult->mLayoutSize.width,
-                                  childBottom - child->mLayoutResult->mLayoutSize.height,
-                                  childRight, childBottom, absoluteFlexItem);
-      } else {
-        layoutSingleChildVertical(child, flexLine, true, mCssStyle->mAlignItems,
-                                  childRight - child->mLayoutResult->mLayoutSize.width, childTop,
-                                  childRight, childTop + child->mLayoutResult->mLayoutSize.height,
-                                  absoluteFlexItem);
-      }
-    } else {
-      if (fromBottomToTop) {
-        layoutSingleChildVertical(child, flexLine, false, mCssStyle->mAlignItems,
-                                  childLeft, childBottom - child->mLayoutResult->mLayoutSize.height,
-                                  childLeft + child->mLayoutResult->mLayoutSize.width, childBottom,
-                                  absoluteFlexItem);
-      } else {
-        layoutSingleChildVertical(child, flexLine, false, mCssStyle->mAlignItems,
-                                  childLeft, childTop,
-                                  childLeft + child->mLayoutResult->mLayoutSize.width,
-                                  childTop + child->mLayoutResult->mLayoutSize.height,
-                                  absoluteFlexItem);
-      }
-    }
-  }
-
-  /**
-   * Place a single View when the layout direction is vertical ({@link #mFlexDirection} is
-   * either {@link WXCoreFlexDirection #WXCore_Flex_Direction_Column} or
-   * {@link WXCoreFlexDirection #WXCore_Flex_Direction_Column_Reverse}).
-   *
-   * @param node       the View to be placed
-   * @param flexLine   the {@link FlexLine} where the View belongs to
-   * @param isRtl      {@code true} if the layout direction is mStyleRight to mStyleLeft, {@code false}
-   *                   otherwise
-   * @param alignItems the align items attribute of this BasicLayoutNode
-   * @param left       the mStyleLeft position of the flex line where the View belongs to. The actual
-   *                   View's mStyleLeft position is shifted depending on the isRtl and alignItems
-   *                   attributes
-   * @param top        the mStyleTop position of the View, which the View's margin is already taken
-   *                   into account
-   * @param right      the mStyleRight position of the flex line where the View belongs to. The actual
-   *                   View's mStyleRight position is shifted depending on the isRtl and alignItems
-   *                   attributes
-   * @param bottom     the mStyleBottom position of the View, which the View's margin is already taken
-   *                   into account
-   */
-  void WXCoreLayoutNode::layoutSingleChildVertical(WXCoreLayoutNode* const node, WXCoreFlexLine* const flexLine, const bool isRtl,
-                                                   WXCoreAlignItems alignItems, const float left, const float top, const float right,
-                                                   const float bottom, const bool absoluteFlexItem) {
-    if (node->mCssStyle->mAlignSelf != kAlignSelfAuto) {
-      // Expecting the values for alignItems and alignSelf match except for ALIGN_SELF_AUTO.
-      // Assigning the alignSelf value as alignItems should work.
-      alignItems = static_cast<WXCoreAlignItems>(node->mCssStyle->mAlignSelf);
-    }
-
-    float crossSize = flexLine->mCrossSize;
-
-    switch (alignItems) {
-      case kAlignItemsFlexStart:
-      case kAlignItemsStretch:
-        if (!isRtl) {
-          node->layout(left + node->getMarginLeft(), top, right + node->getMarginLeft(), bottom, absoluteFlexItem);
-        } else {
-          node->layout(left - node->getMarginRight(), top, right - node->getMarginRight(), bottom, absoluteFlexItem);
-        }
-        break;
-      case kAlignItemsFlexEnd:
-        if (!isRtl) {
-          node->layout(left + crossSize - node->mLayoutResult->mLayoutSize.width - node->getMarginRight(),
-                       top, right + crossSize - node->mLayoutResult->mLayoutSize.width - node->getMarginRight(),
-                       bottom, absoluteFlexItem);
-        } else {
-          // If the flexWrap == FLEX_WRAP_WRAP_REVERSE, the direction of the
-          // flexEnd is flipped (from mStyleLeft to mStyleRight).
-          node->layout(left - crossSize + node->mLayoutResult->mLayoutSize.width + node->getMarginLeft(), top,
-                       right - crossSize + node->mLayoutResult->mLayoutSize.width + node->getMarginLeft(),
-                       bottom, absoluteFlexItem);
-        }
-        break;
-      case kAlignItemsCenter:
-        float leftFromCrossAxis = (crossSize - node->mLayoutResult->mLayoutSize.width
-                                   + node->getMarginLeft()
-                                   - node->getMarginRight()) / 2.f;
-        if (!isRtl) {
-          node->layout(left + leftFromCrossAxis, top, right + leftFromCrossAxis, bottom, absoluteFlexItem);
-        } else {
-          node->layout(left - leftFromCrossAxis, top, right - leftFromCrossAxis, bottom, absoluteFlexItem);
-        }
-        break;
-    }
-  }
-}
-
-
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXCoreLayout.h b/ios/sdk/WeexSDK/Sources/Layout/WXCoreLayout.h
deleted file mode 100644
index e1827c5688..0000000000
--- a/ios/sdk/WeexSDK/Sources/Layout/WXCoreLayout.h
+++ /dev/null
@@ -1,1122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#ifdef __cplusplus
-
-#ifndef WEEXCORE_FLEXLAYOUT_WXCORELAYOUTNODE_H
-#define WEEXCORE_FLEXLAYOUT_WXCORELAYOUTNODE_H
-
-#include "WXCoreStyle.h"
-#include "WXCoreFlexEnum.h"
-#include <vector>
-#include <iostream>
-#include <string>
-#include <algorithm>
-#include <cfloat>
-
-namespace WeexCore {
-
-  class WXCoreLayoutNode;
-
-  class WXCoreFlexLine;
-
-  enum FormattingContext {
-    kBFC,
-    kNonBFC,
-  } ;
-
-  enum MeasureMode {
-    kUnspecified,
-    kExactly,
-  } ;
-
-  struct WXCoreSize {
-   private:
-    float hypotheticalWidth;
-    float hypotheticalHeight;
-   public:
-    friend class WXCoreLayoutNode;
-    float width;
-    float height;
-
-    WXCoreSize() : hypotheticalWidth(NAN),
-                   hypotheticalHeight(NAN),
-                   width(0), height(0) {}
-
-    inline void reset() {
-      hypotheticalWidth = NAN ;
-      hypotheticalHeight = NAN;
-      width = 0;
-      height = 0;
-    }
-
-    inline bool isNAN() {
-      return isnan(width) || isnan(height);
-    }
-  };
-
-  /**
-   * layout-result:layout-height、layout-width、position(left、right、top、bottom)
-   */
-  struct WXCorelayoutResult {
-    WXCoreSize mLayoutSize;
-    WXCorePosition mLayoutPosition;
-
-    inline bool isNAN() {
-      return mLayoutSize.isNAN() || mLayoutPosition.isNAN();
-    }
-
-    inline void reset() {
-      mLayoutSize.reset();
-      mLayoutPosition.reset();
-    }
-  };
-
-  typedef WXCoreSize(*WXCoreMeasureFunc)(WXCoreLayoutNode *node, float width,
-                                         MeasureMode widthMeasureMode,
-                                         float height, MeasureMode heightMeasureMode);
-
-  using Index = std::vector<WXCoreLayoutNode *>::size_type;
-
-  /**
-   * flie line
-   */
-  class WXCoreFlexLine {
-  public:
-    float mMainSize;
-
-    float mCrossSize;
-
-    Index mItemCount;
-
-    float mTotalFlexGrow;
-
-    float mTotalFlexibleSize;
-
-    /**
-     * Store the indices of the children views whose mAlignSelf property is stretch.
-     * The stored indices are the absolute indices including all children in the Flexbox,
-     * not the relative indices in this flex line.
-     */
-    std::vector<Index> mIndicesAlignSelfStretch;
-
-    WXCoreFlexLine() : mMainSize(0),
-                       mCrossSize(0),
-                       mItemCount(0),
-                       mTotalFlexGrow(0),
-                       mTotalFlexibleSize(0) {
-    }
-
-    ~WXCoreFlexLine() {
-      mMainSize = 0;
-      mCrossSize = 0;
-      mItemCount = 0;
-      mTotalFlexGrow = 0;
-      mTotalFlexibleSize = 0;
-      mIndicesAlignSelfStretch.clear();
-    }
-  };
-
-  /**
-   * Layout node
-   */
-  class WXCoreLayoutNode {
-
-  public:
-      WXCoreLayoutNode() :
-              mParent(nullptr),
-              dirty(true),
-              widthDirty{false},
-              heightDirty{false},
-              mHasNewLayout(true),
-              mIsDestroy(false),
-              measureFunc(nullptr) {
-        mCssStyle = new WXCoreCSSStyle();
-        mLayoutResult = new WXCorelayoutResult();
-      }
-
-
-      ~WXCoreLayoutNode() {
-          mIsDestroy = true;
-        mHasNewLayout = true;
-        dirty = true;
-        measureFunc = nullptr;
-        if(nullptr != mParent){
-            mParent->removeChild(this);
-        }
-        mParent = nullptr;
-        for(WXCoreLayoutNode* childNode : mChildList){
-            if(nullptr != childNode){
-                childNode->mParent = nullptr;
-            }
-        }
-        
-        mChildList.clear();
-        BFCs.clear();
-        NonBFCs.clear();
-        mChildrenFrozen.clear();
-
-        for (WXCoreFlexLine *flexLine : mFlexLines) {
-          if (flexLine != nullptr) {
-            delete flexLine;
-            flexLine = nullptr;
-          }
-        }
-        mFlexLines.clear();
-
-        if (mCssStyle != nullptr) {
-          delete mCssStyle;
-          mCssStyle = nullptr;
-        }
-
-        if (mLayoutResult != nullptr) {
-          delete mLayoutResult;
-          mLayoutResult = nullptr;
-        }
-      }
-
-  private:
-
-    /**
-     * Holds the 'frozen' state of children during measure. If a view is frozen it will no longer
-     * expand regardless of mFlexGrow. Items are indexed by the child's
-     * reordered index.
-     */
-    std::vector<bool> mChildrenFrozen;
-
-    std::vector<WXCoreFlexLine *> mFlexLines;
-
-    std::vector<WXCoreLayoutNode *> mChildList;
-
-    std::vector<WXCoreLayoutNode *> BFCs;
-
-    std::vector<WXCoreLayoutNode *> NonBFCs;
-
-    WXCoreLayoutNode *mParent = nullptr;
-
-    WXCoreCSSStyle *mCssStyle = nullptr;
-
-    MeasureMode widthMeasureMode = kUnspecified;
-
-    MeasureMode heightMeasureMode = kUnspecified;
-
-    WXCorelayoutResult *mLayoutResult = nullptr;
-
-    WXCorePosition *absoultePositon = nullptr;
-
-    bool mHasNewLayout;
-
-    bool dirty, widthDirty, heightDirty;
-
-    bool mIsDestroy = true;
-
-    WXCoreMeasureFunc measureFunc = nullptr;
-
-    void *context;
-
-    /** ================================ Cache:Last calculate result =================================== **/
-
-  public:
-
-
-    /** ================================ Engine Entry Function =================================== **/
-
-    void calculateLayout(const std::pair<float,float>&);
-
-    /** ================================ measureFunc =================================== **/
-
-    inline void setMeasureFunc(WXCoreMeasureFunc measure) {
-      measureFunc = measure;
-      markDirty();
-    }
-
-    inline WXCoreMeasureFunc getMeasureFunc() const {
-      return measureFunc;
-    }
-
-    inline bool haveMeasureFunc() const {
-      return measureFunc != nullptr;
-    }
-
-    /** ================================ context =================================== **/
-
-
-    inline void *getContext() const {
-      return context;
-    }
-
-    inline void setContext(void * const context) {
-      this->context = context;
-    }
-
-    inline void copyStyle(WXCoreLayoutNode *srcNode) {
-      if (memcmp(mCssStyle, srcNode->mCssStyle, sizeof(WXCoreCSSStyle)) != 0) {
-        memcpy(mCssStyle, srcNode->mCssStyle, sizeof(WXCoreCSSStyle));
-        markDirty();
-      }
-    }
-
-    inline void copyMeasureFunc(WXCoreLayoutNode *srcNode) {
-      if (memcmp(&measureFunc, &srcNode->measureFunc, sizeof(WXCoreMeasureFunc)) != 0) {
-        memcpy(&measureFunc, &srcNode->measureFunc, sizeof(WXCoreMeasureFunc));
-        markDirty();
-      }
-    }
-
-  private:
-
-    /** ================================ measure =================================== **/
-
-    inline void reset() {
-      if (isDirty()) {
-        //todo tmp solution if mLayoutResult is nil (mutil thread ?)
-        if (nullptr == mLayoutResult) {
-            mLayoutResult = new WXCorelayoutResult();
-        }
-        mLayoutResult->reset();
-        for (WXCoreFlexLine *flexLine : mFlexLines) {
-          if (flexLine != nullptr) {
-            delete flexLine;
-            flexLine = nullptr;
-          }
-        }
-        mFlexLines.clear();
-
-        mChildrenFrozen.assign(getChildCount(kNonBFC), false);
-      }
-      widthMeasureMode = isnan(mCssStyle->mStyleWidth) ? kUnspecified : kExactly;
-      heightMeasureMode = isnan(mCssStyle->mStyleHeight) ? kUnspecified : kExactly;
-    }
-
-    inline void setLayoutWidth(const float width) {
-      if (mLayoutResult->mLayoutSize.width != width &&
-          (!isnan(width) || !isnan(mLayoutResult->mLayoutSize.width))) {
-        mLayoutResult->mLayoutSize.width = width;
-        widthDirty = true;
-        markDirty(false);
-      }
-    }
-
-    inline void setLayoutHeight(const float height) {
-      if (mLayoutResult->mLayoutSize.height != height &&
-          (!isnan(height) || !isnan(mLayoutResult->mLayoutSize.height))) {
-        mLayoutResult->mLayoutSize.height = height;
-        heightDirty = true;
-        markDirty(false);
-      }
-    }
-
-    inline void setWidthMeasureMode(const MeasureMode measureMode) {
-      if (widthMeasureMode != measureMode) {
-        widthMeasureMode = measureMode;
-        if (getChildCount(kNonBFC) > 0) {
-          widthDirty = true;
-        }
-      }
-    }
-
-    inline void setHeightMeasureMode(const MeasureMode measureMode) {
-      if (heightMeasureMode != measureMode) {
-        heightMeasureMode = measureMode;
-        if (getChildCount(kNonBFC) > 0) {
-          heightDirty = true;
-        }
-      }
-    }
-
-    inline float firstLineCrossSize() const {
-      float sum = sumPaddingBorderAlongAxis(this, !isMainAxisHorizontal(this));
-      if (!mFlexLines.empty()) {
-        sum += mFlexLines[0]->mCrossSize;
-      }
-      return sum;
-    }
-
-    inline float getSumOfCrossSize() const {
-      float sum = sumPaddingBorderAlongAxis(this, !isMainAxisHorizontal(this));
-      for (WXCoreFlexLine *flexLine: mFlexLines) {
-        sum += flexLine->mCrossSize;
-      }
-      return sum;
-    }
-
-    inline bool isMainAxisHorizontal(const WXCoreLayoutNode* const node) const {
-      return node->mCssStyle->mFlexDirection == kFlexDirectionRow ||
-             node->mCssStyle->mFlexDirection == kFlexDirectionRowReverse;
-    }
-
-    inline bool isCrossExactly() const {
-      return isMainAxisHorizontal(this) ? heightMeasureMode == kExactly
-                                        : widthMeasureMode == kExactly;
-    }
-
-    inline float sumPaddingBorderAlongAxis(const WXCoreLayoutNode* const node, bool horizontal) const {
-      float paddingBorderAlongAxis;
-      if (horizontal) {
-        paddingBorderAlongAxis =
-            node->mCssStyle->mPadding.getPadding(kPaddingLeft) +
-            node->mCssStyle->mPadding.getPadding(kPaddingRight) +
-            node->mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthLeft) +
-            node->mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthRight);
-      } else {
-        paddingBorderAlongAxis =
-            node->mCssStyle->mPadding.getPadding(kPaddingTop) +
-            node->mCssStyle->mPadding.getPadding(kPaddingBottom) +
-            node->mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthTop) +
-            node->mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthBottom);
-      }
-      return paddingBorderAlongAxis;
-    }
-
-    inline bool isWrapRequired(const float &width, const float &height,
-                             const float &currentLength, const float &childLength) const {
-        float freeMainSize = calcFreeSpaceAlongMainAxis(width, height, currentLength);
-        return !isSingleFlexLine(freeMainSize)
-        && freeMainSize < childLength
-        && !almostEqualRelative(childLength,freeMainSize);          //childLength is bigger than freeMainSize but not almost equal (precision)
-    }
-      
-    inline bool almostEqualRelative(const float A, const float B) const{
-        float maxRelDiff = FLT_EPSILON;
-        // Calculate the difference.
-        float diff = std::fabs(A - B);
-        float absA = std::fabs(A);
-        float absB = std::fabs(B);
-        // Find the largest
-        float largest = (absB > absA) ? absB : absA;
-      
-        if (diff <= largest * maxRelDiff) return true;
-        return false;
-    }
-
-    //If width/height is NAN, ret is NAN, which property we use on purpose.
-    virtual float calcFreeSpaceAlongMainAxis(const float &width, const float &height, const float &currentLength) const{
-      float ret;
-      if(isMainAxisHorizontal(this)){
-        ret = width - sumPaddingBorderAlongAxis(this, true) - currentLength;
-      }
-      else{
-        ret = height - sumPaddingBorderAlongAxis(this, false) - currentLength;
-      }
-      return ret;
-    }
-
-    inline bool isSingleFlexLine(const float &mainSize) const {
-      return mCssStyle->mFlexWrap == kNoWrap || isnan(mainSize);
-    }
-
-    inline void sumFlexGrow(const WXCoreLayoutNode* const child, WXCoreFlexLine* const flexLine, Index i){
-      if (child->mCssStyle->mFlexGrow > 0) {
-        flexLine->mTotalFlexGrow += child->mCssStyle->mFlexGrow;
-        mChildrenFrozen[i] = false;
-        if (isMainAxisHorizontal(this)) {
-          if (!isnan(child->mLayoutResult->mLayoutSize.hypotheticalWidth)) {
-            flexLine->mTotalFlexibleSize += child->mLayoutResult->mLayoutSize.hypotheticalWidth;
-          }
-        } else {
-          if (!isnan(child->mLayoutResult->mLayoutSize.hypotheticalHeight)) {
-            flexLine->mTotalFlexibleSize += child->mLayoutResult->mLayoutSize.hypotheticalHeight;
-          }
-        }
-      } else {
-        mChildrenFrozen[i] = true;
-      }
-    }
-
-    inline void setMeasuredDimensionForFlex(
-        const float width, const MeasureMode widthMeasureMode,
-        const float height, const MeasureMode heightMeasureMode){
-      float actualWidth, actualHeight;
-      if (isMainAxisHorizontal(this)) {
-        actualWidth = widthMeasureMode == kExactly ? width : getLargestMainSize();
-        actualHeight = heightMeasureMode == kExactly ? height : getSumOfCrossSize();
-      } else {
-        actualHeight = heightMeasureMode == kExactly ? height : getLargestMainSize();
-        actualWidth = widthMeasureMode == kExactly ? width : firstLineCrossSize();
-      }
-      setMeasuredDimension(actualWidth, actualHeight);
-    }
-
-    inline float calcItemSizeAlongAxis(const WXCoreLayoutNode* const node, const bool horizontal, const bool useHypotheticalSize = false) const {
-      float ret;
-      if (horizontal) {
-        ret = node->mCssStyle->mMargin.getMargin(kMarginLeft) +
-            node->mCssStyle->mMargin.getMargin(kMarginRight);
-        ret += useHypotheticalSize ? node->mLayoutResult->mLayoutSize.hypotheticalWidth
-                                   : node->mLayoutResult->mLayoutSize.width;
-      } else {
-        ret = node->mCssStyle->mMargin.getMargin(kMarginTop) +
-            node->mCssStyle->mMargin.getMargin(kMarginBottom);
-        ret += useHypotheticalSize ? node->mLayoutResult->mLayoutSize.hypotheticalHeight
-                                   : node->mLayoutResult->mLayoutSize.height;
-      }
-      return ret;
-    }
-
-    inline void limitMainSizeForFlexGrow(WXCoreFlexLine* const flexLine, const Index childIndex,
-                                  const float flexGrow) {
-      mChildrenFrozen[childIndex] = true;
-      flexLine->mTotalFlexGrow -= flexGrow;
-    }
-
-    inline void setMeasuredDimension(const float width, const float height) {
-      mLayoutResult->mLayoutSize.width = width;
-      mLayoutResult->mLayoutSize.height = height;
-    }
-
-    inline std::pair<bool, float> limitChildMainSize(WXCoreFlexLine* const flexLine, const WXCoreLayoutNode* const child,
-                                                                       float childSizeAlongMainAxis, const Index childIndex){
-      bool needsReexpand = false;
-      if (isMainAxisHorizontal(this)) {
-        if (!isnan(child->mCssStyle->mMaxWidth) &&
-            childSizeAlongMainAxis > child->mCssStyle->mMaxWidth) {
-          needsReexpand = true;
-          childSizeAlongMainAxis = child->mCssStyle->mMaxWidth;
-        } else if (!isnan(child->mCssStyle->mMinWidth) &&
-            childSizeAlongMainAxis < child->mCssStyle->mMinWidth) {
-          needsReexpand = true;
-          childSizeAlongMainAxis = child->mCssStyle->mMinWidth;
-        }
-      } else {
-        if (!isnan(child->mCssStyle->mMaxHeight) &&
-            childSizeAlongMainAxis > child->mCssStyle->mMaxHeight) {
-          needsReexpand = true;
-          childSizeAlongMainAxis = child->mCssStyle->mMaxHeight;
-        } else if (!isnan(child->mCssStyle->mMinHeight) &&
-            childSizeAlongMainAxis < child->mCssStyle->mMinHeight) {
-          needsReexpand = true;
-          childSizeAlongMainAxis = child->mCssStyle->mMinHeight;
-        }
-      }
-      limitMainSizeForFlexGrow(flexLine, childIndex, child->mCssStyle->mFlexGrow);
-      return std::make_pair(needsReexpand, childSizeAlongMainAxis);
-    }
-
-    void updateLeftRightForAbsolute(float &left, float &right,
-                                    const WXCorePadding &parentPadding,
-                                    const WXCoreBorderWidth &parentBorder,
-                                    const WXCoreSize &parentSize) const {
-      if (isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft))) {
-        if (isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeRight))) {
-          ;
-        } else {
-          right += parentSize.width -
-              (parentBorder.getBorderWidth(kBorderWidthRight) +
-                  mCssStyle->mStylePosition.getPosition(kPositionEdgeRight)
-                  + mLayoutResult->mLayoutSize.width);
-          left += parentSize.width -
-              (parentBorder.getBorderWidth(kBorderWidthRight) +
-                  mCssStyle->mStylePosition.getPosition(kPositionEdgeRight)
-                  + mLayoutResult->mLayoutSize.width);
-        }
-      } else {
-        left += parentBorder.getBorderWidth(kBorderWidthLeft) +
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft);
-        right += parentBorder.getBorderWidth(kBorderWidthLeft) +
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft);
-      }
-    }
-
-    void updateTopBottomForAbsolute(float &top, float &bottom,
-                                    const WXCorePadding &parentPadding,
-                                    const WXCoreBorderWidth &parentBorder,
-                                    const WXCoreSize &parentSize) const {
-      if (isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeTop))) {
-        if (isnan(mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom))) {
-          ;
-        } else {
-          top += parentSize.height -
-              (parentBorder.getBorderWidth(kBorderWidthBottom) +
-                  mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom)
-                  + mLayoutResult->mLayoutSize.height);
-          bottom += parentSize.height -
-              (parentBorder.getBorderWidth(kBorderWidthBottom) +
-                  mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom)
-                  + mLayoutResult->mLayoutSize.height);
-        }
-      } else {
-        top += parentBorder.getBorderWidth(kBorderWidthTop) +
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeTop);
-        bottom += parentBorder.getBorderWidth(kBorderWidthTop) +
-            mCssStyle->mStylePosition.getPosition(kPositionEdgeTop);
-      }
-    }
-
-    /** ================================ other =================================== **/
-
-    inline void clearDirty() {
-      dirty = false;
-      widthDirty = false;
-      heightDirty = false;
-    }
-
-    void
-    measure(float, float, bool);
-
-    void hypotheticalMeasure(float, float, bool = false);
-
-    void measureLeafNode(float, float, bool, bool);
-
-    void measureInternalNode(float, float, bool, bool);
-
-    void updateCurrentFlexline(Index, WXCoreFlexLine *, Index, const WXCoreLayoutNode *, bool);
-
-    void measureChild(WXCoreLayoutNode* , float, float, float, bool, bool);
-
-    void adjustChildSize(WXCoreLayoutNode *, float);
-
-    void adjustChildSize(const WXCoreLayoutNode *child,
-                         const float currentMainSize,
-                         const float parentWidth,
-                         const float parentHeight,
-                         float &childWidth,
-                         float &childHeight) const;
-
-    void stretchViewCrossSize();
-
-    void stretchViewCrossSize(WXCoreLayoutNode *, float);
-
-    Index expandItemsInFlexLine(WXCoreFlexLine *, float, Index);
-
-    void checkSizeConstraints(WXCoreLayoutNode *, bool);
-
-    void
-    determineMainSize(float width, float height);
-
-    void
-    determineCrossSize(float, float, bool);
-
-    void setFrame(float, float, float, float);
-
-    void setFrame(WXCorePosition*,float, float, float, float);
-
-    /** ================================ layout =================================== **/
-
-    void layout(float left, float top, float right, float bottom, bool, const std::pair<float,float>* = nullptr);
-
-    void calcRelativeOffset(float &left, float &top, float &right, float &bottom) const ;
-
-    void calcAbsoluteOffset(float &left, float &top, float &right, float &bottom, const std::pair<float,float>* = nullptr);
-
-    void positionAbsoluteFlexItem(float &left, float &top, float &right, float &bottom);
-
-    void onLayout(float left, float top, float right, float bottom, WXCoreLayoutNode* = nullptr, WXCoreFlexLine *const flexLine = nullptr);
-
-    void layoutHorizontal(bool isRtl, float left, float top, float right, float bottom,
-                          WXCoreLayoutNode*, WXCoreFlexLine *const flexLine);
-
-    void layoutFlexlineHorizontal(const float width,
-                                         const WXCoreFlexLine *const flexLine,
-                                         float &childLeft,
-                                         float &childRight,
-                                         float &spaceBetweenItem) const;
-
-    void layoutSingleChildHorizontal(WXCoreLayoutNode *node, WXCoreFlexLine *flexLine,
-                                     WXCoreFlexWrap flexWrap, WXCoreAlignItems alignItems,
-                                     float, float, float, float, bool);
-
-    void layoutSingleChildHorizontal(const bool isRtl,
-                                    const bool,
-                                    float childBottom, float childTop,
-                                    WXCoreFlexLine *const flexLine,
-                                    WXCoreLayoutNode *const child,
-                                    float&, float&);
-
-    void layoutVertical(bool isRtl, bool fromBottomToTop, float left, float top, float right, float bottom,
-                        WXCoreLayoutNode*, WXCoreFlexLine *const flexLine);
-
-    void layoutFlexlineVertical(const float height,
-                                const WXCoreFlexLine *const flexLine,
-                                float &childTop,
-                                float &childBottom,
-                                float &spaceBetweenItem) const;
-    void layoutSingleChildVertical(WXCoreLayoutNode *node, WXCoreFlexLine *flexLine,
-                                   bool isRtl, WXCoreAlignItems alignItems,
-                                   float, float, float, float, bool);
-
-    void layoutSingleChildVertical(const bool isRtl, const bool fromBottomToTop,
-                                   const bool absoluteFlexItem,
-                                   const float childLeft, const float childRight,
-                                   WXCoreFlexLine *const flexLine,
-                                   WXCoreLayoutNode *const child,
-                                   float& ,float&);
-
-    void updateFlexLineForAbsoluteItem(WXCoreLayoutNode *const absoluteFlexItem, WXCoreFlexLine *const flexLine);
-
-    void initFormatingContext(std::vector<WXCoreLayoutNode *> &BFCs);
-
-    std::pair<bool,float> calculateBFCWidth(float, float);
-
-    std::pair<bool,float> calculateBFCHeight(float, float);
-
-    std::tuple<bool, float, float> calculateBFCDimension(const std::pair<float,float>&);
-
-    virtual void onLayoutBefore() {
-
-    }
-
-    virtual void onLayoutAfter(float width, float height) {
-
-    }
-
-
-  public:
-
-    /** ================================ tree =================================== **/
-
-    inline Index getChildCount(FormattingContext formattingContext) const {
-      switch (formattingContext) {
-        case kNonBFC:
-          return NonBFCs.size();
-        case kBFC:
-          return BFCs.size();
-        default:
-          return mChildList.size();
-      }
-    }
-
-    inline Index getChildCount() const {
-      return mChildList.size();
-    }
-
-    inline std::vector<WXCoreLayoutNode *>::const_iterator ChildListIterBegin() {
-      return mChildList.cbegin();
-    }
-
-    inline std::vector<WXCoreLayoutNode *>::const_iterator ChildListIterEnd() {
-      return mChildList.cend();
-    }
-
-    inline void removeChild(WXCoreLayoutNode* const child) {
-      for (int index = 0; index < mChildList.size(); index++) {
-        if (child == mChildList[index]) {
-          child->mParent = nullptr;
-          mChildList.erase(mChildList.begin() + index);
-          break;
-        }
-      }
-      markDirty();
-    }
-
-    inline void addChildAt(WXCoreLayoutNode* const child, Index index) {
-      mChildList.insert(mChildList.begin() + index, child);
-      child->mParent = this;
-      markDirty();
-    }
-
-    inline WXCoreLayoutNode *getChildAt(const FormattingContext formattingContext, const Index index) const {
-      switch (formattingContext) {
-        case kNonBFC:
-          return NonBFCs[index];
-        case kBFC:
-          return BFCs[index];
-        default:
-          return mChildList[index];
-      }
-    }
-
-    inline WXCoreLayoutNode *getChildAt(const Index index) const {
-      return mChildList[index];
-    }
-
-    inline WXCoreLayoutNode *getParent() const {
-      return mParent;
-    }
-
-    inline bool isBFC(WXCoreLayoutNode* const node) const {
-      return node->mCssStyle->mPositionType == kAbsolute || node->mCssStyle->mPositionType == kFixed;
-    }
-
-    /** ================================ margin =================================== **/
-
-    inline float getMarginTop() const {
-      return mCssStyle->mMargin.getMargin(kMarginTop);
-    }
-
-    inline float getMarginBottom() const {
-      return mCssStyle->mMargin.getMargin(kMarginBottom);
-    }
-
-    inline float getMarginLeft() const  {
-      return mCssStyle->mMargin.getMargin(kMarginLeft);
-    }
-
-    inline float getMarginRight() const {
-      return mCssStyle->mMargin.getMargin(kMarginRight);
-    }
-
-    inline void setMargin(const WXCoreMarginEdge &edge, const float margin) {
-      if (mCssStyle->mMargin.setMargin(edge, margin)) {
-        markDirty();
-      }
-    }
-
-    inline const WXCoreMargin &GetMargins() const {
-      return mCssStyle->mMargin;
-    }
-
-    /** ================================ padding =================================== **/
-
-    inline float getPaddingLeft() const {
-      return mCssStyle->mPadding.getPadding(kPaddingLeft);
-    }
-
-    inline float getPaddingRight() const {
-      return mCssStyle->mPadding.getPadding(kPaddingRight);
-    }
-
-    inline float getPaddingTop() const {
-      return mCssStyle->mPadding.getPadding(kPaddingTop);
-    }
-
-    inline float getPaddingBottom() const {
-      return mCssStyle->mPadding.getPadding(kPaddingBottom);
-    }
-
-    inline void setPadding(const WXCorePaddingEdge edge, const float padding) {
-      if (mCssStyle->mPadding.setPadding(edge, padding)) {
-        markDirty();
-      }
-    }
-
-    inline const WXCorePadding &GetPaddings() const {
-      return mCssStyle->mPadding;
-    }
-
-    /** ================================ border-width =================================== **/
-
-    inline float getBorderWidthLeft() const {
-      return mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthLeft);
-    }
-
-    inline float getBorderWidthRight() const {
-      return mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthRight);
-    }
-
-    inline float getBorderWidthTop() const {
-      return mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthTop);
-    }
-
-    inline float getBorderWidthBottom() const {
-      return mCssStyle->mBorderWidth.getBorderWidth(kBorderWidthBottom);
-    }
-
-    inline void setBorderWidth(const WXCoreBorderWidthEdge edge, const float borderWidth) {
-      if (mCssStyle->mBorderWidth.setBorderWidth(edge, borderWidth)) {
-        markDirty();
-      }
-    }
-
-    inline const WXCoreBorderWidth &GetBorders() const {
-      return mCssStyle->mBorderWidth;
-    }
-
-    /** ================================ position-type =================================== **/
-
-    inline void setStylePositionType(const WXCorePositionType positionType) {
-      if (mCssStyle->mPositionType != positionType) {
-        mCssStyle->mPositionType = positionType;
-        markDirty();
-      }
-    }
-
-    inline WXCorePositionType getStypePositionType() const {
-      return mCssStyle->mPositionType;
-    }
-
-
-    /** ================================ position =================================== **/
-
-    inline float getStylePositionTop() const {
-      return mCssStyle->mStylePosition.getPosition(kPositionEdgeTop);
-    }
-
-    inline float getStylePositionBottom() const {
-      return mCssStyle->mStylePosition.getPosition(kPositionEdgeBottom);
-    }
-
-    inline float getStylePositionLeft() const {
-      return mCssStyle->mStylePosition.getPosition(kPositionEdgeLeft);
-    }
-
-    inline float getStylePositionRight() const {
-      return mCssStyle->mStylePosition.getPosition(kPositionEdgeRight);
-    }
-
-    inline void setStylePosition(const WXCorePositionEdge edge, const float positionRight) {
-      if (mCssStyle->mStylePosition.setPosition(edge, positionRight))
-        markDirty();
-    }
-
-
-    /** ================================ dimension =================================== **/
-
-    inline void setStyleWidthLevel(const DimensionLevel level) const {
-      if (mCssStyle->mStyleWidthLevel != level) {
-        mCssStyle->mStyleWidthLevel = level;
-      }
-    }
-
-    inline void setStyleHeightLevel(const DimensionLevel level) const {
-      if (mCssStyle->mStyleHeightLevel != level) {
-        mCssStyle->mStyleHeightLevel = level;
-      }
-    }
-
-    inline DimensionLevel getStyleHeightLevel() const {
-      return mCssStyle->mStyleHeightLevel;
-    }
-
-    inline DimensionLevel getStyleWidthLevel() const {
-      return mCssStyle->mStyleWidthLevel;
-    }
-
-    inline void setStyleWidth(const float width, const bool updating) {
-      if (mCssStyle->mStyleWidth != width) {
-        mCssStyle->mStyleWidth = width;
-        markDirty();
-        if(updating) {
-          markChildrenDirty(true);
-        }
-      }
-    }
-
-    inline void setStyleWidthToNAN() {
-      if (!isnan(mCssStyle->mStyleWidth)) {
-        mCssStyle->mStyleWidth = NAN;
-        markDirty();
-        markChildrenDirty(true);
-      }
-    }
-
-    inline float getStyleWidth() const {
-      return mCssStyle->mStyleWidth;
-    }
-
-    inline void setStyleHeight(const float height) {
-      if (mCssStyle->mStyleHeight != height) {
-        mCssStyle->mStyleHeight = height;
-        markDirty();
-      }
-    }
-
-    inline float getStyleHeight() const {
-      return mCssStyle->mStyleHeight;
-    }
-
-    inline void setMinWidth(const float minWidth, const bool updating) {
-      if (mCssStyle->mMinWidth != minWidth) {
-        mCssStyle->mMinWidth = minWidth;
-        markDirty();
-        if(updating) {
-          markChildrenDirty(true);
-        }
-      }
-    }
-
-    inline float getMinWidth() const {
-      return mCssStyle->mMinWidth;
-    }
-
-    inline void setMaxWidth(const float maxWidth, const bool updating) {
-      if (mCssStyle->mMaxWidth != maxWidth) {
-        mCssStyle->mMaxWidth = maxWidth;
-        markDirty();
-        if(updating) {
-          markChildrenDirty(true);
-        }
-      }
-    }
-
-    inline float getMaxWidth() const {
-      return mCssStyle->mMaxWidth;
-    }
-
-    inline void setMinHeight(const float minHeight) {
-      if (mCssStyle->mMinHeight != minHeight) {
-        mCssStyle->mMinHeight = minHeight;
-        markDirty();
-      }
-    }
-
-    inline float getMinHeight() const {
-      return mCssStyle->mMinHeight;
-    }
-
-    inline void setMaxHeight(const float maxHeight) {
-      if (mCssStyle->mMaxHeight != maxHeight) {
-        mCssStyle->mMaxHeight = maxHeight;
-        markDirty();
-      }
-    }
-
-    inline float getMaxHeight() const {
-      return mCssStyle->mMaxHeight;
-    }
-
-
-    /** ================================ flex-style =================================== **/
-
-    inline void setFlexDirection(const WXCoreFlexDirection flexDirection, const bool updating) {
-      if (mCssStyle->mFlexDirection != flexDirection) {
-        mCssStyle->mFlexDirection = flexDirection;
-        markDirty();
-        if (updating) {
-          for (auto it = ChildListIterBegin(); it != ChildListIterEnd(); it++) {
-            (*it)->markDirty(false);
-          }
-        }
-      }
-    }
-
-    inline WXCoreFlexDirection getFlexDirection() const {
-      return mCssStyle->mFlexDirection;
-    }
-
-    inline void setFlexWrap(const WXCoreFlexWrap flexWrap) {
-      if (mCssStyle->mFlexWrap != flexWrap) {
-        mCssStyle->mFlexWrap = flexWrap;
-        markDirty();
-      }
-    }
-
-    inline WXCoreFlexWrap getFlexWrap() const {
-      return mCssStyle->mFlexWrap;
-    }
-
-    inline void setJustifyContent(const WXCoreJustifyContent justifyContent) {
-      if (mCssStyle->mJustifyContent != justifyContent) {
-        mCssStyle->mJustifyContent = justifyContent;
-      }
-    }
-
-    inline WXCoreJustifyContent getJustifyContent() const {
-      return mCssStyle->mJustifyContent;
-    }
-
-    inline void setAlignItems(const WXCoreAlignItems alignItems) {
-      if (mCssStyle->mAlignItems != alignItems) {
-        mCssStyle->mAlignItems = alignItems;
-        markDirty();
-      }
-    }
-
-    inline WXCoreAlignItems getAlignItems() const {
-      return mCssStyle->mAlignItems;
-    }
-
-    inline void setAlignSelf(const WXCoreAlignSelf alignSelf) {
-      if (mCssStyle->mAlignSelf != alignSelf) {
-        mCssStyle->mAlignSelf = alignSelf;
-        markDirty();
-      }
-    }
-
-    inline WXCoreAlignSelf getAlignSelf() const {
-      return mCssStyle->mAlignSelf;
-    }
-
-    virtual void setFlex(const float flex) {
-      if (mCssStyle->mFlexGrow != flex) {
-        mCssStyle->mFlexGrow = flex;
-        markDirty();
-      }
-    }
-
-    inline float getFlex() const {
-      return mCssStyle->mFlexGrow;
-    }
-
-    /** ================================ layout-result =================================== **/
-
-    inline float getLayoutWidth() const {
-      return mLayoutResult->mLayoutSize.width;
-    }
-
-    inline float getLayoutHeight() const {
-      return mLayoutResult->mLayoutSize.height;
-    }
-
-    inline float getLayoutPositionTop() const {
-      return mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeTop);
-    }
-
-    inline float getLayoutPositionBottom() const {
-      return mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeBottom);
-    }
-
-    inline float getLayoutPositionLeft() const {
-      return mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeLeft);
-    }
-
-    inline float getLayoutPositionRight() const  {
-      return mLayoutResult->mLayoutPosition.getPosition(kPositionEdgeRight);
-    }
-
-    inline bool hasNewLayout() const {
-      return mHasNewLayout;
-    }
-
-    inline bool isDirty() const {
-      return dirty;
-    }
-
-    inline void markDirty(const bool recursion = true) {
-      if (!isDirty()) {
-        dirty = true;
-        if (getParent() != nullptr && recursion) {
-          getParent()->markDirty();
-        }
-      }
-    }
-
-    bool markChildrenDirty(const bool updatedNode = false) {
-      bool ret = false;
-      if(getChildCount() == 0){
-        if(measureFunc!= nullptr){
-          ret = true;
-        }
-      }
-      else {
-        //isnan(mCssStyle->mStyleWidth) XOR updatedNode
-        if(isnan(mCssStyle->mStyleWidth) != updatedNode){
-          for (auto it = ChildListIterBegin(); it != ChildListIterEnd(); it++) {
-            ret = ((*it)->markChildrenDirty() || ret) ;
-          }
-        }
-      }
-      dirty = ret || dirty;
-      return ret;
-    }
-
-    inline void setHasNewLayout(const bool hasNewLayout) {
-      this->mHasNewLayout = hasNewLayout;
-    }
-
-    inline float getLargestMainSize() const {
-      float largestSize = 0;
-      for (WXCoreFlexLine *flexLine : mFlexLines) {
-        largestSize = std::max(largestSize, flexLine->mMainSize);
-      }
-      return largestSize + sumPaddingBorderAlongAxis(this, isMainAxisHorizontal(this));
-    }
-  };
-}
-#endif //WEEXCORE_FLEXLAYOUT_WXCORELAYOUTNODE_H
-#endif
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXCoreStyle.cpp b/ios/sdk/WeexSDK/Sources/Layout/WXCoreStyle.cpp
deleted file mode 100644
index 16738e6bc7..0000000000
--- a/ios/sdk/WeexSDK/Sources/Layout/WXCoreStyle.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "WXCoreStyle.h"
-
-namespace WeexCore {
-
-  bool WXCoreMargin::setMargin(const WXCoreMarginEdge &edge, float margin) {
-    bool dirty = false;
-    switch (edge) {
-      case kMarginALL:
-        if (mMarginLeft != margin
-            || mMarginTop != margin
-            || mMarginRight != margin
-            || mMarginBottom != margin) {
-          mMarginLeft = margin;
-          mMarginTop = margin;
-          mMarginRight = margin;
-          mMarginBottom = margin;
-          dirty = true;
-        }
-        break;
-      case kMarginLeft:
-        if (mMarginLeft != margin) {
-          mMarginLeft = margin;
-          dirty = true;
-        }
-        break;
-      case kMarginTop:
-        if (mMarginTop != margin) {
-          mMarginTop = margin;
-          dirty = true;
-        }
-        break;
-      case kMarginRight:
-        if (mMarginRight != margin) {
-          mMarginRight = margin;
-          dirty = true;
-        }
-        break;
-      case kMarginBottom:
-        if (mMarginBottom != margin) {
-          mMarginBottom = margin;
-          dirty = true;
-        }
-        break;
-    }
-    return dirty;
-  }
-
-  float WXCoreMargin::getMargin(const WXCoreMarginEdge &edge)const {
-    float margin = 0;
-    switch (edge) {
-      case kMarginLeft:
-        margin = mMarginLeft;
-        break;
-      case kMarginTop:
-        margin = mMarginTop;
-        break;
-      case kMarginRight:
-        margin = mMarginRight;
-        break;
-      case kMarginBottom:
-        margin = mMarginBottom;
-        break;
-      default:
-        break;
-    }
-    return margin;
-  }
-
-  bool WXCorePadding::setPadding(const WXCorePaddingEdge &edge, float padding) {
-    bool dirty = false;
-    switch (edge) {
-      case kPaddingALL:
-        if (mPaddingLeft != padding
-            || mPaddingTop != padding
-            || mPaddingRight != padding
-            || mPaddingBottom != padding) {
-          mPaddingLeft = padding;
-          mPaddingTop = padding;
-          mPaddingRight = padding;
-          mPaddingBottom = padding;
-          dirty = true;
-        }
-        break;
-      case kPaddingLeft:
-        if (mPaddingLeft != padding) {
-          mPaddingLeft = padding;
-          dirty = true;
-        }
-        break;
-      case kPaddingTop:
-        if (mPaddingTop != padding) {
-          mPaddingTop = padding;
-          dirty = true;
-        }
-        break;
-      case kPaddingRight:
-        if (mPaddingRight != padding) {
-          mPaddingRight = padding;
-          dirty = true;
-        }
-        break;
-      case kPaddingBottom:
-        if (mPaddingBottom != padding) {
-          mPaddingBottom = padding;
-          dirty = true;
-        }
-        break;
-    }
-    return dirty;
-  }
-
-  float WXCorePadding::getPadding(const WXCorePaddingEdge &edge)const {
-    float padding = 0;
-    switch (edge) {
-      case kPaddingLeft:
-        padding = mPaddingLeft;
-        break;
-      case kPaddingTop:
-        padding = mPaddingTop;
-        break;
-      case kPaddingRight:
-        padding = mPaddingRight;
-        break;
-      case kPaddingBottom:
-        padding = mPaddingBottom;
-        break;
-      default:
-        break;
-    }
-    return padding;
-  }
-
-  bool WXCoreBorderWidth::setBorderWidth(const WXCoreBorderWidthEdge &edge, float borderWidth) {
-    bool dirty = false;
-    switch (edge) {
-      case kBorderWidthALL:
-        if (mBorderWidthLeft != borderWidth
-            || mBorderWidthTop != borderWidth
-            || mBorderWidthRight != borderWidth
-            || mBorderWidthBottom != borderWidth) {
-          mBorderWidthLeft = borderWidth;
-          mBorderWidthTop = borderWidth;
-          mBorderWidthRight = borderWidth;
-          mBorderWidthBottom = borderWidth;
-          dirty = true;
-        }
-        break;
-      case kBorderWidthLeft:
-        if (mBorderWidthLeft != borderWidth) {
-          mBorderWidthLeft = borderWidth;
-          dirty = true;
-        }
-        break;
-      case kBorderWidthTop:
-        if (mBorderWidthTop != borderWidth) {
-          mBorderWidthTop = borderWidth;
-          dirty = true;
-        }
-        break;
-      case kBorderWidthRight:
-        if (mBorderWidthRight != borderWidth) {
-          mBorderWidthRight = borderWidth;
-          dirty = true;
-        }
-        break;
-      case kBorderWidthBottom:
-        if (mBorderWidthBottom != borderWidth) {
-          mBorderWidthBottom = borderWidth;
-          dirty = true;
-        }
-        break;
-    }
-    return dirty;
-  }
-
-  float WXCoreBorderWidth::getBorderWidth(const WXCoreBorderWidthEdge &edge)const {
-    float borderWidth = 0;
-    switch (edge) {
-      case kBorderWidthLeft:
-        borderWidth = mBorderWidthLeft;
-        break;
-      case kBorderWidthTop:
-        borderWidth = mBorderWidthTop;
-        break;
-      case kBorderWidthRight:
-        borderWidth = mBorderWidthRight;
-        break;
-      case kBorderWidthBottom:
-        borderWidth = mBorderWidthBottom;
-        break;
-      default:
-        break;
-    }
-    return borderWidth;
-  }
-
-  bool WXCorePosition::setPosition(const WXCorePositionEdge &edge, float position) {
-    bool dirty = false;
-    switch (edge) {
-      case kPositionEdgeLeft:
-        if (mLeft != position) {
-          mLeft = position;
-          dirty = true;
-        }
-        break;
-      case kPositionEdgeTop:
-        if (mTop != position) {
-          mTop = position;
-          dirty = true;
-        }
-        break;
-      case kPositionEdgeRight:
-        if (mRight != position) {
-          mRight = position;
-          dirty = true;
-        }
-        break;
-      case kPositionEdgeBottom:
-        if (mBottom != position) {
-          mBottom = position;
-          dirty = true;
-        }
-        break;
-    }
-    return dirty;
-  }
-
-  float WXCorePosition::getPosition(const WXCorePositionEdge &edge) {
-    float position = 0;
-    switch (edge) {
-      case kPositionEdgeLeft:
-        position = mLeft;
-        break;
-      case kPositionEdgeTop:
-        position = mTop;
-        break;
-      case kPositionEdgeRight:
-        position = mRight;
-        break;
-      case kPositionEdgeBottom:
-        position = mBottom;
-        break;
-    }
-    return position;
-  }
-
-}
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXCoreStyle.h b/ios/sdk/WeexSDK/Sources/Layout/WXCoreStyle.h
deleted file mode 100644
index 50f962c801..0000000000
--- a/ios/sdk/WeexSDK/Sources/Layout/WXCoreStyle.h
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#ifdef __cplusplus
-
-#ifndef WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUMS_H
-#define WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUMS_H
-
-
-#include "WXCoreFlexEnum.h"
-#include <cmath>
-
-namespace WeexCore {
-
-  /**
-   * Margin: margin-left、margin-right、margin-top、margin-bottom
-   */
-  class WXCoreMargin {
-  private:
-    float mMarginTop;
-    float mMarginBottom;
-    float mMarginLeft;
-    float mMarginRight;
-
-  public:
-    WXCoreMargin() : mMarginTop(0),
-                     mMarginBottom(0),
-                     mMarginLeft(0),
-                     mMarginRight(0) {}
-
-    ~WXCoreMargin() {
-      mMarginTop = 0;
-      mMarginBottom = 0;
-      mMarginLeft = 0;
-      mMarginRight = 0;
-    }
-
-    bool setMargin(const WXCoreMarginEdge &edge, float margin);
-
-    float getMargin(const WXCoreMarginEdge &edge)const;
-  };
-
-
-  /**
-   * Padding:padding-left、padding-right、padding-top、padding-bottom
-   */
-  class WXCorePadding {
-  private:
-    float mPaddingTop;
-    float mPaddingBottom;
-    float mPaddingLeft;
-    float mPaddingRight;
-
-  public:
-    WXCorePadding() : mPaddingTop(0),
-                      mPaddingBottom(0),
-                      mPaddingLeft(0),
-                      mPaddingRight(0) {}
-
-    ~WXCorePadding() {
-      mPaddingTop = 0;
-      mPaddingBottom = 0;
-      mPaddingLeft = 0;
-      mPaddingRight = 0;
-    }
-
-    bool setPadding(const WXCorePaddingEdge &edge, float padding);
-
-    float getPadding(const WXCorePaddingEdge &edge)const;
-  };
-
-
-  /**
-   * BorderWidth:borderwidth-left、borderwidth-right、borderwidth-top、borderwidth-bottom
-   */
-  class WXCoreBorderWidth {
-  private:
-    float mBorderWidthTop;
-    float mBorderWidthBottom;
-    float mBorderWidthLeft;
-    float mBorderWidthRight;
-
-  public:
-    WXCoreBorderWidth() : mBorderWidthTop(0),
-                          mBorderWidthBottom(0),
-                          mBorderWidthLeft(0),
-                          mBorderWidthRight(0) {}
-
-    ~WXCoreBorderWidth() {
-      mBorderWidthTop = 0;
-      mBorderWidthBottom = 0;
-      mBorderWidthLeft = 0;
-      mBorderWidthRight = 0;
-    }
-
-    bool setBorderWidth(const WXCoreBorderWidthEdge &edge, float borderWidth);
-
-    float getBorderWidth(const WXCoreBorderWidthEdge &edge)const;
-  };
-
-
-  /**
-   * position:left、right、top、bottom
-   */
-  class WXCorePosition {
-  private:
-    float mTop;
-    float mBottom;
-    float mLeft;
-    float mRight;
-
-  public:
-    WXCorePosition() : mTop(NAN),
-                       mBottom(NAN),
-                       mLeft(NAN),
-                       mRight(NAN) {}
-
-    ~WXCorePosition() {
-      reset();
-    }
-
-    inline bool isNAN() {
-        return std::isnan(mTop) || std::isnan(mBottom) || std::isnan(mLeft) || std::isnan(mRight);
-    }
-
-    inline void reset() {
-      mTop = 0;
-      mBottom = 0;
-      mLeft = 0;
-      mRight = 0;
-    }
-
-    bool setPosition(const WXCorePositionEdge &edge, float position);
-
-    float getPosition(const WXCorePositionEdge &edge);
-  };
-
-  enum DimensionLevel{
-    CSS_STYLE = 1,
-    INSTANCE_STYLE = 2,
-    FALLBACK_STYLE = 3
-  };
-
-  /**
-   * css-style
-   */
-  class WXCoreCSSStyle {
-  public:
-    /**
-     * The direction children items are placed inside the Flexbox layout, it determines the
-     * direction of the main axis (and the cross axis, perpendicular to the main axis).
-     * The default value is {@link WXCoreFlexDirection #WXCore_Flex_Direction_Row}.
-     */
-    WXCoreFlexDirection mFlexDirection;
-
-    /**
-     * This attribute controls whether the flex container is single-line or multi-line, and the
-     * direction of the cross axis.
-     * <ul>
-     * <li>{@link WXCoreFlexWrap}: The flex container is single-line.</li>
-     * <li>{@link WXCoreFlexWrap}: The flex container is multi-line.</li>
-     * <li>{@link WXCoreFlexWrap}: The flex container is multi-line. The direction of the
-     * cross axis is opposed to the direction as the {@link WXCoreFlexWrap}</li>
-     * </ul>
-     * The default value is {@link WXCoreFlexWrap #WXCore_Wrap_NoWrap}.
-     */
-    WXCoreFlexWrap mFlexWrap;
-
-    /**
-     * This attribute controls the alignment along the main axis.
-     * The default value is {@link WXCoreJustifyContent #WXCore_Justify_Flex_Start}.
-     */
-    WXCoreJustifyContent mJustifyContent;
-
-    /**
-     * This attribute controls the alignment along the cross axis.
-     * The default value is {@link WXCoreAlignItems #WXCore_AlignItems_Stretch}.
-     */
-    WXCoreAlignItems mAlignItems;
-
-    /**
-     * This attribute controls the alignment along the cross axis.
-     * The default value is {@link WXCoreAlignSelf #WXCore_AlignSelf_Auto}.
-     */
-    WXCoreAlignSelf mAlignSelf;
-
-    WXCorePositionType mPositionType;
-
-    float mFlexGrow;
-
-    float mMinWidth;
-
-    float mMinHeight;
-
-    float mMaxWidth;
-
-    float mMaxHeight;
-
-    float mStyleWidth;
-
-    float mStyleHeight;
-
-    DimensionLevel mStyleWidthLevel;
-
-    DimensionLevel mStyleHeightLevel;
-
-    WXCoreMargin mMargin;
-
-    WXCorePadding mPadding;
-
-    WXCoreBorderWidth mBorderWidth;
-
-    WXCorePosition mStylePosition;
-
-    constexpr static float kFlexGrowDefault  = 0;
-
-    constexpr static WXCoreFlexDirection kFlexDirectionDefault= kFlexDirectionColumn;
-
-    constexpr static WXCoreFlexWrap kFlexWrapDefault = kNoWrap;
-
-    constexpr static WXCoreJustifyContent kFlexJustifyContentDefault = kJustifyFlexStart;
-
-    constexpr static WXCoreAlignItems kFlexAlignItemsDefault = kAlignItemsStretch;
-
-    constexpr static WXCoreAlignSelf kFlexAlignSelfDefault = kAlignSelfAuto;
-
-    constexpr static WXCorePositionType kWXCorePositionTypeDefault = kRelative;
-
-    WXCoreCSSStyle() : mFlexDirection(kFlexDirectionDefault),
-                       mFlexWrap(kFlexWrapDefault),
-                       mJustifyContent(kFlexJustifyContentDefault),
-                       mAlignItems(kFlexAlignItemsDefault),
-                       mAlignSelf(kFlexAlignSelfDefault),
-                       mFlexGrow(kFlexGrowDefault),
-                       mPositionType(kWXCorePositionTypeDefault),
-                       mStyleWidth(NAN), mStyleHeight(NAN),
-                       mStyleHeightLevel(FALLBACK_STYLE), mStyleWidthLevel(FALLBACK_STYLE),
-                       mMaxWidth(NAN), mMaxHeight(NAN),
-                       mMinWidth(NAN), mMinHeight(NAN) {
-
-    }
-
-    ~WXCoreCSSStyle() {
-      mFlexDirection = kFlexDirectionDefault;
-      mFlexWrap = kFlexWrapDefault;
-      mJustifyContent = kFlexJustifyContentDefault;
-      mAlignItems = kFlexAlignItemsDefault;
-      mAlignSelf = kFlexAlignSelfDefault;
-      mFlexGrow = kFlexGrowDefault;
-      mStyleWidth = NAN;
-      mStyleHeight = NAN;
-      mStyleWidthLevel = FALLBACK_STYLE;
-      mStyleHeightLevel = FALLBACK_STYLE;
-      mMaxWidth = NAN;
-      mMaxHeight = NAN;
-      mMinWidth = NAN;
-      mMinHeight = NAN;
-    }
-
-    inline float sumPaddingBorderOfEdge(const WXCoreEdge edge){
-      switch (edge) {
-        case kTop:
-          return mPadding.getPadding(kPaddingTop)
-              + mBorderWidth.getBorderWidth(kBorderWidthTop);
-        case kRight:
-          return mPadding.getPadding(kPaddingRight)
-              + mBorderWidth.getBorderWidth(kBorderWidthRight);
-        case kBottom:
-          return mPadding.getPadding(kPaddingBottom)
-              + mBorderWidth.getBorderWidth(kBorderWidthBottom);
-        case kLeft:
-          return mPadding.getPadding(kPaddingLeft)
-              + mBorderWidth.getBorderWidth(kBorderWidthLeft);
-      }
-    }
-
-    float sumMarginOfDirection(bool horizontal){
-      if(horizontal){
-        return mMargin.getMargin(kMarginLeft) + mMargin.getMargin(kMarginRight);
-      }
-      else{
-        return mMargin.getMargin(kMarginTop) + mMargin.getMargin(kMarginBottom);
-      }
-    }
-  };
-}
-#endif //WEEXCORE_FLEXLAYOUT_WXCOREFLEXENUMS_H
-#endif
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXLayoutConstraint.h b/ios/sdk/WeexSDK/Sources/Layout/WXLayoutConstraint.h
new file mode 100644
index 0000000000..8a10df4a49
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXLayoutConstraint.h
@@ -0,0 +1,41 @@
+//
+//  WXLayoutConstraint.h
+//  Pods-WeexDemo
+//
+//  Created by 邹明 on 2018/6/26.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface WXLayoutMargin : NSObject
+
+@property (nonatomic,assign,readonly) float top;
+@property (nonatomic,assign,readonly) float bottom;
+@property (nonatomic,assign,readonly) float left;
+@property (nonatomic,assign,readonly) float right;
+
+- (instancetype)initWithTop:(float)top bottom:(float)bottom left:(float)left right:(float)right;
+
+@end
+
+@interface WXLayoutPadding : NSObject
+
+@property (nonatomic,assign,readonly) float top;
+@property (nonatomic,assign,readonly) float bottom;
+@property (nonatomic,assign,readonly) float left;
+@property (nonatomic,assign,readonly) float right;
+
+- (instancetype)initWithTop:(float)top bottom:(float)bottom left:(float)left right:(float)right;
+
+@end
+
+@interface WXLayoutBorderWidth : NSObject
+
+@property (nonatomic,assign,readonly) float top;
+@property (nonatomic,assign,readonly) float bottom;
+@property (nonatomic,assign,readonly) float left;
+@property (nonatomic,assign,readonly) float right;
+
+- (instancetype)initWithTop:(float)top bottom:(float)bottom left:(float)left right:(float)right;
+
+@end
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXLayoutConstraint.m b/ios/sdk/WeexSDK/Sources/Layout/WXLayoutConstraint.m
new file mode 100644
index 0000000000..22c6960146
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXLayoutConstraint.m
@@ -0,0 +1,50 @@
+//
+//  WXLayoutConstraint.m
+//  Pods-WeexDemo
+//
+//  Created by 邹明 on 2018/6/26.
+//
+
+#import "WXLayoutConstraint.h"
+
+@implementation WXLayoutMargin
+
+- (instancetype)initWithTop:(float)top bottom:(float)bottom left:(float)left right:(float)right{
+    if (self = [super init]) {
+        _top = top;
+        _bottom = bottom;
+        _left = left;
+        _right = right;
+    }
+    return self;
+}
+
+@end
+
+@implementation WXLayoutPadding
+
+- (instancetype)initWithTop:(float)top bottom:(float)bottom left:(float)left right:(float)right{
+    if (self = [super init]) {
+        _top = top;
+        _bottom = bottom;
+        _left = left;
+        _right = right;
+    }
+    return self;
+}
+
+@end
+
+@implementation WXLayoutBorderWidth
+
+- (instancetype)initWithTop:(float)top bottom:(float)bottom left:(float)left right:(float)right{
+    if (self = [super init]) {
+        _top = top;
+        _bottom = bottom;
+        _left = left;
+        _right = right;
+    }
+    return self;
+}
+
+@end
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXScrollerComponent+Layout.mm b/ios/sdk/WeexSDK/Sources/Layout/WXScrollerComponent+Layout.mm
deleted file mode 100644
index 3c7edc7acb..0000000000
--- a/ios/sdk/WeexSDK/Sources/Layout/WXScrollerComponent+Layout.mm
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#import "WXScrollerComponent+Layout.h"
-#import "WXLog.h"
-
-@implementation WXScrollerComponent (FlexLayout)
-
-- (WeexCore::WXCoreLayoutNode *)flexScrollerCSSNode{
-    return _flexScrollerCSSNode;
-}
-
-- (void)_insertChildCssNode:(WXComponent *)subcomponent atIndex:(NSInteger)index
-{
-    self.flexScrollerCSSNode->addChildAt(subcomponent.flexCssNode, (uint32_t) index);
-#ifdef DEBUG
-    WXLogDebug(@"flexLayout -> ref:%@,subNodeIndex:%ld,childCount:%ld",self.ref,(long)index,_flexScrollerCSSNode->getChildCount());
-#endif
-   
-//    WXLogInfo(@"FlexLayout -- P:%@ -> C:%@",self,subcomponent);
-}
-- (void)_rmChildCssNode:(WXComponent *)subcomponent
-{
-    self.flexScrollerCSSNode->removeChild(subcomponent->_flexCssNode);
-#ifdef DEBUG
-    WXLogDebug(@"flexLayout -> ref:%@ ,scrollerCSSNode->removeChild ,childRef:%@",self.ref,subcomponent.ref);
-#endif
-}
-
-@end
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
index c74f79df93..811f918abd 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXBridgeManager.m
@@ -18,6 +18,7 @@
  */
 
 #import "WXBridgeManager.h"
+#import "WXBridgeContext.h"
 #import "WXLog.h"
 #import "WXAssert.h"
 #import "WXBridgeMethod.h"
@@ -28,7 +29,6 @@
 #import "WXResourceLoader.h"
 #import "WXDebugTool.h"
 #import "WXTracingManager.h"
-#import "WXBridgeContext.h"
 #import "WXMonitor.h"
 #import "WXSDKInstance_performance.h"
 
@@ -54,7 +54,6 @@ + (instancetype)sharedManager
     return _sharedInstance;
 }
 
-
 - (instancetype)init
 {
     self = [super init];
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
index e7bce57ff4..7791727874 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.h
@@ -19,6 +19,7 @@
 
 #import <CoreGraphics/CoreGraphics.h>
 #import <Foundation/Foundation.h>
+#import "WXDisplayLinkManager.h"
 
 @class WXBridgeMethod;
 @class WXSDKInstance;
@@ -35,7 +36,7 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
 }
 #endif
 
-@interface WXComponentManager : NSObject
+@interface WXComponentManager : NSObject <WXDisplayLinkClient>
 
 @property (nonatomic, readonly, weak) WXSDKInstance *weexInstance;
 @property (nonatomic, readonly, assign) BOOL isValid;
@@ -65,14 +66,31 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
 ///--------------------------------------
 
 /**
- * @abstract create root of component tree
+ * @abstract create root component
  **/
-- (void)createRoot:(NSDictionary *)data;
+- (void)createBody:(NSString*)ref
+              type:(NSString*)type
+            styles:(NSDictionary*)styles
+        attributes:(NSDictionary*)attributes
+            events:(NSArray*)events
+      renderObject:(void*)renderObject;
 
 /**
- * @abstract add component
+ * @abstract add a component to its parent
  **/
-- (void)addComponent:(NSDictionary *)componentData toSupercomponent:(NSString *)superRef atIndex:(NSInteger)index appendingInTree:(BOOL)appendingInTree;
+- (void)addComponent:(NSString*)ref
+                type:(NSString*)type
+           parentRef:(NSString*)parentRef
+              styles:(NSDictionary*)styles
+          attributes:(NSDictionary*)attributes
+              events:(NSArray*)events
+               index:(NSInteger)index
+        renderObject:(void*)renderObject;
+
+/**
+ * @abstract move component
+ **/
+- (void)moveComponent:(NSString *)ref toSuper:(NSString *)superRef atIndex:(NSInteger)index;
 
 /**
  * @abstract remove component
@@ -80,9 +98,10 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
 - (void)removeComponent:(NSString *)ref;
 
 /**
- * @abstract move component
+ * @abstract notify that a component tree is built and trigger layout,
+    may be called several times rendering a page.
  **/
-- (void)moveComponent:(NSString *)ref toSuper:(NSString *)superRef atIndex:(NSInteger)index;
+- (void)appendTreeCreateFinish:(NSString*)ref;
 
 /**
  * @abstract return component for specific ref, must be called on component thread by calling WXPerformBlockOnComponentThread
@@ -99,6 +118,9 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
  */
 - (NSUInteger)numberOfComponents;
 
+/**
+ * @abstract add an existing component to references look-up map
+ */
 - (void)addComponent:(WXComponent *)component toIndexDictForRef:(NSString *)ref;
 
 ///--------------------------------------
@@ -110,14 +132,9 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
  **/
 - (void)updateStyles:(NSDictionary *)styles forComponent:(NSString *)ref;
 
-///--------------------------------------
-/// @name Updating pseudo class
-///--------------------------------------
-
 /**
- * @abstract update  pseudo class styles
+ * @abstract update pseudo class styles
  **/
-
 - (void)updatePseudoClassStyles:(NSDictionary *)styles forComponent:(NSString *)ref;
 
 /**
@@ -125,6 +142,26 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
  **/
 - (void)updateAttributes:(NSDictionary *)attributes forComponent:(NSString *)ref;
 
+/**
+ * @abstract quick check that if a component has non transition properties
+ **/
+- (BOOL)isTransitionNoneOfComponent:(NSString*)ref; // for quick access
+
+/**
+ * @abstract check if component with @ref has any style in @styles which is animated
+ **/
+- (BOOL)hasTransitionPropertyInStyles:(NSDictionary*)styles forComponent:(NSString*)ref;
+
+/**
+ * @abstract layout a component with frame output by weex core layout engine
+ **/
+- (void)layoutComponent:(WXComponent*)component frame:(CGRect)frame innerMainSize:(CGFloat)innerMainSize;
+
+/**
+ * @abstract layout a component on platform side
+ **/
+- (void)layoutComponent:(WXComponent*)component;
+
 /**
  * @abstract add event
  **/
@@ -159,6 +196,11 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
  **/
 - (void)updateFinish;
 
+/**
+ * @abstract called when all doms are created and layout finished
+ **/
+- (void)renderFinish;
+
 /**
  * @abstract unload
  **/
@@ -187,9 +229,15 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
  */
 - (void)removeFixedComponent:(WXComponent *)fixComponent;
 
+/**
+ * @abstract add a task to UI thread
+ **/
 - (void)_addUITask:(void (^)(void))block;
 
-- (void)excutePrerenderUITask:(NSString *)url;
+/**
+ * @abstract execute a task to UI thread
+ **/
+- (void)executePrerenderUITask:(NSString *)url;
 
 /**
  * @param styles a NSDictionary value, styles which will resolve
@@ -203,6 +251,10 @@ void WXPerformBlockSyncOnComponentThread(void (^block)(void));
 /// @name Enumerating
 ///--------------------------------------
 
+/**
+ * Enumerate components using breadth-first search algorithm,
+ must be called on component thread by calling WXPerformBlockOnComponentThread
+ */
 - (void)enumerateComponentsUsingBlock:(void (^)(WXComponent *, BOOL *stop))block;
 
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
index af710b73cb..91c6e84dc7 100644
--- a/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXComponentManager.mm
@@ -39,8 +39,7 @@
 #import "WXSDKInstance_performance.h"
 #import "WXRootView.h"
 #import "WXComponent+Layout.h"
-
-
+#import "WXCoreBridge.h"
 
 static NSThread *WXComponentThread;
 
@@ -62,8 +61,7 @@ @implementation WXComponentManager
 
     WXComponent *_rootComponent;
     NSMutableArray *_fixedComponents;
-    WeexCore::WXCoreLayoutNode* _rootFlexCSSNode;
-    CADisplayLink *_displayLink;
+
     pthread_mutex_t _propertyMutex;
     pthread_mutexattr_t _propertMutexAttr;
 }
@@ -96,16 +94,16 @@ - (instancetype)initWithWeexInstance:(id)weexInstance
     return self;
 }
 
-- (void)dealloc
+- (instancetype)init
 {
-    if(_rootFlexCSSNode){
-        if ([[NSThread currentThread].name isEqualToString:WX_COMPONENT_THREAD_NAME]) {
-            delete _rootFlexCSSNode;
-        }else{
-            [WXComponent recycleNodeOnComponentThread:_rootFlexCSSNode gabRef:@"_root_p"];
-        }
-        _rootFlexCSSNode=nullptr;
+    if (self == [super init]) {
+        _suspend = NO;
     }
+    return self;
+}
+
+- (void)dealloc
+{
     [NSMutableArray wx_releaseArray:_fixedComponents];
     pthread_mutex_destroy(&_propertyMutex);
     pthread_mutexattr_destroy(&_propertMutexAttr);
@@ -174,26 +172,14 @@ - (void)startComponentTasks
 - (void)rootViewFrameDidChange:(CGRect)frame
 {
     WXAssertComponentThread();
-        if (_rootFlexCSSNode) {
-            [self _applyRootFrame:frame];
-            if (!_rootComponent.styles[@"width"]) {
-                _rootComponent.flexCssNode->setStyleWidth(frame.size.width ?:FlexUndefined,NO);
-            }
-            if (!_rootComponent.styles[@"height"]) {
-                _rootComponent.flexCssNode->setStyleHeight(frame.size.height ?:FlexUndefined);
-            }
-        }
+    CGSize size = _weexInstance.frame.size;
+    [WXCoreBridge setDefaultDimensionIntoRoot:_weexInstance.instanceId
+                                        width:size.width height:size.height
+                           isWidthWrapContent:size.width == 0.0f isHeightWrapContent:size.height == 0.0f];
     [_rootComponent setNeedsLayout];
     [self startComponentTasks];
 }
 
-- (void)_applyRootFrame:(CGRect)rootFrame{
-    _rootFlexCSSNode->setStylePosition(WeexCore::kPositionEdgeLeft, self.weexInstance.frame.origin.x);
-    _rootFlexCSSNode->setStylePosition(WeexCore::kPositionEdgeTop, self.weexInstance.frame.origin.y);
-    _rootFlexCSSNode->setStyleWidth(self.weexInstance.frame.size.width ?: FlexUndefined,NO);
-    _rootFlexCSSNode->setStyleHeight(self.weexInstance.frame.size.height ?: FlexUndefined);
-}
-
 - (void)_addUITask:(void (^)(void))block
 {
     if(!_uiPrerenderTaskQueue){
@@ -211,7 +197,7 @@ - (void)_addUITask:(void (^)(void))block
     }
 }
 
-- (void)excutePrerenderUITask:(NSString *)url
+- (void)executePrerenderUITask:(NSString *)url
 {
     NSMutableArray *tasks  = [_uiPrerenderTaskQueue objectForKey:[WXPrerenderManager getTaskKeyFromUrl:self.weexInstance.scriptURL.absoluteString]];
     for (id block in tasks) {
@@ -223,58 +209,65 @@ - (void)excutePrerenderUITask:(NSString *)url
 
 #pragma mark Component Tree Building
 
-- (void)createRoot:(NSDictionary *)data
+- (void)createBody:(NSString*)ref
+              type:(NSString*)type
+            styles:(NSDictionary*)styles
+        attributes:(NSDictionary*)attributes
+            events:(NSArray*)events
+      renderObject:(void*)renderObject
 {
     WXAssertComponentThread();
-    WXAssertParam(data);
+    WXAssertParam(ref);
+    WXAssertParam(type);
+    WXAssertParam(renderObject);
     
-    _rootComponent = [self _buildComponentForData:data supercomponent:nil];
-        [self _initRootFlexCssNode];
-        _rootFlexCSSNode->addChildAt(_rootComponent.flexCssNode, (uint32_t)[_fixedComponents count]);
+    _rootComponent = [self _buildComponent:ref type:type supercomponent:nil styles:styles attributes:attributes events:events renderObject:renderObject];
     
-    NSArray *subcomponentsData = [data valueForKey:@"children"];
-    if (subcomponentsData) {
-        BOOL appendTree = [_rootComponent.attributes[@"append"] isEqualToString:@"tree"];
-        for(NSDictionary *subcomponentData in subcomponentsData){
-            [self _recursivelyAddComponent:subcomponentData toSupercomponent:_rootComponent atIndex:-1 appendingInTree:appendTree];
-        }
-    }
+    CGSize size = _weexInstance.frame.size;
+    [WXCoreBridge setDefaultDimensionIntoRoot:_weexInstance.instanceId
+                                        width:size.width height:size.height
+                           isWidthWrapContent:size.width == 0.0f isHeightWrapContent:size.height == 0.0f];
     
     __weak typeof(self) weakSelf = self;
     WX_MONITOR_INSTANCE_PERF_END(WXFirstScreenJSFExecuteTime, self.weexInstance);
     [self _addUITask:^{
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:data[@"ref"] className:nil name:data[@"type"] phase:WXTracingBegin functionName:@"createBody" options:@{@"threadName":WXTUIThread}];
         __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return;
+        }
+        
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:type phase:WXTracingBegin functionName:@"createBody" options:@{@"threadName":WXTUIThread}];
         strongSelf.weexInstance.rootView.wx_component = strongSelf->_rootComponent;
         [strongSelf.weexInstance.rootView addSubview:strongSelf->_rootComponent.view];
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:data[@"ref"] className:nil name:data[@"type"] phase:WXTracingEnd functionName:@"createBody" options:@{@"threadName":WXTUIThread}];
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:type phase:WXTracingEnd functionName:@"createBody" options:@{@"threadName":WXTUIThread}];
     }];
-    
-    
 }
 
-
-- (void)addComponent:(NSDictionary *)componentData toSupercomponent:(NSString *)superRef atIndex:(NSInteger)index appendingInTree:(BOOL)appendingInTree
+- (void)addComponent:(NSString*)ref
+                type:(NSString*)type
+           parentRef:(NSString*)parentRef
+              styles:(NSDictionary*)styles
+          attributes:(NSDictionary*)attributes
+              events:(NSArray*)events
+               index:(NSInteger)index
+        renderObject:(void*)renderObject
 {
     WXAssertComponentThread();
-    WXAssertParam(componentData);
-    WXAssertParam(superRef);
+    WXAssertParam(ref);
+    WXAssertParam(type);
+    WXAssertParam(parentRef);
+    WXAssertParam(renderObject);
     
-    WXComponent *supercomponent = [_indexDict objectForKey:superRef];
+    WXComponent *supercomponent = [_indexDict objectForKey:parentRef];
     WXAssertComponentExist(supercomponent);
     
     if (!supercomponent) {
-        WXLogWarning(@"addComponent,superRef from js never exit ! check JS action, supRef:%@",superRef);
+        WXLogWarning(@"addComponent,superRef from js never exit ! check JS action, supRef:%@", parentRef);
         return;
     }
     supercomponent.weexInstance.apmInstance.hasAddView = YES;
     
-    [self _recursivelyAddComponent:componentData toSupercomponent:supercomponent atIndex:index appendingInTree:appendingInTree];
-}
-
-- (void)_recursivelyAddComponent:(NSDictionary *)componentData toSupercomponent:(WXComponent *)supercomponent atIndex:(NSInteger)index appendingInTree:(BOOL)appendingInTree
-{
-    WXComponent *component = [self _buildComponentForData:componentData supercomponent:supercomponent];
+    WXComponent *component = [self _buildComponent:ref type:type supercomponent:supercomponent styles:styles attributes:attributes events:events renderObject:renderObject];
     if (!supercomponent.subcomponents) {
         index = 0;
     } else {
@@ -282,24 +275,28 @@ - (void)_recursivelyAddComponent:(NSDictionary *)componentData toSupercomponent:
     }
     
 #ifdef DEBUG
-        WXLogDebug(@"flexLayout -> _recursivelyAddComponent : super:(%@,%@):[%f,%f] ,child:(%@,%@):[%f,%f],childClass:%@",
-              supercomponent.type,
-              supercomponent.ref,
-              supercomponent.flexCssNode->getStyleWidth(),
-              supercomponent.flexCssNode->getStyleHeight(),
-              component.type,
-              component.ref,
-              component.flexCssNode->getStyleWidth(),
-              component.flexCssNode->getStyleHeight()
-              ,NSStringFromClass([component class])
-              );
+    WXLogDebug(@"flexLayout -> _recursivelyAddComponent : super:(%@,%@):[%f,%f] ,child:(%@,%@):[%f,%f],childClass:%@",
+               supercomponent.type,
+               supercomponent.ref,
+               supercomponent.flexCssNode->getStyleWidth(),
+               supercomponent.flexCssNode->getStyleHeight(),
+               component.type,
+               component.ref,
+               component.flexCssNode->getStyleWidth(),
+               component.flexCssNode->getStyleHeight(),
+               NSStringFromClass([component class])
+               );
 #endif //DEBUG
-
     
-    [supercomponent _insertSubcomponent:component atIndex:index];
-    [supercomponent.weexInstance.apmInstance updateMaxStats:KEY_PAGE_STATS_MAX_COMPONENT_NUM curMaxValue:[supercomponent.weexInstance numberOfComponents]];
+    BOOL inserted = [supercomponent _insertSubcomponent:component atIndex:index];
+    if (!inserted) {
+        // component is not inserted, ignore
+        [component _setRenderObject:nullptr]; // unbind with RenderObject
+        return;
+    }
+    
     // use _lazyCreateView to forbid component like cell's view creating
-    if(supercomponent && component && supercomponent->_lazyCreateView) {
+    if (supercomponent && component && supercomponent->_lazyCreateView) {
         component->_lazyCreateView = YES;
     }
     
@@ -308,26 +305,16 @@ - (void)_recursivelyAddComponent:(NSDictionary *)componentData toSupercomponent:
     if (!component->_isTemplate) {
         __weak typeof(self) weakSelf = self;
         [self _addUITask:^{
-            [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:componentData[@"ref"] className:nil name:componentData[@"type"] phase:WXTracingBegin functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
+            __strong typeof(self) strongSelf = weakSelf;
+            if (strongSelf == nil) {
+                return;
+            }
+            
+            [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:type phase:WXTracingBegin functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
             [supercomponent insertSubview:component atIndex:index];
-            [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:componentData[@"ref"] className:nil name:componentData[@"type"] phase:WXTracingEnd functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
+            [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:type phase:WXTracingEnd functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
         }];
     }
-    
-    NSArray *subcomponentsData = [componentData valueForKey:@"children"];
-    
-    BOOL appendTree = !appendingInTree && [component.attributes[@"append"] isEqualToString:@"tree"];
-    // if ancestor is appending tree, child should not be laid out again even it is appending tree.
-    for(NSDictionary *subcomponentData in subcomponentsData){
-        [self _recursivelyAddComponent:subcomponentData toSupercomponent:component atIndex:-1 appendingInTree:appendTree || appendingInTree];
-    }
-    
-    [component _didInserted];
-    
-    if (appendTree) {
-        // If appending tree,force layout in case of too much tasks piling up in syncQueue
-        [self _layoutAndSyncUI];
-    }
 }
 
 - (void)moveComponent:(NSString *)ref toSuper:(NSString *)superRef atIndex:(NSInteger)index
@@ -350,9 +337,14 @@ - (void)moveComponent:(NSString *)ref toSuper:(NSString *)superRef atIndex:(NSIn
     [component _moveToSupercomponent:newSupercomponent atIndex:index];
     __weak typeof(self) weakSelf = self;
     [self _addUITask:^{
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingBegin functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
+        __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return;
+        }
+        
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingBegin functionName:@"moveElement" options:@{@"threadName":WXTUIThread}];
         [component moveToSuperview:newSupercomponent atIndex:index];
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingEnd functionName:@"addElement" options:@{@"threadName":WXTUIThread}];
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingEnd functionName:@"moveElement" options:@{@"threadName":WXTUIThread}];
     }];
 }
 
@@ -369,13 +361,27 @@ - (void)removeComponent:(NSString *)ref
         return;
     }
     
+    [component _setRenderObject:nullptr]; // unbind with RenderObject
     [component _removeFromSupercomponent];
     
     [_indexDict removeObjectForKey:ref];
     
+    // remove subcomponents of component from _indexDict and unbind them
+    NSMutableArray* subcomponents = [[NSMutableArray alloc] init];
+    [component _collectSubcomponents:subcomponents];
+    for (WXComponent* c in subcomponents) {
+        [c _setRenderObject:nullptr];
+        [_indexDict removeObjectForKey:c.ref];
+    }
+    
     __weak typeof(self) weakSelf = self;
     [self _addUITask:^{
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingBegin functionName:@"removeElement" options:@{@"threadName":WXTUIThread}];
+        __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return;
+        }
+        
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingBegin functionName:@"removeElement" options:@{@"threadName":WXTUIThread}];
         if (component.supercomponent) {
             [component.supercomponent willRemoveSubview:component];
         }
@@ -384,7 +390,14 @@ - (void)removeComponent:(NSString *)ref
     }];
     
     [self _checkFixedSubcomponentToRemove:component];
+}
+
+- (void)appendTreeCreateFinish:(NSString*)ref
+{
+    WXAssertComponentThread();
     
+    // If appending tree,force layout in case of too much tasks piling up in syncQueue
+    [self _layoutAndSyncUI];
 }
 
 - (void)recordMaximumVirtualDom:(WXComponent*) component
@@ -438,14 +451,15 @@ - (NSUInteger)numberOfComponents
     return _indexDict.count;
 }
 
-- (WXComponent *)_buildComponentForData:(NSDictionary *)data supercomponent:(WXComponent *)supercomponent
+- (WXComponent *)_buildComponent:(NSString *)ref
+                            type:(NSString*)type
+                  supercomponent:(WXComponent *)supercomponent
+                          styles:(NSDictionary*)styles
+                      attributes:(NSDictionary*)attributes
+                          events:(NSArray*)events
+                    renderObject:(void*)renderObject
 {
-    double buildSartTime = CACurrentMediaTime()*1000;
-    NSString *ref = data[@"ref"];
-    NSString *type = data[@"type"];
-    NSDictionary *styles = data[@"style"];
-    NSDictionary *attributes = data[@"attr"];
-    NSArray *events = data[@"event"];
+    double buildStartTime = CACurrentMediaTime()*1000;
     
     if (self.weexInstance.needValidate) {
         id<WXValidateProtocol> validateHandler = [WXHandlerFactory handlerForProtocol:@protocol(WXValidateProtocol)];
@@ -463,10 +477,10 @@ - (WXComponent *)_buildComponentForData:(NSDictionary *)data supercomponent:(WXC
     
     WXComponentConfig *config = [WXComponentFactory configWithComponentName:type];
     BOOL isTemplate = [config.properties[@"isTemplate"] boolValue] || (supercomponent && supercomponent->_isTemplate);
-    NSDictionary *bindingStyles;
-    NSDictionary *bindingAttibutes;
-    NSDictionary *bindingEvents;
-    NSDictionary *bindingProps;
+    NSDictionary *bindingStyles = nil;
+    NSDictionary *bindingAttibutes = nil;
+    NSDictionary *bindingEvents = nil;
+    NSDictionary *bindingProps = nil;
     if (isTemplate) {
         bindingProps = [self _extractBindingProps:&attributes];
         bindingStyles = [self _extractBindings:&styles];
@@ -474,19 +488,25 @@ - (WXComponent *)_buildComponentForData:(NSDictionary *)data supercomponent:(WXC
         bindingEvents = [self _extractBindingEvents:&events];
     }
     
-    Class clazz = NSClassFromString(config.clazz);;
-    WXComponent *component = [[clazz alloc] initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:self.weexInstance];
-    if (isTemplate) {
-        component->_isTemplate = YES;
-        [component _storeBindingsWithProps:bindingProps styles:bindingStyles attributes:bindingAttibutes events:bindingEvents];
+    Class clazz = NSClassFromString(config.clazz);
+    WXComponent *component = [clazz alloc];
+    if (component) {
+        if (renderObject) {
+            [component _setRenderObject:renderObject];
+        }
+        component = [component initWithRef:ref type:type styles:styles attributes:attributes events:events weexInstance:self.weexInstance];
+        if (isTemplate) {
+            component->_isTemplate = YES;
+            [component _storeBindingsWithProps:bindingProps styles:bindingStyles attributes:bindingAttibutes events:bindingEvents];
+        }
     }
-
-    WXAssert(component, @"Component build failed for data:%@", data);
+    
+    WXAssert(component, @"Component build failed for ref:%@, type:%@", ref, type);
     
     [_indexDict setObject:component forKey:component.ref];
     [component readyToRender];// notify redyToRender event when init
     
-    double diffTime = CACurrentMediaTime()*1000 - buildSartTime;
+    double diffTime = CACurrentMediaTime()*1000 - buildStartTime;
     [self.weexInstance.performance recordComponentCreatePerformance:diffTime forComponent:component];
     
     return component;
@@ -539,6 +559,9 @@ - (NSDictionary *)_extractBindings:(NSDictionary **)attributesOrStylesPoint
 - (NSDictionary *)_extractBindingEvents:(NSArray **)eventsPoint
 {
     NSArray *events = *eventsPoint;
+    if (events == nil) {
+        return nil;
+    }
     NSMutableArray *newEvents = [events mutableCopy];
     NSMutableDictionary *bindingEvents = [NSMutableDictionary dictionary];
     [events enumerateObjectsUsingBlock:^(id  _Nonnull event, NSUInteger idx, BOOL * _Nonnull stop) {
@@ -557,6 +580,9 @@ - (NSDictionary *)_extractBindingEvents:(NSArray **)eventsPoint
 - (NSDictionary *)_extractBindingProps:(NSDictionary **)attributesPoint
 {
     NSDictionary *attributes = *attributesPoint;
+    if (attributes == nil) {
+        return nil;
+    }
     if (attributes[@"@componentProps"]) {
         NSMutableDictionary *newAttributes = [attributes mutableCopy];
         [newAttributes removeObjectForKey:@"@componentProps"];
@@ -568,7 +594,8 @@ - (NSDictionary *)_extractBindingProps:(NSDictionary **)attributesPoint
 }
 
 #pragma mark Reset
--(BOOL)isShouldReset:(id )value
+
+- (BOOL)isShouldReset:(id )value
 {
     if([value isKindOfClass:[NSString class]]) {
         if(!value || [@"" isEqualToString:value]) {
@@ -578,7 +605,7 @@ -(BOOL)isShouldReset:(id )value
     return NO;
 }
 
--(void)filterStyles:(NSDictionary *)styles normalStyles:(NSMutableDictionary *)normalStyles resetStyles:(NSMutableArray *)resetStyles
+- (void)filterStyles:(NSDictionary *)styles normalStyles:(NSMutableDictionary *)normalStyles resetStyles:(NSMutableArray *)resetStyles
 {
     for (NSString *key in styles) {
         id value = [styles objectForKey:key];
@@ -641,47 +668,121 @@ - (void)updateAttributes:(NSDictionary *)attributes forComponent:(NSString *)ref
     WXAssertParam(ref);
     
     WXComponent *component = [_indexDict objectForKey:ref];
-    WXAssertComponentExist(component);
-    
     [component _updateAttributesOnComponentThread:attributes];
     __weak typeof(self) weakSelf = self;
     [self _addUITask:^{
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingBegin functionName:@"updateAttrs" options:@{@"threadName":WXTUIThread}];
+        __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return;
+        }
+        
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingBegin functionName:@"updateAttrs" options:@{@"threadName":WXTUIThread}];
         [component _updateAttributesOnMainThread:attributes];
         [component readyToRender];
-        [WXTracingManager startTracingWithInstanceId:weakSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingEnd functionName:@"updateAttrs" options:@{@"threadName":WXTUIThread}];
+        [WXTracingManager startTracingWithInstanceId:strongSelf.weexInstance.instanceId ref:ref className:nil name:nil phase:WXTracingEnd functionName:@"updateAttrs" options:@{@"threadName":WXTUIThread}];
     }];
 }
 
-- (void)addEvent:(NSString *)eventName toComponent:(NSString *)ref
+- (BOOL)isTransitionNoneOfComponent:(NSString*)ref
+{
+    WXAssertComponentThread();
+    
+    WXComponent *component = [_indexDict objectForKey:ref];
+    WXAssertComponentExist(component);
+    
+    return [component _isTransitionNone];
+}
+
+- (BOOL)hasTransitionPropertyInStyles:(NSDictionary*)styles forComponent:(NSString*)ref
+{
+    WXAssertComponentThread();
+    
+    WXComponent *component = [_indexDict objectForKey:ref];
+    WXAssertComponentExist(component);
+    
+    return [component _hasTransitionPropertyInStyles:styles];
+}
+
+- (void)layoutComponent:(WXComponent*)component frame:(CGRect)frame innerMainSize:(CGFloat)innerMainSize
 {
     WXAssertComponentThread();
-    WXAssertParam(eventName);
+    WXAssertParam(component);
+    
+    if (component == _rootComponent) {
+        if (!CGSizeEqualToSize(frame.size, self.weexInstance.frame.size)) {
+            // Synchronize view frame with root component, especially for content wrap mode.
+            WXPerformBlockOnMainThread(^{
+                if (!self.weexInstance.isRootViewFrozen) {
+                    CGRect rect = self.weexInstance.rootView.frame; // no change of origin
+                    rect.size = frame.size;
+                    self.weexInstance.rootView.frame = rect;
+                }
+            });
+        }
+    }
+    
+    if ([component _isCaculatedFrameChanged:frame]) {
+        [component _assignCalculatedFrame:frame];
+        [component _assignInnerContentMainSize:innerMainSize];
+        [component _frameDidCalculated:YES];
+        
+        [self _addUITask:^{
+            [component _layoutDidFinish];
+        }];
+    }
+    else {
+        CGFloat oldValue = [component _getInnerContentMainSize];
+        if (oldValue >= 0 && oldValue != innerMainSize) {
+            [component _assignCalculatedFrame:frame];
+            [component _assignInnerContentMainSize:innerMainSize];
+            [component _frameDidCalculated:YES];
+            
+            [self _addUITask:^{
+                [component _layoutDidFinish];
+            }];
+        }
+        else {
+            [component _frameDidCalculated:NO];
+        }
+    }
+}
+
+- (void)layoutComponent:(WXComponent*)component
+{
+    WXAssertComponentThread();
+    WXAssertParam(component);
+    [component _layoutPlatform];
+}
+
+- (void)addEvent:(NSString *)event toComponent:(NSString *)ref
+{
+    WXAssertComponentThread();
+    WXAssertParam(event);
     WXAssertParam(ref);
     
     WXComponent *component = [_indexDict objectForKey:ref];
     WXAssertComponentExist(component);
     
-    [component _addEventOnComponentThread:eventName];
+    [component _addEventOnComponentThread:event];
     
     [self _addUITask:^{
-        [component _addEventOnMainThread:eventName];
+        [component _addEventOnMainThread:event];
     }];
 }
 
-- (void)removeEvent:(NSString *)eventName fromComponent:(NSString *)ref
+- (void)removeEvent:(NSString *)event fromComponent:(NSString *)ref
 {
     WXAssertComponentThread();
-    WXAssertParam(eventName);
+    WXAssertParam(event);
     WXAssertParam(ref);
     
     WXComponent *component = [_indexDict objectForKey:ref];
     WXAssertComponentExist(component);
     
-    [component _removeEventOnComponentThread:eventName];
+    [component _removeEventOnComponentThread:event];
     
     [self _addUITask:^{
-        [component _removeEventOnMainThread:eventName];
+        [component _removeEventOnMainThread:event];
     }];
 }
 
@@ -717,18 +818,12 @@ - (void)createFinish
     
     WXSDKInstance *instance  = self.weexInstance;
     [self _addUITask:^{
-        UIView *rootView = instance.rootView;
         [instance.performance onInstanceCreateFinish];
         
         WX_MONITOR_INSTANCE_PERF_END(WXPTFirstScreenRender, instance);
         WX_MONITOR_INSTANCE_PERF_END(WXPTAllRender, instance);
         WX_MONITOR_SUCCESS(WXMTJSBridge);
         WX_MONITOR_SUCCESS(WXMTNativeRender);
-        
-        if(instance.renderFinish){
-            [WXTracingManager startTracingWithInstanceId:instance.instanceId ref:nil className:nil name:nil phase:WXTracingInstant functionName:WXTRenderFinish options:@{@"threadName":WXTUIThread}];
-            instance.renderFinish(rootView);
-        }
     }];
     [instance updatePerDicAfterCreateFinish];
 }
@@ -741,7 +836,7 @@ - (void)updateFinish
     WXComponent *root = [_indexDict objectForKey:WX_SDK_ROOT_REF];
     
     [self _addUITask:^{
-        if(instance.updateFinish){
+        if (instance.updateFinish) {
             instance.updateFinish(root.view);
         }
     }];
@@ -755,27 +850,58 @@ - (void)refreshFinish
     WXComponent *root = [_indexDict objectForKey:WX_SDK_ROOT_REF];
     
     [self _addUITask:^{
-        if(instance.refreshFinish){
+        if (instance.refreshFinish) {
             instance.refreshFinish(root.view);
         }
     }];
 }
 
+- (void)renderFinish
+{
+    WXAssertComponentThread();
+    
+    WXSDKInstance *instance  = self.weexInstance;
+    [self _addUITask:^{
+        UIView *rootView = instance.rootView;
+        if (instance.renderFinish) {
+            [WXTracingManager startTracingWithInstanceId:instance.instanceId ref:nil className:nil name:nil phase:WXTracingInstant functionName:WXTRenderFinish options:@{@"threadName":WXTUIThread}];
+            instance.renderFinish(rootView);
+        }
+    }];
+}
+
 - (void)unload
 {
     WXAssertComponentThread();
     [self invalidate];
     [self _stopDisplayLink];
-    NSEnumerator *enumerator = [[_indexDict copy] objectEnumerator];
-    dispatch_async(dispatch_get_main_queue(), ^{
+    
+    // first, unbind with underneath RenderObjects
+    {
+        NSEnumerator* enumerator = [_indexDict objectEnumerator];
         WXComponent *component;
         while ((component = [enumerator nextObject])) {
-            [component _unloadViewWithReusing:NO];
+            [component _setRenderObject:nullptr];
         }
-        _rootComponent = nil;
-    });
+    }
+    
+    // second, unload views and finally release components in UI thread
+    {
+        __block WXComponent* rootComponent = _rootComponent;
+        NSEnumerator *enumerator = [[_indexDict copy] objectEnumerator];
+        dispatch_async(dispatch_get_main_queue(), ^{
+            WXComponent *component;
+            while ((component = [enumerator nextObject])) {
+                [component _unloadViewWithReusing:NO];
+            }
+            rootComponent = nil; // finally release all components
+        });
+    }
     
+    // clear containers
+    _rootComponent = nil;
     [_indexDict removeAllObjects];
+    [_fixedComponents removeAllObjects];
     [_uiTaskQueue removeAllObjects];
 }
 
@@ -794,39 +920,25 @@ - (BOOL)isValid
 - (void)_startDisplayLink
 {
     WXAssertComponentThread();
-    
-    if(!_displayLink){
-        _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(_handleDisplayLink)];
-        [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
-    }
+    [[WXDisplayLinkManager sharedInstance] registerDisplayClient:self];
 }
 
 - (void)_stopDisplayLink
 {
     WXAssertComponentThread();
-    
-    if(_displayLink){
-        [_displayLink invalidate];
-        _displayLink = nil;
-    }
+    [[WXDisplayLinkManager sharedInstance] unregisterDisplayClient:self];
 }
 
 - (void)_suspendDisplayLink
 {
     WXAssertComponentThread();
-    
-    if(_displayLink && !_displayLink.paused) {
-        _displayLink.paused = YES;
-    }
+    _suspend = YES;
 }
 
 - (void)_awakeDisplayLink
 {
     WXAssertComponentThread();
-    
-    if(_displayLink && _displayLink.paused) {
-        _displayLink.paused = NO;
-    }
+    _suspend = NO;
 }
 
 - (void)_handleDisplayLink
@@ -853,42 +965,10 @@ - (void)_layoutAndSyncUI
 
 - (void)_layout
 {
-    BOOL needsLayout = NO;
-
-//    NSEnumerator *enumerator = [_indexDict objectEnumerator];
-//    WXComponent *component;
-//    while ((component = [enumerator nextObject])) {
-//        if ([component needsLayout]) {
-//            needsLayout = YES;
-//            break;
-//        }
-//    }
-    
-    needsLayout = [_rootComponent needsLayout];
-
-    if (!needsLayout) {
-        return;
-    }
-#ifdef DEBUG
-    WXLogDebug(@"flexLayout -> action__ calculateLayout root");
-#endif
-    
-        std::pair<float, float> renderPageSize;
-        renderPageSize.first = self.weexInstance.frame.size.width;
-        renderPageSize.second = self.weexInstance.frame.size.height;
-        _rootFlexCSSNode->calculateLayout(renderPageSize);
-    NSMutableSet<WXComponent *> *dirtyComponents = [NSMutableSet set];
-    [_rootComponent _calculateFrameWithSuperAbsolutePosition:CGPointZero gatherDirtyComponents:dirtyComponents];
-    [self _calculateRootFrame];
-  
-    for (WXComponent *dirtyComponent in dirtyComponents) {
-        [self _addUITask:^{
-            [dirtyComponent _layoutDidFinish];
-        }];
-    }
+    [WXCoreBridge layoutPage:_weexInstance.instanceId forced:[_rootComponent needsLayout]];
 }
 
-- (void) _printFlexComonentFrame:(WXComponent *)component
+- (void) _printFlexComponentFrame:(WXComponent *)component
 {
 #ifdef DEBUG
     WXLogDebug(@"node ref:%@, type:%@ , frame:%@",
@@ -898,13 +978,9 @@ - (void) _printFlexComonentFrame:(WXComponent *)component
           );
 #endif
     
-  
-    
     for (WXComponent *childComponent in component.subcomponents) {
-        [self _printFlexComonentFrame:childComponent];
+        [self _printFlexComponentFrame:childComponent];
     }
-
-    
 }
 
 - (void)_syncUITasks
@@ -917,41 +993,6 @@ - (void)_syncUITasks
         }
     });
 }
-- (void)_initRootFlexCssNode
-{
-    _rootFlexCSSNode = new WeexCore::WXCoreLayoutNode();
-    [self _applyRootFrame:self.weexInstance.frame];
-    _rootFlexCSSNode->setFlexWrap(WeexCore::kNoWrap);
-    _rootFlexCSSNode->setContext((__bridge void *)(self));
-}
-
-- (void)_calculateRootFrame
-{
-        if(!_rootFlexCSSNode->hasNewLayout()){
-            return;
-        }
-        _rootFlexCSSNode->setHasNewLayout(false);
-#ifdef DEBUG
-        WXLogDebug(@"flexLayout -> root _calculateRootFrame");
-#endif
-        
-        
-        CGRect frame = CGRectMake(WXRoundPixelValue(_rootFlexCSSNode->getLayoutPositionLeft()),
-                                  WXRoundPixelValue(_rootFlexCSSNode->getLayoutPositionTop()),
-                                  WXRoundPixelValue(_rootFlexCSSNode->getLayoutWidth()),
-                                  WXRoundPixelValue(_rootFlexCSSNode->getLayoutHeight()));
-        WXPerformBlockOnMainThread(^{
-            if(!self.weexInstance.isRootViewFrozen) {
-                self.weexInstance.rootView.frame = frame;
-            }
-        });
-        //   _rootFlexCSSNode->reset();
-        
-        //    resetNodeLayout(_rootFlexCSSNode);
-    
-   
-}
-
 
 #pragma mark Fixed 
 
@@ -959,7 +1000,6 @@ - (void)addFixedComponent:(WXComponent *)fixComponent
 {
     pthread_mutex_lock(&_propertyMutex);
     [_fixedComponents addObject:fixComponent];
-    _rootFlexCSSNode->addChildAt(fixComponent.flexCssNode, (uint32_t)([_fixedComponents count]-1));
     pthread_mutex_unlock(&_propertyMutex);
 }
 
@@ -968,23 +1008,6 @@ - (void)removeFixedComponent:(WXComponent *)fixComponent
     pthread_mutex_lock(&_propertyMutex);
     [_fixedComponents removeObject:fixComponent];
     pthread_mutex_unlock(&_propertyMutex);
-    [self removeFixFlexNode:fixComponent->_flexCssNode];
-}
-
-- (void)removeFixFlexNode:(WeexCore::WXCoreLayoutNode* )fixNode{
-    if (nullptr == fixNode) {
-        return;
-    }
-    if ([[NSThread currentThread].name isEqualToString:WX_COMPONENT_THREAD_NAME]) {
-        _rootFlexCSSNode->removeChild(fixNode);
-    }else{
-        WXPerformBlockOnComponentThread(^{
-            if (nullptr == fixNode) {
-                return;
-            }
-            _rootFlexCSSNode->removeChild(fixNode);
-        });
-    }
 }
 
 #pragma mark Enumerating
@@ -1022,6 +1045,13 @@ - (void)enumerateComponentsUsingBlock:(void (^)(WXComponent *, BOOL *stop))block
     }
 }
 
+- (void)handleDisplayLink {
+    [self _handleDisplayLink];
+}
+
+@synthesize suspend=_suspend;
+
+
 @end
 
 void WXPerformBlockOnComponentThread(void (^block)(void))
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXDisplayLinkManager.h b/ios/sdk/WeexSDK/Sources/Manager/WXDisplayLinkManager.h
new file mode 100644
index 0000000000..e6572025a6
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXDisplayLinkManager.h
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+@protocol WXDisplayLinkClient <NSObject>
+/**
+ * @abstract defalut is NO
+ **/
+@property (nonatomic) BOOL suspend;
+
+- (void)handleDisplayLink;
+
+@end
+
+@interface WXDisplayLinkManager : NSObject
+/**
+ * @abstract create WXDisplayLinkManager instance
+ **/
++ (instancetype)sharedInstance;
+
+/**
+ * @abstract add WXDisplayLinkClient to array
+ **/
+- (void)registerDisplayClient:(id<WXDisplayLinkClient>)client;
+
+/**
+ * @abstract remove WXDisplayLinkClient to array
+ **/
+- (void)unregisterDisplayClient:(id<WXDisplayLinkClient>)client;
+
+@end
diff --git a/ios/sdk/WeexSDK/Sources/Manager/WXDisplayLinkManager.m b/ios/sdk/WeexSDK/Sources/Manager/WXDisplayLinkManager.m
new file mode 100644
index 0000000000..b53e47b77d
--- /dev/null
+++ b/ios/sdk/WeexSDK/Sources/Manager/WXDisplayLinkManager.m
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#import "WXDisplayLinkManager.h"
+#import <UIKit/UIKit.h>
+#import "WXAssert.h"
+
+@implementation WXDisplayLinkManager
+{
+    CADisplayLink *_displayLink;
+    NSMutableArray<id<WXDisplayLinkClient>>* _displayArray;
+}
+
++ (instancetype)sharedInstance {
+    WXAssertComponentThread();
+
+    static WXDisplayLinkManager *_sharedDisplayLinkManager = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        _sharedDisplayLinkManager = [[self alloc] init];
+    });
+    [_sharedDisplayLinkManager _startDisplayLink];
+    return _sharedDisplayLinkManager;
+}
+
+- (instancetype)init
+{
+    if (self == [super init]) {
+        _displayArray = [NSMutableArray array];
+    }
+    return self;
+}
+
+- (void)registerDisplayClient:(id<WXDisplayLinkClient>)client
+{
+    WXAssertComponentThread();
+
+    if ([_displayArray containsObject:client]) {
+        return;
+    }
+    [_displayArray addObject:client];
+}
+
+- (void)unregisterDisplayClient:(id<WXDisplayLinkClient>)client
+{
+    WXAssertComponentThread();
+
+    [_displayArray removeObject:client];
+    if ([_displayArray count] == 0) {
+        [self _stopDisplayLink];
+    }
+}
+
+- (void)_startDisplayLink
+{    
+    if (!_displayLink) {
+        _displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(_handleDisplayLink)];
+        [_displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
+    }
+}
+
+- (void)_stopDisplayLink
+{
+    if (_displayLink) {
+        [_displayLink invalidate];
+        _displayLink = nil;
+    }
+}
+
+- (void)_handleDisplayLink
+{
+    for (id<WXDisplayLinkClient> client in _displayArray) {
+        if (!client.suspend) {
+            [client handleDisplayLink];
+        }
+    }
+}
+
+@end
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.mm b/ios/sdk/WeexSDK/Sources/Model/WXComponent.mm
index 1be920fb6d..7883cce317 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.mm
@@ -44,6 +44,7 @@
 #import "WXSDKEngine.h"
 #import "WXSDKInstance_performance.h"
 #import "WXComponent_performance.h"
+#import "WXCoreBridge.h"
 
 #pragma clang diagnostic ignored "-Wincomplete-implementation"
 #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
@@ -99,7 +100,6 @@ - (instancetype)initWithRef:(NSString *)ref
         
         _displayType = WXDisplayTypeBlock;
         _isNeedJoinLayoutSystem = YES;
-        _isLayoutDirty = YES;
         _isViewFrameSyncWithCalculated = YES;
         _ariaHidden = nil;
         _accessible = nil;
@@ -152,7 +152,6 @@ - (instancetype)initWithRef:(NSString *)ref
 #endif
         [self _setupNavBarWithStyles:_styles attributes:_attributes];
 
-        [self _initCSSNodeWithStyles:_styles];
         [self _initViewPropertyWithStyles:_styles];
         [self _initCompositingAttribute:_attributes];
         [self _handleBorders:styles isUpdating:NO];
@@ -171,41 +170,40 @@ - (instancetype)initWithRef:(NSString *)ref
 
 - (id)copyWithZone:(NSZone *)zone
 {
-    NSInteger copyId = 0;
-    @synchronized(self){
-        static NSInteger __copy = 0;
-        copyId = __copy % (1024*1024);
-        __copy++;
-    }
-    NSString *copyRef = [NSString stringWithFormat:@"%ldcopy_of%@", (long)copyId, _isTemplate ? self.ref : self->_templateComponent.ref];
-    WXComponent *component = [[[self class] allocWithZone:zone] initWithRef:copyRef type:self.type styles:self.styles attributes:self.attributes events:self.events weexInstance:self.weexInstance];
+    static std::atomic<long> __copy(0);
+    long copyId = __copy ++;
+    copyId %= (1024 * 1024);
+    NSString *copyRef = [NSString stringWithFormat:@"%ldcopy_of%@", copyId, _isTemplate ? self.ref : self->_templateComponent.ref];
+    
+    // first, copy weex core render object
+    void* copiedRenderObject = [WXCoreBridge copyRenderObject:_flexCssNode replacedRef:copyRef];
+    WXAssert(copiedRenderObject != nullptr, @"cannot copy render object.");
+    
+    // second, alloc new WXComponent
+    WXComponent *component = [[self class] allocWithZone:zone];
+    [component _setRenderObject:copiedRenderObject];
+    component = [component initWithRef:copyRef type:self.type styles:self.styles attributes:self.attributes events:self.events weexInstance:self.weexInstance];
     if (_isTemplate) {
         component->_templateComponent = self;
-    } else {
+    }
+    else {
         component->_templateComponent = self->_templateComponent;
     }
-    //memcpy((void*)component->_flexCssNode,self.flexCssNode,sizeof(WeexCore::WXCoreLayoutNode));
-    component->_flexCssNode->copyStyle(self.flexCssNode);
-    component->_flexCssNode->copyMeasureFunc(self.flexCssNode);
-    component->_flexCssNode->setContext((__bridge void *)component);
     component->_calculatedFrame = self.calculatedFrame;
     
-    NSMutableArray *subcomponentsCopy = [NSMutableArray array];
-    
-        component->_subcomponents = subcomponentsCopy;
-        NSUInteger count = [self.subcomponents count];
-        for (NSInteger i = 0 ; i < count;i++){
-            WXComponent *subcomponentCopy = [[self.subcomponents objectAtIndex:i] copy];
-            [component _insertSubcomponent:subcomponentCopy atIndex:i];
+    // third, copy children
+    NSUInteger count = [self.subcomponents count];
+    for (NSInteger i = 0; i < count; i ++) {
+        WXComponent *subcomponentCopy = [[self.subcomponents objectAtIndex:i] copy];
+        BOOL inserted = [component _insertSubcomponent:subcomponentCopy atIndex:i];
+        if (inserted) {
+            // add to layout tree
+            [WXCoreBridge addChildRenderObject:subcomponentCopy->_flexCssNode toParent:component->_flexCssNode];
         }
-//    else{
-//        for (WXComponent *subcomponent in self.subcomponents) {
-//            WXComponent *subcomponentCopy = [subcomponent copy];
-//            subcomponentCopy->_supercomponent = component;
-//            [subcomponentsCopy addObject:subcomponentCopy];
-//        }
-//        component->_subcomponents = subcomponentsCopy;
-//    }
+        else {
+            WXLogError(@"fail to insert copied component.");
+        }
+    }
     
     WXPerformBlockOnComponentThread(^{
         [self.weexInstance.componentManager addComponent:component toIndexDictForRef:copyRef];
@@ -229,13 +227,6 @@ - (void)dealloc
     if (_positionType == WXPositionTypeFixed) {
         [self.weexInstance.componentManager removeFixedComponent:self];
     }
-    if(_flexCssNode){
-#ifdef DEBUG
-        WXLogDebug(@"flexLayout -> dealloc %@",self.ref);
-#endif
-        [WXComponent recycleNodeOnComponentThread:_flexCssNode gabRef:_ref];
-        _flexCssNode=nullptr;
-    }
     
     // remove all gesture and all
     if (_isTemplate && self.attributes[@"@templateId"]) {
@@ -266,7 +257,6 @@ - (void)dealloc
 
     pthread_mutex_destroy(&_propertyMutex);
     pthread_mutexattr_destroy(&_propertMutexAttr);
-
 }
 
 - (NSDictionary *)styles
@@ -319,14 +309,12 @@ - (void)setDisplayType:(WXDisplayType)displayType
         _displayType = displayType;
         if (displayType == WXDisplayTypeNone) {
             _isNeedJoinLayoutSystem = NO;
-            [self.supercomponent _recomputeCSSNodeChildren];
             [self _removeFromSupercomponent];
             WXPerformBlockOnMainThread(^{
                 [self removeFromSuperview];
             });
         } else {
             _isNeedJoinLayoutSystem = YES;
-            [self.supercomponent _recomputeCSSNodeChildren];
             WXPerformBlockOnMainThread(^{
                 [self _buildViewHierarchyLazily];
                 // TODO: insert into the correct index
@@ -505,6 +493,29 @@ - (CGRect)calculatedFrame
     return _calculatedFrame;
 }
 
+- (CGFloat)_getInnerContentMainSize
+{
+    return -1.0f;
+}
+
+- (void)_assignInnerContentMainSize:(CGFloat)value
+{
+}
+
+- (BOOL)_isCaculatedFrameChanged:(CGRect)frame
+{
+    return !CGRectEqualToRect(frame, _calculatedFrame);
+}
+
+- (void)_layoutPlatform
+{
+}
+
+- (void)_assignCalculatedFrame:(CGRect)frame
+{
+    _calculatedFrame = frame;
+}
+
 - (CGPoint)absolutePosition
 {
     return _absolutePosition;
@@ -547,12 +558,17 @@ - (WXComponent *)supercomponent
     return _supercomponent;
 }
 
-- (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
+- (BOOL)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
 {
     WXAssert(subcomponent, @"The subcomponent to insert to %@ at index %d must not be nil", self, index);
+    
+    if (subcomponent == nil) {
+        return NO;
+    }
+    
     if (index > [_subcomponents count]) {
         WXLogError(@"the index of inserted %ld is out of range as the current is %lu", (long)index, (unsigned long)[_subcomponents count]);
-        return;
+        return NO;
     }
     
     subcomponent->_supercomponent = self;
@@ -569,37 +585,22 @@ - (void)_insertSubcomponent:(WXComponent *)subcomponent atIndex:(NSInteger)index
     if (_useCompositing || _isCompositingChild) {
         subcomponent->_isCompositingChild = YES;
     }
-        if (subcomponent->_isNeedJoinLayoutSystem) {
-            NSInteger actualIndex = [self getActualNodeIndex:subcomponent atIndex:index];
-            [self _insertChildCssNode:subcomponent atIndex:actualIndex];
-        }else{
-#ifdef DEBUG
-            WXLogDebug(@"flexLayout -> no need JoinLayoutSystem parent ref:%@ type:%@, self ref:%@ type:%@ ",
-                  self.ref,
-                  self.type,
-                  subcomponent.ref,
-                  subcomponent.type
-                  );
-#endif
-        }
     
-    [self _recomputeCSSNodeChildren];
     [self setNeedsLayout];
+    
+    return YES;
 }
 
 - (void)_removeSubcomponent:(WXComponent *)subcomponent
 {
     pthread_mutex_lock(&_propertyMutex);
     [_subcomponents removeObject:subcomponent];
-        //subcomponent->_isNeedJoinLayoutSystem = NO;
-        [self _rmChildCssNode:subcomponent];
     pthread_mutex_unlock(&_propertyMutex);
 }
 
 - (void)_removeFromSupercomponent
 {
     [self.supercomponent _removeSubcomponent:self];
-    [self.supercomponent _recomputeCSSNodeChildren];
     [self.supercomponent setNeedsLayout];
     
     if (_positionType == WXPositionTypeFixed) {
@@ -619,7 +620,6 @@ - (void)_moveToSupercomponent:(WXComponent *)newSupercomponent atIndex:(NSUInteg
 
 - (void)_didInserted
 {
-    
 }
 
 - (id<WXScrollerProtocol>)ancestorScroller
@@ -639,9 +639,19 @@ - (void)_didInserted
 }
 
 #pragma mark Updating
+
+- (BOOL)_isTransitionNone
+{
+    return _transition == nil || _transition.transitionOptions == WXTransitionOptionsNone;
+}
+
+- (BOOL)_hasTransitionPropertyInStyles:(NSDictionary *)styles
+{
+    return [_transition _hasTransitionOptionInStyles:styles];
+}
+
 - (void)_updateStylesOnComponentThread:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:(BOOL)isUpdateStyles
 {
-    
     BOOL isTransitionTag = _transition ? [self _isTransitionTag:styles] : NO;
     if (isTransitionTag) {
         [_transition _handleTransitionWithStyles:[styles mutableCopy] resetStyles:resetStyles target:self];
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
index 95fa7f24ff..749462abea 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.h
@@ -141,6 +141,11 @@ typedef NS_ENUM(NSInteger, WXErrorCode) {//error.code
  */
 @property (nonatomic, strong) NSString * bundleType;
 
+/**
+ *  Which decide whether to use data render,default value is false
+ */
+@property (nonatomic, assign, readonly) BOOL dataRender;
+
 /**
  *  The callback triggered when the instance fails to render.
  *
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
index d10d868362..24e213fa0c 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m
@@ -51,6 +51,7 @@
 #import "WXJSCoreBridge.h"
 #import "WXSDKInstance_performance.h"
 #import "WXPageEventNotifyEvent.h"
+#import "WXCoreBridge.h"
 
 NSString *const bundleUrlOptionKey = @"bundleUrl";
 
@@ -74,12 +75,12 @@ @implementation WXSDKInstance
     WXRootView *_rootView;
     WXThreadSafeMutableDictionary *_moduleEventObservers;
     BOOL _performanceCommit;
-    BOOL _needDestroy;
     BOOL _syncDestroyComponentManager;
     BOOL _debugJS;
     id<WXBridgeProtocol> _instanceJavaScriptContext; // sandbox javaScript context    
     CGFloat _defaultPixelScaleFactor;
     BOOL _bReleaseInstanceInMainThread;
+    BOOL _defaultDataRender;
 }
 
 - (void)dealloc
@@ -128,6 +129,7 @@ - (instancetype)init
         }
         _defaultPixelScaleFactor = CGFLOAT_MIN;
         _bReleaseInstanceInMainThread = YES;
+        _defaultDataRender = NO;
         
         [self addObservers];
     }
@@ -149,8 +151,9 @@ - (instancetype)init
         _instanceJavaScriptContext = nil;
     }
     
+    // WXDebugger is a singleton actually and should not call its init twice.
     _instanceJavaScriptContext = _debugJS ? [NSClassFromString(@"WXDebugger") alloc] : [[WXJSCoreBridge alloc] init];
-    if(!_debugJS) {
+    if (!_debugJS) {
         id<WXBridgeProtocol> jsBridge = [[WXSDKManager bridgeMgr] valueForKeyPath:@"bridgeCtx.jsBridge"];
         JSContext* globalContex = jsBridge.javaScriptContext;
         JSContextGroupRef contextGroup = JSContextGetGroup([globalContex JSGlobalContextRef]);
@@ -165,7 +168,7 @@ - (instancetype)init
         [_instanceJavaScriptContext setJSContext:instanceContext];
     }
     
-    if([_instanceJavaScriptContext respondsToSelector:@selector(setWeexInstanceId:)]) {
+    if ([_instanceJavaScriptContext respondsToSelector:@selector(setWeexInstanceId:)]) {
         [_instanceJavaScriptContext setWeexInstanceId:_instanceId];
     }
     if (!_debugJS) {
@@ -177,7 +180,8 @@ - (instancetype)init
 
 - (NSString *)description
 {
-    return [NSString stringWithFormat:@"<%@: %p; id = %@; rootView = %@; url= %@>", NSStringFromClass([self class]), self, _instanceId, _rootView, _scriptURL];
+    // get _rootView.frame in JS thread may cause deaklock.
+    return [NSString stringWithFormat:@"<%@: %p; id = %@; rootView = %p; url= %@>", NSStringFromClass([self class]), self, _instanceId, (__bridge void*)_rootView, _scriptURL];
 }
 
 #pragma mark Public Mehtods
@@ -187,7 +191,6 @@ - (UIView *)rootView
     return _rootView;
 }
 
-
 - (void)setFrame:(CGRect)frame
 {
 #ifdef DEBUG
@@ -212,6 +215,14 @@ - (void)setFrame:(CGRect)frame
     }
 }
 
+- (void)setViewportWidth:(CGFloat)viewportWidth
+{
+    _viewportWidth = viewportWidth;
+    
+    // notify weex core
+    [WXCoreBridge setViewportWidth:_instanceId width:viewportWidth];
+}
+
 - (void)renderWithURL:(NSURL *)url
 {
     [self renderWithURL:url options:nil data:nil];
@@ -314,8 +325,7 @@ - (void)_renderWithMainBundleString:(NSString *)mainBundleString
     // ensure default modules/components/handlers are ready before create instance
     [WXSDKEngine registerDefaults];
      [[NSNotificationCenter defaultCenter] postNotificationName:WX_SDKINSTANCE_WILL_RENDER object:self];
-     
-    _needDestroy = YES;
+    
     _mainBundleString = mainBundleString;
     if ([self _handleConfigCenter]) {
         int wxErrorCode = 9999;
@@ -327,7 +337,6 @@ - (void)_renderWithMainBundleString:(NSString *)mainBundleString
         return;
     }
     
-    _needDestroy = YES;
     [WXTracingManager startTracingWithInstanceId:self.instanceId ref:nil className:nil name:WXTExecJS phase:WXTracingBegin functionName:@"renderWithMainBundleString" options:@{@"threadName":WXTMainThread}];
     [[WXSDKManager bridgeMgr] createInstance:self.instanceId template:mainBundleString options:dictionary data:_jsData];
     [WXTracingManager startTracingWithInstanceId:self.instanceId ref:nil className:nil name:WXTExecJS phase:WXTracingEnd functionName:@"renderWithMainBundleString" options:@{@"threadName":WXTMainThread}];
@@ -533,7 +542,7 @@ - (void)destroyInstance
 {
     [self.apmInstance endRecord];
     NSString *url = @"";
-    if([WXPrerenderManager isTaskExist:[self.scriptURL absoluteString]]) {
+    if ([WXPrerenderManager isTaskExist:[self.scriptURL absoluteString]]) {
         url = [self.scriptURL absoluteString];
     }
     if (!self.instanceId) {
@@ -551,12 +560,6 @@ - (void)destroyInstance
 
     [WXPrerenderManager removePrerenderTaskforUrl:[self.scriptURL absoluteString]];
     [WXPrerenderManager destroyTask:self.instanceId];
-    
-    if (_needDestroy) {
-        [[WXSDKManager bridgeMgr] destroyInstance:self.instanceId];
-        _needDestroy = NO;
-    }
-
     [[WXSDKManager bridgeMgr] destroyInstance:self.instanceId];
     
     if (_componentManager) {
@@ -565,8 +568,17 @@ - (void)destroyInstance
     __weak typeof(self) weakSelf = self;
     WXPerformBlockOnComponentThread(^{
         __strong typeof(self) strongSelf = weakSelf;
+        if (strongSelf == nil) {
+            return;
+        }
+        
+        // Destroy components and views in main thread. Unbind with underneath RenderObjects.
         [strongSelf.componentManager unload];
-        //Reading config from orange for Release instance in Main Thread or not, for Bug #15172691 +{
+        
+        // Destroy weexcore c++ page and objects.
+        [WXCoreBridge closePage:strongSelf.instanceId];
+        
+        // Reading config from orange for Release instance in Main Thread or not, for Bug #15172691 +{
         if (!_bReleaseInstanceInMainThread) {
             [WXSDKManager removeInstanceforID:strongSelf.instanceId];
         } else {
@@ -576,10 +588,10 @@ - (void)destroyInstance
         }
         //+}
     });
-    if(url.length > 0){
+    
+    if (url.length > 0) {
         [WXPrerenderManager addGlobalTask:url callback:nil];
     }
-    
 }
 
 - (void)forceGarbageCollection
@@ -681,6 +693,14 @@ - (CGFloat)pixelScaleFactor
     }
 }
 
+- (BOOL)dataRender
+{
+    if ([_options[@"DATA_RENDER"] boolValue]) {
+        return YES;
+    }
+    return _defaultDataRender;
+}
+
 - (NSURL *)completeURL:(NSString *)url
 {
     if (!_scriptURL) {
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
index bbc8f90d72..ffe9d85303 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance_performance.m
@@ -29,14 +29,12 @@
 #import "WXUtility.h"
 
 @interface WXPerformance()
-@property (nonatomic ,assign) bool hasRecordFsRenderTimeByPosition;
-@property (nonatomic ,assign) double interactionAddCountRecord;
+@property (nonatomic, assign) bool hasRecordFsRenderTimeByPosition;
+@property (nonatomic, assign) double interactionAddCountRecord;
 @end
 
 @implementation WXPerformance
 
-
-
 - (void) recordComponentCreatePerformance:(double) diffTime forComponent:(WXComponent *)targetComponent
 {
     self.componentCount++;
@@ -44,7 +42,8 @@ - (void) recordComponentCreatePerformance:(double) diffTime forComponent:(WXComp
 }
 
 /** on UI thread **/
-- (void)onViewLoad:(WXComponent *)targetComponent{
+- (void)onViewLoad:(WXComponent *)targetComponent
+{
     if (targetComponent.hasAdd) {
         return;
     }
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
index bf1e15b3c9..f7f5dfe3e5 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXDomModule.m
@@ -29,6 +29,7 @@
 #import "WXSDKInstance.h"
 #import "WXTracingManager.h"
 #import "WXRecycleListComponent.h"
+#import "WXCoreBridge.h"
 #import <objc/message.h>
 
 @interface WXDomModule ()
@@ -71,6 +72,7 @@ - (void)performBlockOnComponentManager:(void(^)(WXComponentManager *))block
         block(manager);
     });
 }
+
 - (void)performSelectorOnRuleManager:(void(^)(void))block{
     if (!block) {
         return;
@@ -85,69 +87,85 @@ - (NSThread *)targetExecuteThread
     return [WXComponentManager componentThread];
 }
 
-- (void)createBody:(NSDictionary *)body
+- (void)createBody:(NSDictionary *)bodyData
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager createRoot:body];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:bodyData[@"ref"] className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"createBody" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callCreateBody:instanceId data:bodyData];
+    });
 }
 
-- (void)addElement:(NSString *)parentRef element:(NSDictionary *)element atIndex:(NSInteger)index
+- (void)addElement:(NSString *)parentRef element:(NSDictionary *)elementData atIndex:(NSInteger)index
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager addComponent:element toSupercomponent:parentRef atIndex:index appendingInTree:NO];
-    }];
-    [WXTracingManager startTracingWithInstanceId:self.weexInstance.instanceId ref:nil className:nil name:@"dom" phase:WXTracingEnd functionName:@"addElement" options:nil];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:elementData[@"ref"] className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"addElement" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callAddElement:instanceId parentRef:parentRef data:elementData index:(int)index];
+    });
 }
 
 - (void)removeElement:(NSString *)ref
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager removeComponent:ref];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"removeElement" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callRemoveElement:instanceId ref:ref];
+    });
 }
 
-- (void)moveElement:(NSString *)elemRef parentRef:(NSString *)parentRef index:(NSInteger)index
+- (void)moveElement:(NSString *)ref parentRef:(NSString *)parentRef index:(NSInteger)index
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager moveComponent:elemRef toSuper:parentRef atIndex:index];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"moveElement" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callMoveElement:instanceId ref:ref parentRef:parentRef index:(int)index];
+    });
 }
 
-- (void)addEvent:(NSString *)elemRef event:(NSString *)event
+- (void)addEvent:(NSString *)ref event:(NSString *)event
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager addEvent:event toComponent:elemRef];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"addEvent" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callAddEvent:instanceId ref:ref event:event];
+    });
 }
 
-- (void)removeEvent:(NSString *)elemRef event:(NSString *)event
+- (void)removeEvent:(NSString *)ref event:(NSString *)event
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager removeEvent:event fromComponent:elemRef];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"removeEvent" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callRemoveEvent:instanceId ref:ref event:event];
+    });
 }
 
 - (void)createFinish
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager createFinish];
-    }];
-    [WXTracingManager startTracingWithInstanceId:self.weexInstance.instanceId ref:nil className:nil name:@"dom" phase:WXTracingEnd functionName:@"createFinish" options:nil];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"createFinish" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callCreateFinish:instanceId];
+    });
 }
 
 - (void)updateFinish
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager updateFinish];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"updateFinish" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callUpdateFinish:instanceId];
+    });
 }
 
 - (void)refreshFinish
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager refreshFinish];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:nil className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"refreshFinish" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callRefreshFinish:instanceId];
+    });
 }
 
 - (void)scrollToElement:(NSString *)elemRef options:(NSDictionary *)dict
@@ -157,18 +175,22 @@ - (void)scrollToElement:(NSString *)elemRef options:(NSDictionary *)dict
     }];
 }
 
--(void)updateStyle:(NSString *)elemRef styles:(NSDictionary *)styles
+- (void)updateStyle:(NSString *)ref styles:(NSDictionary *)styles
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager updateStyles:styles forComponent:elemRef];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"updateStyle" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callUpdateStyle:instanceId ref:ref data:styles];
+    });
 }
 
-- (void)updateAttrs:(NSString *)elemRef attrs:(NSDictionary *)attrs
+- (void)updateAttrs:(NSString *)ref attrs:(NSDictionary *)attrs
 {
-    [self performBlockOnComponentManager:^(WXComponentManager *manager) {
-        [manager updateAttributes:attrs forComponent:elemRef];
-    }];
+    NSString* instanceId = self.weexInstance.instanceId;
+    WXPerformBlockOnComponentThread(^{
+        [WXTracingManager startTracingWithInstanceId:instanceId ref:ref className:nil name:WXTDomCall phase:WXTracingBegin functionName:@"updateAttrs" options:@{@"threadName":WXTDOMThread}];
+        [WXCoreBridge callUpdateAttrs:instanceId ref:ref data:attrs];
+    });
 }
 
 - (void)addRule:(NSString*)type rule:(NSDictionary *)rule {
@@ -179,7 +201,6 @@ - (void)addRule:(NSString*)type rule:(NSDictionary *)rule {
     [self performSelectorOnRuleManager:^{
         [WXRuleManager sharedInstance].instance = weexInstance;
         [[WXRuleManager sharedInstance] addRule:type rule:rule];
-        
     }];
 }
 
@@ -239,8 +260,13 @@ - (void)updateComponentData:(NSString*)componentDataId componentData:(NSDictiona
 
 - (void)destroyInstance
 {
+    NSString* instanceId = self.weexInstance.instanceId;
     [self performBlockOnComponentManager:^(WXComponentManager *manager) {
+        [manager invalidate];
         [manager unload];
+        
+        // Destroy weexcore c++ page and objects.
+        [WXCoreBridge closePage:instanceId];
     }];
 }
 
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m
index 2002d9510f..6adf919717 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXPrerenderManager.m
@@ -297,7 +297,7 @@ + (void)renderFromCache:(NSString *)url
         }
         WXPerformBlockOnComponentThread(^{
             [task.instance.componentManager startComponentTasks];
-            [task.instance.componentManager excutePrerenderUITask:url];
+            [task.instance.componentManager executePrerenderUITask:url];
             task.instance.needPrerender = NO;
         });
         WXPerformBlockOnBridgeThread(^(){
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.h b/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
index 92ea0cffc5..62554714d0 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
@@ -52,6 +52,7 @@ typedef NS_OPTIONS(NSUInteger, WXTransitionOptions) {
 @property(nonatomic,assign) WXTransitionOptions transitionOptions;
 - (instancetype) initWithStyles:(NSDictionary *)styles;
 - (void)_handleTransitionWithStyles:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles  target:(WXComponent *)targetComponent;
+- (BOOL)_hasTransitionOptionInStyles:(NSDictionary *)styles;
 @end
 
 
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm b/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm
index d185981dc7..53b6b31d3c 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.mm
@@ -75,17 +75,17 @@ - (instancetype)initWithStyles:(NSDictionary *)styles
 #pragma mark - HandleStyle
 - (WXTransitionOptions)transitionOptionsFromString:(NSString *)string
 {
-    NSDictionary<NSString*,NSNumber*> *options = @{
-                                                  @"width": @(WXTransitionOptionsWidth),
-                                                  @"height": @(WXTransitionOptionsHeight),
-                                                  @"right": @(WXTransitionOptionsRight),
-                                                  @"left": @(WXTransitionOptionsLeft),
-                                                  @"bottom": @(WXTransitionOptionsBottom),
-                                                  @"top": @(WXTransitionOptionsTop),
-                                                  @"backgroundColor": @(WXTransitionOptionsBackgroundColor),
-                                                  @"transform": @(WXTransitionOptionsTransform),
-                                                  @"opacity": @(WXTransitionOptionsOpacity),
-                                                  };
+    static NSDictionary<NSString*, NSNumber*> *options = @{
+                                                           @"width": @(WXTransitionOptionsWidth),
+                                                           @"height": @(WXTransitionOptionsHeight),
+                                                           @"right": @(WXTransitionOptionsRight),
+                                                           @"left": @(WXTransitionOptionsLeft),
+                                                           @"bottom": @(WXTransitionOptionsBottom),
+                                                           @"top": @(WXTransitionOptionsTop),
+                                                           @"backgroundColor": @(WXTransitionOptionsBackgroundColor),
+                                                           @"transform": @(WXTransitionOptionsTransform),
+                                                           @"opacity": @(WXTransitionOptionsOpacity)
+                                                           };
     return options[string].integerValue;
 }
 
@@ -109,7 +109,13 @@ - (void)_handleTransitionWithStyles:(NSDictionary *)styles resetStyles:(NSMutabl
             [_filterStyles setObject:styles[key] forKey:key];
             if (![key isEqualToString:@"transform"]) {
                 if (!isRunning) {
-                    [_oldFilterStyles setObject:targetComponent.styles[key] forKey:key];
+                    /* style value may not be in component.styles, so we must get
+                     value from layout and convert it to style value. */
+                    id styleValue = targetComponent.styles[key];
+                    if (styleValue == nil) {
+                        styleValue = [targetComponent convertLayoutValueToStyleValue:key];
+                    }
+                    [_oldFilterStyles setObject:styleValue forKey:key];
                 }
             }
         }
@@ -144,6 +150,16 @@ - (void)_handleTransitionWithStyles:(NSDictionary *)styles resetStyles:(NSMutabl
     [self performSelector:@selector(_startTransitionDisplayLink) withObject:self afterDelay:_transitionDelay/1000];
 }
 
+- (BOOL)_hasTransitionOptionInStyles:(NSDictionary *)styles
+{
+    for (NSString *key in styles) {
+        if (self.transitionOptions & [self transitionOptionsFromString:key]) {
+            return YES;
+        }
+    }
+    return NO;
+}
+
 - (void)updateFutileStyles:(NSDictionary *)styles resetStyles:(NSMutableArray *)resetStyles target:(WXComponent *)targetComponent
 {
     [targetComponent _updateCSSNodeStyles:styles];
diff --git a/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h b/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
index e8dc9be552..90bb9556e3 100644
--- a/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
+++ b/ios/sdk/WeexSDK/Sources/Protocol/WXBridgeProtocol.h
@@ -29,6 +29,8 @@ typedef NSInteger(^WXJSCallUpdateStyle)(NSString *instanceId,NSString *ref,NSDic
 typedef NSInteger(^WXJSCallAddEvent)(NSString *instanceId,NSString *ref,NSString *event);
 typedef NSInteger(^WXJSCallRemoveEvent)(NSString *instanceId,NSString *ref,NSString *event);
 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 void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componentRef, NSString *methodName, NSArray *args, NSDictionary *options);
 
@@ -53,17 +55,13 @@ typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componen
  */
 - (JSValue *)callJSMethod:(NSString *)method args:(NSArray*)args;
 
-/**
- * Register callback when call native tasks occur
- */
-- (void)registerCallNative:(WXJSCallNative)callNative;
-
 /**
  * Reset js engine environment, called when any environment variable is changed.
  */
 - (void)resetEnvironment;
 
 @optional
+
 /**
  * Remove instance's timer.
  */
@@ -74,6 +72,13 @@ typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componen
  */
 - (void)garbageCollect;
 
+@required
+
+/**
+ * Register callback when call native tasks occur
+ */
+- (void)registerCallNative:(WXJSCallNative)callNative;
+
 /**
  * Register callback when addElement tasks occur
  */
@@ -98,22 +103,27 @@ typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componen
  * Register callback when updateAttrs tasks occur
  */
 - (void)registerCallUpdateAttrs:(WXJSCallUpdateAttrs)callUpdateAttrs;
+
 /**
  * Register callback when updateStyle tasks occur
  */
 - (void)registerCallUpdateStyle:(WXJSCallUpdateStyle)callUpdateStyle;
+
 /**
  * Register callback when addEvent tasks occur
  */
 - (void)registerCallAddEvent:(WXJSCallAddEvent)callAddEvent;
+
 /**
  * Register callback when removeEvent tasks occur
  */
 - (void)registerCallRemoveEvent:(WXJSCallRemoveEvent)callRemoveEvent;
+
 /**
  * Register callback when createFinish tasks occur
 */
 - (void)registerCallCreateFinish:(WXJSCallCreateFinish)callCreateFinish;
+
 /**
  * Register callback for global js function `callNativeModule`
  */
@@ -126,6 +136,16 @@ typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componen
 
 @optional
 
+/**
+ * Register callback when refreshFinish tasks occur
+ */
+- (void)registerCallRefreshFinish:(WXJSCallRefreshFinish)callRefreshFinish;
+
+/**
+ * Register callback when updateFinish tasks occur
+ */
+- (void)registerCallUpdateFinish:(WXJSCallUpdateFinish)callUpdateFinish;
+
 /*
  * Executes the specified JavaScript code, treating the specified URL as its source location.
  * Evaluating a script runs any top-level code and adds function or object definitions to the brige’s global object.
@@ -148,4 +168,5 @@ typedef void (^WXJSCallNativeComponent)(NSString *instanceId, NSString *componen
  * javaScript runtime context
  */
 - (JSContext*)javaScriptContext;
+
 @end
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXAssert.h b/ios/sdk/WeexSDK/Sources/Utility/WXAssert.h
index 9ebba75b9e..7937c4bf4e 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXAssert.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXAssert.h
@@ -73,7 +73,6 @@ WXAssert([[NSThread currentThread].name isEqualToString:WX_COMPONENT_THREAD_NAME
 WXAssert([[NSThread currentThread].name isEqualToString:WX_BRIDGE_THREAD_NAME], \
 @"must be called on the bridge thread")
 
-
 #define WXAssertNotReached() \
 WXAssert(NO, @"should never be reached")
 
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
index 2f13262053..34767b0146 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXUtility.m
@@ -258,19 +258,10 @@ + (NSString *)userAgent
 
 + (id)objectFromJSON:(NSString *)json
 {
-    if (!json) return nil;
-    
-    NSData *data = [json dataUsingEncoding:NSUTF8StringEncoding];
-    NSError *error = nil;
-    id obj = [NSJSONSerialization JSONObjectWithData:data
-                                             options:NSJSONReadingAllowFragments | NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves
-                                               error:&error];
-    if(error){
-        WXLogError(@"%@", [error description]);
-        return nil;
-    }
-    
-    return obj;
+    // in weex there are cases that json is empty container
+    if ([json isEqualToString:@"{}"]) return @{}.mutableCopy;
+    if ([json isEqualToString:@"[]"]) return @[].mutableCopy;
+    return [self JSONObject:[json dataUsingEncoding:NSUTF8StringEncoding] error:nil];
 }
 
 + (id)JSONObject:(NSData*)data error:(NSError **)error
@@ -282,7 +273,9 @@ + (id)JSONObject:(NSData*)data error:(NSError **)error
                                                   options:NSJSONReadingAllowFragments | NSJSONReadingMutableContainers | NSJSONReadingMutableLeaves
                                                     error:error];
     } @catch (NSException *exception) {
-        *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:-1 userInfo:@{NSLocalizedDescriptionKey: [exception description]}];
+        if (error) {
+            *error = [NSError errorWithDomain:WX_ERROR_DOMAIN code:-1 userInfo:@{NSLocalizedDescriptionKey: [exception description]}];
+        }
     }
     return jsonObj;
 }
@@ -291,37 +284,43 @@ + (NSString *)JSONString:(id)object
 {
     if(!object) return nil;
     
-    NSError *error = nil;
-    if([object isKindOfClass:[NSArray class]] || [object isKindOfClass:[NSDictionary class]]){
-        NSData *data = [NSJSONSerialization dataWithJSONObject:object
-                                                       options:NSJSONWritingPrettyPrinted
-                                                         error:&error];
-        if (error) {
-            WXLogError(@"%@", [error description]);
-            return nil;
-        }
-        
-        return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+    @try {
     
-    } else if ([object isKindOfClass:[NSString class]]) {
-        NSArray *array = @[object];
-        NSData *data = [NSJSONSerialization dataWithJSONObject:array
-                                                       options:NSJSONWritingPrettyPrinted
-                                                         error:&error];
-        if (error) {
-            WXLogError(@"%@", [error description]);
-            return nil;
-        }
+        NSError *error = nil;
+        if ([object isKindOfClass:[NSArray class]] || [object isKindOfClass:[NSDictionary class]]) {
+            NSData *data = [NSJSONSerialization dataWithJSONObject:object
+                                                           options:NSJSONWritingPrettyPrinted
+                                                             error:&error];
+            if (error) {
+                WXLogError(@"%@", [error description]);
+                return nil;
+            }
+            
+            return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
         
-        NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-        if (string.length <= 4) {
-            WXLogError(@"json convert length less than 4 chars.");
+        } else if ([object isKindOfClass:[NSString class]]) {
+            NSArray *array = @[object];
+            NSData *data = [NSJSONSerialization dataWithJSONObject:array
+                                                           options:NSJSONWritingPrettyPrinted
+                                                             error:&error];
+            if (error) {
+                WXLogError(@"%@", [error description]);
+                return nil;
+            }
+            
+            NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+            if (string.length <= 4) {
+                WXLogError(@"json convert length less than 4 chars.");
+                return nil;
+            }
+            
+            return [string substringWithRange:NSMakeRange(2, string.length - 4)];
+        } else {
+            WXLogError(@"object isn't avaliable class");
             return nil;
         }
         
-        return [string substringWithRange:NSMakeRange(2, string.length - 4)];
-    } else {
-        WXLogError(@"object isn't avaliable class");
+    } @catch (NSException *exception) {
         return nil;
     }
 }
diff --git a/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.mm b/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.mm
index 1fccb5c209..0b7c019a52 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.mm
+++ b/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.mm
@@ -230,11 +230,9 @@ - (void)_updateViewStyles:(NSDictionary *)styles
             if (positionType == WXPositionTypeFixed) {
                 [self.weexInstance.componentManager addFixedComponent:self];
                 _isNeedJoinLayoutSystem = NO;
-                [self.supercomponent _recomputeCSSNodeChildren];
             } else if (_positionType == WXPositionTypeFixed) {
                 [self.weexInstance.componentManager removeFixedComponent:self];
                 _isNeedJoinLayoutSystem = YES;
-                [self.supercomponent _recomputeCSSNodeChildren];
             }
             
             _positionType = positionType;
diff --git a/ios/sdk/WeexSDK/Sources/WeexSDK.h b/ios/sdk/WeexSDK/Sources/WeexSDK.h
index fa1648b6ca..67c8e4a3a5 100644
--- a/ios/sdk/WeexSDK/Sources/WeexSDK.h
+++ b/ios/sdk/WeexSDK/Sources/WeexSDK.h
@@ -19,6 +19,9 @@
 
 #ifdef __OBJC__
 
+#import "style.h"
+#import "layout.h"
+#import "flex_enum.h"
 #import "WXWebSocketHandler.h"
 #import "WXVoiceOverModule.h"
 #import "WXView.h"
@@ -57,11 +60,9 @@
 #import "WXExceptionUtils.h"
 #import "WXEventModuleProtocol.h"
 #import "WXErrorView.h"
+#import "WXDisplayLinkManager.h"
 #import "WXDefine.h"
 #import "WXDebugTool.h"
-#import "WXCoreStyle.h"
-#import "WXCoreLayout.h"
-#import "WXCoreFlexEnum.h"
 #import "WXConvert.h"
 #import "WXConfigCenterProtocol.h"
 #import "WXComponentManager.h"
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index 73a8b38a0b..e4b8e26653 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -5,9 +5,11 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
 #add_compile_options(-std=c++11)
 add_compile_options(-fexceptions)
 
+
 add_definitions(-DGNU_SUPPORT=1)
 add_definitions(-DJSONCPP_NO_LOCALE_SUPPORT=1)
 add_definitions(-DDEBUG=1)
+add_definitions(-DOS_ANDROID=1)
 
 add_definitions(-DRENDER_LOG=0)
 add_definitions(-DPERFORMANCE_LOG=0)
@@ -16,7 +18,12 @@ add_definitions(-DJSAPI_LOG=0)
 add_definitions(-DDOM_PARSER_LOG=0)
 
 set(COMMON_SRCS
-
+  ./base/time_point.cc
+  ./base/thread/thread_impl_posix.cc
+  ./base/thread/thread_impl_android.cc
+  ./base/message_loop/message_loop.cc
+  ./base/message_loop/message_pump_posix.cc
+  ./base/message_loop/message_pump_android.cc
   ./core/render/manager/render_manager.cpp
   ./core/render/page/render_page.cpp
 
@@ -40,6 +47,7 @@ set(COMMON_SRCS
   ./core/render/action/render_action_update_attr.cpp
   ./core/render/action/render_action_update_style.cpp
   ./core/render/action/render_action_render_success.cpp
+  ./core/render/action/render_action_trigger_vsync.cpp
 
   ./core/layout/layout.cpp
   ./core/layout/style.cpp
@@ -49,27 +57,37 @@ set(COMMON_SRCS
   ./core/config/core_environment.cpp
 
   ./core/moniter/render_performance.cpp
-  ./core/manager/weex_core_manager.cpp
-  ./core/bridge/js_bridge.cpp
+  ./core/bridge/platform/core_side_in_platform.cpp
+  ./core/bridge/script/core_side_in_script.cpp
   ./core/parser/dom_wson.cpp
-   ./core/bridge/bridge.cpp
 
    ./core/data_render/ast.cc
+   ./core/data_render/ast_builder.cc
    ./core/data_render/ast_factory.cc
-   ./core/data_render/parser.cc
-   ./core/data_render/token.cc
+   ./core/data_render/class.cc
+   ./core/data_render/class_array.cc
+   ./core/data_render/class_json.cc
+   ./core/data_render/class_string.cc
+   ./core/data_render/class_factory.cc
    ./core/data_render/code_generator.cc
    ./core/data_render/exec_state.cc
-   ./core/data_render/vm.cc
+   ./core/data_render/object.cc
+   ./core/data_render/parser.cc
+   ./core/data_render/rax_jsx_ast.cc
+   ./core/data_render/rax_parser.cc
+   ./core/data_render/rax_parser_builder.cc
+   ./core/data_render/rax_parser_context.cc
+   ./core/data_render/rax_parser_scope.cc
+   ./core/data_render/rax_parser_statistics.cc
+   ./core/data_render/rax_source_locator.cc
    ./core/data_render/statement.cc
    ./core/data_render/string_table.cc
-   ./core/data_render/tokenizer.cc
-   ./core/data_render/expression_parser.cc
-   ./core/data_render/vm_mem.cc
-   ./core/data_render/object.cc
    ./core/data_render/table.cc
-   ./core/data_render/table_factory.cc
+   ./core/data_render/token.cc
+   ./core/data_render/tokenizer.cc
+   ./core/data_render/vm.cc
    ./core/data_render/vnode/vnode.cc
+   ./core/data_render/vnode/vcomponent.cc
    ./core/data_render/vnode/vnode_exec_env.cc
    ./core/data_render/vnode/vnode_render_manager.cc
    ./core/data_render/vnode/vnode_render_context.cc
@@ -99,20 +117,34 @@ if (ANDROID)
     ./android/base/string/scoped_jstring.cpp
     ./android/base/string/scoped_jstring_utf8.cpp
     ./android/base/string/jstring_cache.cpp
-    ./android/bridge/impl/bridge_impl_android.cpp
-    ./android/bridge/impl/weexcore_impl_android.cpp
-    ./android/bridge/impl/content_box_measurement_impl_android.cpp
-    ./android/bridge/impl/jsfunction_impl_android.cpp
-    ./android/bridge/impl/native_render_object_utils_impl_android.cpp
+    ./android/wrap/content_box_measurement_impl_android.cpp
+    ./android/wrap/jsfunction_impl_android.cpp
+    ./android/wrap/native_render_object_utils_impl_android.cpp
+    ./android/bridge/platform/android_side.cpp
+    ./android/bridge/platform/android_bridge.cpp
+    ./android/bridge/script/script_side_in_multi_so.cpp
+    ./android/bridge/script/script_side_in_multi_process.cpp
+    ./android/bridge/script_bridge_in_multi_so.cpp
+    ./android/bridge/script_bridge_in_multi_process.cpp
+
+    ./android/bridge/multi_process_and_so_initializer.cpp
+    ./android/bridge/multi_so_initializer.cpp
+    ./android/wrap/wml_bridge.cpp
+    ./android/utils/cache_utils.cpp
+    ./android/utils/params_utils.cpp
+    ./android/utils/so_utils.cpp
+    ./android/utils/IPCStringResult.cpp
+    ./android/wrap/log_utils.cpp
+    ./android/wrap/hash_set.cpp
+    ./android/wrap/wx_map.cpp
+    ./android/wrap/wx_js_object.cpp
+    ./android/wrap/wx_bridge.cpp
+    ./android/wrap/wx_params.cpp
+    ./android/base/jni_type.cpp
 
     ./android/jsengine/multiprocess/WeexJSConnection.cpp
-    ./android/jsengine/multiprocess/WeexProxy.cpp
     ./android/jsengine/multiprocess/ExtendJSApi.cpp
 
-
-    ./android/jsengine/api/WeexJSCoreApi.cpp
-     
-
   )
   SET(FINAL_ADD_LIBRARY
           ${FINAL_ADD_LIBRARY}
@@ -130,6 +162,12 @@ if (ANDROID)
 
 endif (ANDROID)
 
+##if(iOS)
+  add_definitions(-DTARGET_OS_IPHONE=1)
+
+##endif(iOS)
+
+
 add_library(${WEEXCORE_LIBRARY_NAME} SHARED ${FINAL_ADD_LIBRARY})
 target_include_directories(${WEEXCORE_LIBRARY_NAME} PUBLIC .)
 target_link_libraries(${WEEXCORE_LIBRARY_NAME} ${FINAL_TARGET_LINK_LIBRARIES})
diff --git a/weex_core/Source/IPC/IPCFutexPageQueue.cpp b/weex_core/Source/IPC/IPCFutexPageQueue.cpp
index aea941c787..8207f3e718 100644
--- a/weex_core/Source/IPC/IPCFutexPageQueue.cpp
+++ b/weex_core/Source/IPC/IPCFutexPageQueue.cpp
@@ -140,7 +140,7 @@ void IPCFutexPageQueue::lock(size_t id, bool checkFinish)
             volatile uint32_t* pageStart1 = static_cast<volatile uint32_t*>(getPage(1));
             volatile uint32_t* pageStart2 = static_cast<volatile uint32_t*>(getPage(2));
             volatile uint32_t* pageStart3 = static_cast<volatile uint32_t*>(getPage(3));
-            throw IPCException("futex lock pi failed: %s, %x %x (%x %x %x %x)", strerror(errno), *pageStart, m_tid, *pageStart0, *pageStart1, *pageStart2, *pageStart3);
+            throw IPCException("futex lock pi failed: %s, %x %d (%x %x %x %x)", strerror(errno), *pageStart, m_tid, *pageStart0, *pageStart1, *pageStart2, *pageStart3);
         }
         if (futexReturn == -1)
             continue;
diff --git a/weex_core/Source/IPC/IPCFutexPageQueue.h b/weex_core/Source/IPC/IPCFutexPageQueue.h
index e764aca926..6bc255c47e 100644
--- a/weex_core/Source/IPC/IPCFutexPageQueue.h
+++ b/weex_core/Source/IPC/IPCFutexPageQueue.h
@@ -47,7 +47,7 @@ class IPCFutexPageQueue {
     inline void* getCurrentWritePage() { return sizeof(uint32_t) * 2 + static_cast<char*>(getPage(m_currentWrite)); }
     inline size_t getPageSize() const { return m_pageSize - sizeof(uint32_t) * 2; }
 
-    static const size_t ipc_size = 4 * 1024 * 1024;
+    static const size_t ipc_size = 2 * 1024 * 1024;
 
 private:
     void unlock(size_t id);
diff --git a/weex_core/Source/IPC/IPCListener.cpp b/weex_core/Source/IPC/IPCListener.cpp
index 134d3cfc0e..fca06adc57 100644
--- a/weex_core/Source/IPC/IPCListener.cpp
+++ b/weex_core/Source/IPC/IPCListener.cpp
@@ -67,7 +67,8 @@ void IPCListenerImpl::listen()
         }
         std::unique_ptr<IPCArguments> arguments = assembleArguments();
         releaseBlob();
-        std::unique_ptr<IPCResult> sendBack = m_handler->handle(msg, arguments.get());
+        IPCArguments*  pArguments = arguments.get();
+        std::unique_ptr<IPCResult> sendBack = m_handler->handle(msg, pArguments);
         if (!isAsync) {
             std::unique_ptr<IPCBuffer> resultBuffer = generateResultBuffer(sendBack.get());
             doSendBufferOnly(resultBuffer.get());
diff --git a/weex_core/Source/IPC/IPCMessageJS.h b/weex_core/Source/IPC/IPCMessageJS.h
index 61c1de5215..5a8a86eee8 100644
--- a/weex_core/Source/IPC/IPCMessageJS.h
+++ b/weex_core/Source/IPC/IPCMessageJS.h
@@ -23,6 +23,7 @@
 #ifndef IPCMESSAGEJS_H
 #define IPCMESSAGEJS_H
 
+// Message from Platform to Script in ScriptBridge
 enum class IPCJSMsg {
     INITFRAMEWORK,
     EXECJSSERVICE,
@@ -41,6 +42,7 @@ enum class IPCJSMsg {
     DESTORYAPPCONTEXT,
 };
 
+// Message from Script to Core in ScriptBridge
 enum class IPCProxyMsg {
     SETJSFVERSION,
     REPORTEXCEPTION,
@@ -67,4 +69,79 @@ enum class IPCProxyMsg {
 	POSTMESSAGE,
   	DISPATCHMESSAGE,
 };
+// Message from Script to Core in ScriptBridge
+
+// Message from Core to Platform in PlatformBridge
+enum class IPCMsgFromCoreToPlatform {
+	INVOKE_MEASURE_FUNCTION = 100,
+	INVOKE_LAYOUT_BEFORE,
+	INVOKE_LAYOUT_AFTER,
+	SET_JS_VERSION,
+	REPORT_EXCEPTION,
+	CALL_NATIVE,
+	CALL_NATIVE_MODULE,
+	CALL_NATIVE_COMPONENT,
+	SET_TIMEOUT,
+	NATIVE_LOG,
+	UPDATE_FINISH,
+	REFRESH_FINISH,
+	ADD_EVENT,
+	REMOVE_EVENT,
+	CREATE_BODY,
+	ADD_ELEMENT,
+	LAYOUT,
+	UPDATE_STYLE,
+	UPDATE_ATTR,
+	CREATE_FINISH,
+	RENDER_SUCCESS,
+	REMOVE_ELEMENT,
+	MOVE_ELEMENT,
+	APPEND_TREE_CREATE_FINISH,
+	HAS_TRANSITION_PROS,
+	POST_MESSAGE,
+	DISPATCH_MESSAGE
+};
+
+// Message from Platform to Core in PlatformBridge
+enum class IPCMsgFromPlatformToCore {
+	SET_DEFAULT_HEIGHT_AND_WIDTH_INTO_ROOT_DOM = 100,
+	ON_INSTANCE_CLOSE,
+	SET_STYLE_WIDTH,
+	SET_STYLE_HEIGHT,
+	SET_MARGIN,
+	SET_PADDING,
+	SET_POSITION,
+	MARK_DIRTY,
+	SET_VIEWPORT_WIDTH,
+	FORCE_LAYOUT,
+	NOTIFY_LAYOUT,
+	GET_FIRST_SCREEN_RENDER_TIME,
+	GET_RENDER_FINISH_TIME,
+	SET_RENDER_CONTAINER_WRAP_CONTENT,
+	BIND_MEASUREMENT_TO_RENDER_OBJECT,
+	REGISTER_CORE_ENV,
+	GET_RENDER_OBJECT,
+	UPDATE_RENDER_OBJECT_STYLE,
+	UPDATE_RENDER_OBJECT_ATTR,
+	COPY_RENDER_OBJECT,
+	SET_MEASURE_FUNCTION_ADAPTER,
+	SET_PLATFORM,
+	SET_DEVICE_WIDTH_AND_HEIGHT,
+	ADD_OPTION,
+
+	INIT_FRAMEWORK,
+	INIT_APP_FRAMEWORK,
+	CREATE_APP_CONTEXT,
+	EXEC_JS_ON_APP_WITH_RESULT,
+	CALL_JS_ON_APP_CONTEXT,
+	DESTROY_APP_CONTEXT,
+	EXEC_JS_SERVICE,
+	EXEC_TIME_CALLBACK,
+	EXEC_JS,
+	EXEC_JS_WITH_RESULT,
+	CREATE_INSTANCE,
+	EXEC_JS_ON_INSTANCE,
+	DESTROY_INSTANCE,
+	UPDATE_GLOBAL_CONFIG
+};
 #endif /* IPCMESSAGEJS_H */
diff --git a/weex_core/Source/IPC/IPCResult.cpp b/weex_core/Source/IPC/IPCResult.cpp
index 1348bdc042..f86c6c54be 100644
--- a/weex_core/Source/IPC/IPCResult.cpp
+++ b/weex_core/Source/IPC/IPCResult.cpp
@@ -43,6 +43,11 @@ struct TypeTrait<int32_t> {
     static const IPCType s_type = IPCType::INT32;
 };
 
+template <>
+struct TypeTrait<int64_t> {
+    static const IPCType s_type = IPCType::INT64;
+};
+
 template <>
 struct TypeTrait<double> {
     static const IPCType s_type = IPCType::DOUBLE;
@@ -67,28 +72,6 @@ class ValueResult : public IPCResult {
     static const IPCType s_type = trait_type::s_type;
 };
 
-class StringResult : public IPCResult {
-public:
-    StringResult(JNIEnv* env, jstring val);
-    ~StringResult();
-
-    const void* getData() override;
-    IPCType getType() override;
-    const uint16_t* getStringContent() override;
-    size_t getStringLength() override;
-    const char* getByteArrayContent() override;
-    size_t getByteArrayLength() override;
-    void setJSON();
-
-private:
-    JNIEnv* m_env;
-    jstring m_value;
-    const jchar* m_cvalue{ nullptr };
-    size_t m_length{ 0U };
-    bool m_isJSON{ false };
-};
-
-
 class ByteArrayResult: public IPCResult{
 public:
     ByteArrayResult(const char* data, size_t length);
@@ -178,56 +161,6 @@ size_t ValueResult<T>::getByteArrayLength()
     return 0U;
 }
 
-StringResult::StringResult(JNIEnv* env, jstring val)
-    : m_env(env)
-    , m_value(static_cast<jstring>(env->NewLocalRef(val)))
-{
-    m_cvalue = env->GetStringChars(m_value, nullptr);
-    m_length = env->GetStringLength(m_value);
-}
-
-StringResult::~StringResult()
-{
-    if (m_cvalue)
-        m_env->ReleaseStringChars(m_value, m_cvalue);
-    m_env->DeleteLocalRef(m_value);
-}
-
-const void* StringResult::getData()
-{
-    return nullptr;
-}
-
-IPCType StringResult::getType()
-{
-    return m_isJSON ? IPCType::JSONSTRING : IPCType::STRING;
-}
-
-const uint16_t* StringResult::getStringContent()
-{
-    return m_cvalue;
-}
-
-size_t StringResult::getStringLength()
-{
-    return m_length;
-}
-
-const char* StringResult::getByteArrayContent()
-{
-    return nullptr;
-}
-
-size_t StringResult::getByteArrayLength()
-{
-    return 0U;
-}
-
-void StringResult::setJSON()
-{
-    m_isJSON = true;
-}
-
 ByteArrayResult::ByteArrayResult(const char* data, size_t length):m_length(length)
 {
     if(length > 0){
@@ -286,21 +219,14 @@ std::unique_ptr<IPCResult> createInt32Result(int32_t val)
     return std::unique_ptr<IPCResult>(new ValueResult<int32_t>(val));
 }
 
-std::unique_ptr<IPCResult> createDoubleResult(double val)
+std::unique_ptr<IPCResult> createInt64Result(int64_t val)
 {
-    return std::unique_ptr<IPCResult>(new ValueResult<double>(val));
-}
-
-std::unique_ptr<IPCResult> createStringResult(JNIEnv* env, jstring str)
-{
-    return std::unique_ptr<IPCResult>(new StringResult(env, str));
+    return std::unique_ptr<IPCResult>(new ValueResult<int64_t>(val));
 }
 
-std::unique_ptr<IPCResult> createJSONStringResult(JNIEnv* env, jstring str)
+std::unique_ptr<IPCResult> createDoubleResult(double val)
 {
-    std::unique_ptr<StringResult> result(new StringResult(env, str));
-    result->setJSON();
-    return std::unique_ptr<IPCResult>(result.release());
+    return std::unique_ptr<IPCResult>(new ValueResult<double>(val));
 }
 
 std::unique_ptr<IPCResult> createByteArrayResult(const char* data, size_t length){
diff --git a/weex_core/Source/IPC/IPCResult.h b/weex_core/Source/IPC/IPCResult.h
index 0452cfae0a..841d75552a 100644
--- a/weex_core/Source/IPC/IPCResult.h
+++ b/weex_core/Source/IPC/IPCResult.h
@@ -23,7 +23,6 @@
 #ifndef IPCRESULT_H
 #define IPCRESULT_H
 #include "IPCType.h"
-#include <jni.h>
 #include <memory>
 #include "IPCByteArray.h"
 
@@ -47,9 +46,8 @@ class IPCResult {
 
 std::unique_ptr<IPCResult> createVoidResult();
 std::unique_ptr<IPCResult> createInt32Result(int32_t val);
+std::unique_ptr<IPCResult> createInt64Result(int64_t val);
 std::unique_ptr<IPCResult> createDoubleResult(double val);
-std::unique_ptr<IPCResult> createStringResult(JNIEnv* env, jstring str);
-std::unique_ptr<IPCResult> createJSONStringResult(JNIEnv* env, jstring str);
 std::unique_ptr<IPCResult> createCharArrayResult(char* bytes);
 std::unique_ptr<IPCResult> createByteArrayResult(const char* data, size_t length);
 
diff --git a/weex_core/Source/android/base/jni/android_jni.cpp b/weex_core/Source/android/base/jni/android_jni.cpp
index f4e3574227..7385e7eb90 100644
--- a/weex_core/Source/android/base/jni/android_jni.cpp
+++ b/weex_core/Source/android/base/jni/android_jni.cpp
@@ -55,6 +55,7 @@ jclass GetClass(JNIEnv *env, const char *class_name, intptr_t *class_id) {
   ScopedGlobalJavaRef<jclass> clazz;
   clazz.Reset(env, GetClass(env, class_name));
   *class_id = reinterpret_cast<intptr_t>(clazz.Release());
+  return reinterpret_cast<jclass>(*class_id);
 }
 
 jmethodID GetMethod(JNIEnv *env, jclass clazz, MethodType type,
diff --git a/weex_core/Source/android/base/jni/scoped_java_ref.h b/weex_core/Source/android/base/jni/scoped_java_ref.h
index 2efae30758..caaa60d80b 100644
--- a/weex_core/Source/android/base/jni/scoped_java_ref.h
+++ b/weex_core/Source/android/base/jni/scoped_java_ref.h
@@ -76,7 +76,7 @@ class ScopedLocalJavaRef : public JavaRef {
       ResetNewLocalRef(env, obj);
     }
 
-    T Get() const { return (T)obj_; }
+    T Get() const { return static_cast<T>(obj_); }
 
 private:
     JNIEnv *env_;
@@ -115,6 +115,8 @@ class ScopedGlobalJavaRef : public JavaRef {
     void Reset(JNIEnv *env, jobject obj) {
       ResetNewGlobalRef(env, obj);
     }
+
+    T Get() const { return static_cast<T>(obj_); }
 };
 
 }  // namespace android
diff --git a/weex_core/Source/android/base/jni_type.cpp b/weex_core/Source/android/base/jni_type.cpp
new file mode 100644
index 0000000000..464f0e7f04
--- /dev/null
+++ b/weex_core/Source/android/base/jni_type.cpp
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "android/base/jni_type.h"
+#include "android/base/jni/android_jni.h"
+
+namespace base {
+namespace android {
+
+const char kDoubleClassPath[] = "java/lang/Double";
+jclass g_Double_clazz = nullptr;
+
+static intptr_t g_Double_doubleValue = 0;
+static jdouble Java_Double_doubleValue(JNIEnv* env, jobject obj) {
+  jmethodID method_id = base::android::GetMethod(
+      env, g_Double_clazz, base::android::INSTANCE_METHOD, "doubleValue", "()D",
+      &g_Double_doubleValue);
+  auto result = env->CallDoubleMethod(obj, method_id);
+  base::android::CheckException(env);
+  return result;
+}
+
+jdouble JNIType::DoubleValue(JNIEnv* env, jobject value) {
+  return Java_Double_doubleValue(env, value);
+}
+
+ScopedLocalJavaRef<jfloatArray> JNIType::NewFloatArray(JNIEnv* env, int length,
+                                                       float* array) {
+  jfloatArray jni_array = env->NewFloatArray(length);
+  env->SetFloatArrayRegion(jni_array, 0, length, array);
+  return ScopedLocalJavaRef<jfloatArray>(env, jni_array);
+}
+
+bool JNIType::RegisterJNIUtils(JNIEnv* env) {
+  g_Double_clazz = reinterpret_cast<jclass>(
+      env->NewGlobalRef(base::android::GetClass(env, kDoubleClassPath).Get()));
+  return true;
+}
+
+}  // namespace android
+}  // namespace base
diff --git a/weex_core/Source/android/base/jni_type.h b/weex_core/Source/android/base/jni_type.h
new file mode 100644
index 0000000000..0659151f00
--- /dev/null
+++ b/weex_core/Source/android/base/jni_type.h
@@ -0,0 +1,39 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WEEX_PROJECT_JNI_TYPE_H
+#define WEEX_PROJECT_JNI_TYPE_H
+
+#include <jni.h>
+#include "android/base/jni/scoped_java_ref.h"
+
+namespace base {
+namespace android {
+class JNIType {
+ public:
+  static jdouble DoubleValue(JNIEnv* env, jobject value);
+  static ScopedLocalJavaRef<jfloatArray> NewFloatArray(JNIEnv* env, int length,
+                                                       float* array = nullptr);
+
+  static bool RegisterJNIUtils(JNIEnv* env);
+};
+}  // namespace android
+}  // namespace base
+
+#endif  // WEEX_PROJECT_JNI_TYPE_H
diff --git a/weex_core/Source/android/base/log_utils.h b/weex_core/Source/android/base/log_utils.h
index 01b8140d4f..b398194ce8 100644
--- a/weex_core/Source/android/base/log_utils.h
+++ b/weex_core/Source/android/base/log_utils.h
@@ -19,23 +19,47 @@
 #ifndef _LOG_UTILS_H_
 #define _LOG_UTILS_H_
 
+#if !defined(__APPLE__)
 #include <android/log.h>
+#endif
 
 #define LOG_TAG "WeexCore"
 
+#if defined(__APPLE__)
+
+#define LOGE(...)    printf(__VA_ARGS__);printf("\n")
+#define LOGA(...)    printf(__VA_ARGS__);printf("\n")
+#define LOGD(...)    printf(__VA_ARGS__);printf("\n")
+
+#else
+
 #define LOGE(...)    __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
 #define LOGA(...)    __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
 #define LOGD(...)    __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
+
+#endif
 //#define DEBUG
 
 #ifdef DEBUG
 
+#if defined(__APPLE__)
+
+#define LOGV(...)     printf(__VA_ARGS__);printf("\n")
+#define LOGD(...)     printf(__VA_ARGS__);printf("\n")
+#define LOGI(...)     printf(__VA_ARGS__);printf("\n")
+#define LOGW(...)     printf(__VA_ARGS__);printf("\n")
+#define LOG_LINE LOGV("%s, %d", __func__, __LINE__)
+
+#else
+
 #define LOGV(...) 	__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
 #define LOGD(...) 	__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
 #define LOGI(...) 	__android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
 #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
 #define LOG_LINE LOGV("%s, %d", __func__, __LINE__)
 
+#endif
+
 #else
 
 #define LOGV(...) ((void) 0)
@@ -46,10 +70,4 @@
 
 #endif
 
-#ifndef DISALLOW_COPY_AND_ASSIGN
-#define DISALLOW_COPY_AND_ASSIGN(TypeName)  \
-  TypeName(const TypeName&) = delete;      \
-  void operator=(const TypeName&) = delete
-#endif
-
 #endif //_LOG_UTILS_H_
diff --git a/weex_core/Source/android/base/string/scoped_jstring.cpp b/weex_core/Source/android/base/string/scoped_jstring.cpp
index 9d9a0d15d1..4b7ddff721 100644
--- a/weex_core/Source/android/base/string/scoped_jstring.cpp
+++ b/weex_core/Source/android/base/string/scoped_jstring.cpp
@@ -32,6 +32,8 @@ ScopedJString::~ScopedJString() {
 const jchar *ScopedJString::getChars() {
   if (m_chars)
     return m_chars;
+  if (m_jstring == nullptr)
+    return nullptr;
   m_chars = m_env->GetStringChars(m_jstring, nullptr);
   m_len = m_env->GetStringLength(m_jstring);
   return m_chars;
@@ -40,6 +42,8 @@ const jchar *ScopedJString::getChars() {
 size_t ScopedJString::getCharsLength() {
   if (m_chars)
     return m_len;
+  if (m_jstring == nullptr)
+    return 0;
   m_len = m_env->GetStringLength(m_jstring);
   return m_len;
 }
diff --git a/weex_core/Source/android/base/string/scoped_jstring_utf8.cpp b/weex_core/Source/android/base/string/scoped_jstring_utf8.cpp
index c76c54b2a6..0c6caef71b 100644
--- a/weex_core/Source/android/base/string/scoped_jstring_utf8.cpp
+++ b/weex_core/Source/android/base/string/scoped_jstring_utf8.cpp
@@ -37,4 +37,4 @@ const char *ScopedJStringUTF8::getChars() {
   return m_chars;
 }
 
-} //WeexCore
\ No newline at end of file
+} //WeexCore
diff --git a/weex_core/Source/android/base/string/string_utils.h b/weex_core/Source/android/base/string/string_utils.h
index ae3d5f50f0..d09fd783af 100644
--- a/weex_core/Source/android/base/string/string_utils.h
+++ b/weex_core/Source/android/base/string/string_utils.h
@@ -69,6 +69,10 @@ static inline std::string jString2StrFast(JNIEnv *env, const jstring &jstr){
 }
 
 static std::string jByteArray2Str(JNIEnv *env, jbyteArray barr) {
+  if(barr == nullptr) {
+    return "";
+  }
+
   char *rtn = NULL;
   jsize alen = env->GetArrayLength(barr);
   jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE);
@@ -89,7 +93,6 @@ static std::string jByteArray2Str(JNIEnv *env, jbyteArray barr) {
 
 }
 
-
 static inline jbyteArray newJByteArray(JNIEnv *env, const char* data, int length) {
   jbyteArray jarray = nullptr;
   if (data == nullptr || length <= 0)
@@ -178,6 +181,33 @@ static inline int getArgumentAsInt32(JNIEnv* env, IPCArguments* arguments, int a
   return ret;
 }
 
+static inline int getArgumentAsInt32(IPCArguments* arguments, int argument) {
+  int ret = 0;
+  if (arguments->getType(argument) == IPCType::INT32) {
+    const int32_t type = arguments->get<int32_t>(argument);
+    ret = type;
+  }
+  return ret;
+}
+
+static inline int64_t getArgumentAsInt64(IPCArguments* arguments, int argument) {
+  int ret = 0;
+  if (arguments->getType(argument) == IPCType::INT64) {
+    const int64_t type = arguments->get<int64_t>(argument);
+    ret = type;
+  }
+  return ret;
+}
+
+static inline float getArgumentAsFloat(IPCArguments* arguments, int argument) {
+  float ret = 0;
+  if (arguments->getType(argument) == IPCType::FLOAT) {
+    const float type = arguments->get<float>(argument);
+    ret = type;
+  }
+  return ret;
+}
+
 static inline void addString(JNIEnv *env, IPCSerializer *serializer, jstring str) {
   ScopedJString scopedString(env, str);
   const uint16_t *chars = scopedString.getChars();
diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp b/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
deleted file mode 100644
index 7fd11a056d..0000000000
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.cpp
+++ /dev/null
@@ -1,928 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#include <core/render/manager/render_manager.h>
-#include <core/render/page/render_page.h>
-#include <core/render/node/render_object.h>
-#include <base/TimeUtils.h>
-#include <android/base/string/string_utils.h>
-#include "bridge_impl_android.h"
-#include <core/layout/style.h>
-#include <map>
-#include <android/base/string/jstring_cache.h>
-
-static jmethodID jSetJSFrmVersionMethodId;
-static jmethodID jReportExceptionMethodId;
-static jmethodID jCallNativeMethodId;
-static jmethodID jCallNativeModuleMethodId;
-static jmethodID jCallNativeComponentMethodId;
-
-static jmethodID jSetTimeoutNativeMethodId;
-static jmethodID jLogMethodId;
-static jmethodID jCallUpdateFinishMethodId;
-
-static jmethodID jCallRefreshFinishMethodId;
-static jmethodID jCallRemoveElementMethodId;
-static jmethodID jCallMoveElementMethodId;
-static jmethodID jCallAddEventMethodId;
-static jmethodID jCallRemoveEventMethodId;
-static jmethodID jCallCreateBodyMethodId;
-static jmethodID jCallAddElementMethodId;
-static jmethodID jCallUpdateStyleMethodId;
-static jmethodID jCallHasTransitionProsMethodId;
-static jmethodID jCallUpdateAttrsMethodId;
-static jmethodID jCallLayoutMethodId;
-static jmethodID jCallCreateFinishMethodId;
-static jmethodID jCallRenderSuccessMethodId;
-static jmethodID jCallAppendTreeCreateFinishMethodId;
-static jmethodID jCallGetMeasurementMethodId;
-
-static jmethodID jPostMessage;
-static jmethodID jDispatchMeaasge;
-
-namespace WeexCore {
-
-  Bridge_Impl_Android *Bridge_Impl_Android::m_instance = nullptr;
-
-  Bridge_Impl_Android::Bridge_Impl_Android() {}
-
-  Bridge_Impl_Android::~Bridge_Impl_Android() {}
-
-  void Bridge_Impl_Android::setGlobalRef(jobject &jRef) {
-    jThis = jRef;
-    jSetJSFrmVersionMethodId = NULL;
-    jReportExceptionMethodId = NULL;
-    jCallNativeMethodId = NULL;
-    jCallNativeModuleMethodId = NULL;
-    jCallNativeComponentMethodId = NULL;
-
-    jSetTimeoutNativeMethodId = NULL;
-    jLogMethodId = NULL;
-    jCallUpdateFinishMethodId = NULL;
-
-    jCallRefreshFinishMethodId = NULL;
-    jCallRemoveElementMethodId = NULL;
-    jCallMoveElementMethodId = NULL;
-    jCallAddEventMethodId = NULL;
-    jCallRemoveEventMethodId = NULL;
-
-    jCallCreateBodyMethodId = NULL;
-    jCallAddElementMethodId = NULL;
-    jCallUpdateStyleMethodId = NULL;
-    jCallHasTransitionProsMethodId = NULL;
-    jCallUpdateAttrsMethodId = NULL;
-    jCallLayoutMethodId = NULL;
-    jCallAppendTreeCreateFinishMethodId = NULL;
-    jCallCreateFinishMethodId = NULL;
-    jCallRenderSuccessMethodId = NULL;
-    jCallGetMeasurementMethodId = NULL;
-  }
-
-  void static cpyCMap2JMap(std::map<std::string, std::string> *cMap, jobject &jMap, JNIEnv *env) {
-
-    std::map<std::string, std::string>::const_iterator it = cMap->begin();
-    std::map<std::string, std::string>::const_iterator end = cMap->end();
-    jstring jKey;
-    jbyteArray jValue;
-
-    for (; it != end; ++it) {
-      jKey = getKeyFromCache(env, it->first.c_str());
-      jValue = newJByteArray(env, it->second.c_str());
-      env->CallObjectMethod(jMap, jMapPutMethodId, jKey, jValue);
-      env->DeleteLocalRef(jValue);
-    }
-  }
-
-  void static cpyCVector2JMap(std::vector<std::pair<std::string, std::string>> *cVector, jobject &jMap, JNIEnv *env) {
-
-    jstring jKey;
-    jbyteArray jValue;
-
-    for (int i = 0; i < cVector->size(); ++i) {
-      jKey = getKeyFromCache(env, (*cVector)[i].first.c_str());
-      jValue = newJByteArray(env, (*cVector)[i].second.c_str());
-      env->CallObjectMethod(jMap, jMapPutMethodId, jKey, jValue);
-      env->DeleteLocalRef(jValue);
-    }
-  }
-
-  void static cpyCSet2JSet(std::set<std::string> *cSet, jobject &jSet, JNIEnv *env) {
-
-    jstring jValue;
-    std::set<std::string>::const_iterator it = cSet->begin();
-    std::set<std::string>::const_iterator end = cSet->end();
-
-    for (; it != end; ++it) {
-      jValue = env->NewStringUTF((*it).c_str());
-      env->CallBooleanMethod(jSet, jSetAddMethodId, jValue);
-      env->DeleteLocalRef(jValue);
-    }
-  }
-
-  void Bridge_Impl_Android::setJSVersion(const char* version) {
-
-    JNIEnv *env = getJNIEnv();
-    jstring jVersion = env->NewStringUTF(version);
-
-    if (jSetJSFrmVersionMethodId == NULL) {
-      jSetJSFrmVersionMethodId = env->GetMethodID(jBridgeClazz,
-                                                  "setJSFrmVersion",
-                                                  "(Ljava/lang/String;)V");
-    }
-    env->CallVoidMethod(jThis, jSetJSFrmVersionMethodId, jVersion);
-
-    if (jVersion != nullptr)
-      env->DeleteLocalRef(jVersion);
-  }
-
-  void Bridge_Impl_Android::reportException(const char* pageId, const char *func, const char *exception_string) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jstring jFunc = env->NewStringUTF(func);
-    jstring jExceptionString = env->NewStringUTF(exception_string);
-    jstring jPageId = getKeyFromCache(env, pageId);
-
-    if (jReportExceptionMethodId == NULL) {
-      jReportExceptionMethodId = env->GetMethodID(jBridgeClazz,
-                                                  "reportJSException",
-                                                  "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
-    }
-    env->CallVoidMethod(jThis, jReportExceptionMethodId, jPageId, jFunc, jExceptionString);
-
-    if (jFunc != nullptr)
-      env->DeleteLocalRef(jFunc);
-    if (jExceptionString != nullptr)
-      env->DeleteLocalRef(jExceptionString);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-  }
-
-  int Bridge_Impl_Android::callNative(const char* pageId, const char *task, const char *callback) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jbyteArray jTask = newJByteArray(env, task);
-    jstring jCallback = env->NewStringUTF(callback);
-    jstring jPageId = getKeyFromCache(env, pageId);
-
-    int flag = -1;
-
-    if (jTask != nullptr) {
-      if (jCallNativeMethodId == NULL) {
-        jCallNativeMethodId = env->GetMethodID(jBridgeClazz,
-                                               "callNative",
-                                               "(Ljava/lang/String;[BLjava/lang/String;)I");
-      }
-
-      flag = env->CallIntMethod(jThis, jCallNativeMethodId, jPageId, jTask, jCallback);
-    }
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callNative");
-    }
-
-    if (jTask != nullptr)
-      env->DeleteLocalRef(jTask);
-    if (jCallback != nullptr)
-      env->DeleteLocalRef(jCallback);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  void* Bridge_Impl_Android::callNativeModule(const char* pageId, const char *module, const char *method,
-                                                const char *arguments, int argumentsLen,  const char *options, int optionsLen) {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jstring jModule = env->NewStringUTF(module);
-    jstring jMethod = env->NewStringUTF(method);
-    jbyteArray jArgString = newJByteArray(env, arguments, argumentsLen);
-    jbyteArray jOptString = newJByteArray(env, options, optionsLen);
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jobject result = nullptr;
-
-    if (jModule != nullptr && jMethod != nullptr) {
-      if (jCallNativeModuleMethodId == NULL) {
-        jCallNativeModuleMethodId = env->GetMethodID(jBridgeClazz,
-                                                     "callNativeModule",
-                                                     "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[B)Ljava/lang/Object;");
-      }
-
-      result = env->CallObjectMethod(jThis, jCallNativeModuleMethodId, jPageId, jModule, jMethod, jArgString, jOptString);
-    }
-
-    if (jModule != nullptr)
-      env->DeleteLocalRef(jModule);
-    if (jMethod != nullptr)
-      env->DeleteLocalRef(jMethod);
-    if (jArgString != nullptr)
-      env->DeleteLocalRef(jArgString);
-    if (jOptString != nullptr)
-      env->DeleteLocalRef(jOptString);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return result;
-  }
-
-  void Bridge_Impl_Android::callNativeComponent(const char* pageId, const char* ref, const char *method,
-                                                const char *arguments, int argumentsLength, const char *options, int optionsLength) {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jstring jMethod = env->NewStringUTF(method);
-    jbyteArray jArgString = newJByteArray(env, arguments, argumentsLength);
-    jbyteArray jOptString = newJByteArray(env, options, optionsLength);
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    if (jMethod != nullptr) {
-      if (jCallNativeComponentMethodId == NULL) {
-        jCallNativeComponentMethodId = env->GetMethodID(jBridgeClazz,
-                                                        "callNativeComponent",
-                                                        "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[B[B)V");
-      }
-      env->CallVoidMethod(jThis, jCallNativeComponentMethodId, jPageId, jRef, jMethod, jArgString, jOptString);
-    }
-
-    if (jMethod != nullptr)
-      env->DeleteLocalRef(jMethod);
-    if (jArgString != nullptr)
-      env->DeleteLocalRef(jArgString);
-    if (jOptString != nullptr)
-      env->DeleteLocalRef(jOptString);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-  }
-
-  void Bridge_Impl_Android::setTimeout(const char* callbackID, const char* time) {
-    JNIEnv *env = getJNIEnv();
-    jstring jCallbackID = env->NewStringUTF(callbackID);
-    jstring jTime = env->NewStringUTF(time);
-
-    if (jCallbackID == nullptr || jTime == nullptr)
-      return;
-
-    if (jSetTimeoutNativeMethodId == NULL) {
-      jSetTimeoutNativeMethodId = env->GetMethodID(jBridgeClazz,
-                                                   "setTimeoutNative",
-                                                   "(Ljava/lang/String;Ljava/lang/String;)V");
-    }
-
-    env->CallVoidMethod(jThis, jSetTimeoutNativeMethodId, jCallbackID, jTime);
-
-    if (jCallbackID != nullptr)
-      env->DeleteLocalRef(jCallbackID);
-    if (jTime != nullptr)
-      env->DeleteLocalRef(jTime);
-  }
-
-  void Bridge_Impl_Android::callNativeLog(const char* str_array) {
-    JNIEnv *env = getJNIEnv();
-    if (jWXLogUtils != NULL) {
-      if (jLogMethodId == NULL) {
-        jLogMethodId = env->GetStaticMethodID(jWXLogUtils, "d",
-                                              "(Ljava/lang/String;[B)V");
-      }
-      if (jLogMethodId != NULL) {
-        jstring str_tag = env->NewStringUTF("jsLog");
-        jbyteArray str_msg = newJByteArray(env, str_array);
-        env->CallStaticVoidMethod(jWXLogUtils, jLogMethodId, str_tag, str_msg);
-        env->DeleteLocalRef(str_tag);
-        env->DeleteLocalRef(str_msg);
-      }
-    }
-  }
-
-  int Bridge_Impl_Android::callUpdateFinish(const char* pageId, const char *task, const char *callback) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jbyteArray jTask = newJByteArray(env, task);
-    jstring jCallback = env->NewStringUTF(callback);
-    jstring jPageId = getKeyFromCache(env, pageId);
-
-    if (jCallUpdateFinishMethodId == NULL) {
-      jCallUpdateFinishMethodId = env->GetMethodID(jBridgeClazz,
-                                                   "callUpdateFinish",
-                                                   "(Ljava/lang/String;[BLjava/lang/String;)I");
-    }
-
-    int flag = env->CallIntMethod(jThis, jCallUpdateFinishMethodId, jPageId, jTask, jCallback);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callUpdateFinish");
-    }
-
-    if (jTask != nullptr)
-      env->DeleteLocalRef(jTask);
-    if (jCallback != nullptr)
-      env->DeleteLocalRef(jCallback);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callRefreshFinish(const char* pageId, const char *task, const char *callback) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jbyteArray jTask = newJByteArray(env, task);
-    jstring jCallback = env->NewStringUTF(callback);
-    jstring jPageId = getKeyFromCache(env, pageId);
-
-    if (jCallRefreshFinishMethodId == NULL) {
-      jCallRefreshFinishMethodId = env->GetMethodID(jBridgeClazz,
-                                                    "callRefreshFinish",
-                                                    "(Ljava/lang/String;[BLjava/lang/String;)I");
-    }
-    int flag = env->CallIntMethod(jThis, jCallRefreshFinishMethodId, jPageId, jTask, jCallback);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callNative");
-    }
-
-    if (jTask != nullptr)
-      env->DeleteLocalRef(jTask);
-    if (jCallback != nullptr)
-      env->DeleteLocalRef(jCallback);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callCreateBody(const char* pageId, const char *componentType, const char* ref,
-                                          std::map<std::string, std::string> *styles,
-                                          std::map<std::string, std::string> *attributes,
-                                          std::set<std::string> *events,
-                                          const WXCoreMargin &margins,
-                                          const WXCorePadding &paddings,
-                                          const WXCoreBorderWidth &borders) {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = env->NewStringUTF(pageId);
-    jstring jRef = env->NewStringUTF(ref);
-
-    jobject jStyles = nullptr;
-    if (styles != nullptr && styles->size() > 0) {
-      jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId);
-      cpyCMap2JMap(styles, jStyles, env);
-    }
-    jobject jAttributes = nullptr;
-    if (attributes != nullptr && attributes->size() > 0) {
-      jAttributes = env->NewObject(jMapClazz, jMapConstructorMethodId);
-      cpyCMap2JMap(attributes, jAttributes, env);
-    }
-
-
-    jobject jEvents = nullptr;
-    if (events != nullptr && events->size() > 0) {
-      jEvents = env->NewObject(jSetClazz, jSetConstructorMethodId);
-      cpyCSet2JSet(events, jEvents, env);
-    }
-
-    float c_margins[4];
-    float c_paddings[4];
-    float c_borders[4];
-
-    c_margins[0] = margins.getMargin(kMarginTop);
-    c_margins[1] = margins.getMargin(kMarginBottom);
-    c_margins[2] = margins.getMargin(kMarginLeft);
-    c_margins[3] = margins.getMargin(kMarginRight);
-
-    c_paddings[0] = paddings.getPadding(kPaddingTop);
-    c_paddings[1] = paddings.getPadding(kPaddingBottom);
-    c_paddings[2] = paddings.getPadding(kPaddingLeft);
-    c_paddings[3] = paddings.getPadding(kPaddingRight);
-
-    c_borders[0] = borders.getBorderWidth(kBorderWidthTop);
-    c_borders[1] = borders.getBorderWidth(kBorderWidthBottom);
-    c_borders[2] = borders.getBorderWidth(kBorderWidthLeft);
-    c_borders[3] = borders.getBorderWidth(kBorderWidthRight);
-
-    jfloatArray jMargins = c2jFloatArray(env, c_margins);
-    jfloatArray jPaddings = c2jFloatArray(env, c_paddings);
-    jfloatArray jBorders = c2jFloatArray(env, c_borders);
-
-    if (jCallCreateBodyMethodId == NULL)
-      jCallCreateBodyMethodId = env->GetMethodID(jBridgeClazz,
-                                                 "callCreateBody",
-                                                 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashSet;[F[F[F)I");
-
-
-    jstring jComponentType = env->NewStringUTF(componentType);
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallCreateBodyMethodId, jPageId,
-                              jComponentType, jRef, jStyles, jAttributes,
-                              jEvents, jMargins, jPaddings, jBorders);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callCreateBody");
-    }
-
-    env->DeleteLocalRef(jStyles);
-    env->DeleteLocalRef(jAttributes);
-    env->DeleteLocalRef(jEvents);
-    env->DeleteLocalRef(jMargins);
-    env->DeleteLocalRef(jPaddings);
-    env->DeleteLocalRef(jBorders);
-    env->DeleteLocalRef(jPageId);
-    env->DeleteLocalRef(jComponentType);
-    env->DeleteLocalRef(jRef);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callAddElement(const char* pageId, const char *componentType,
-                                          const char* ref, int &index, const char* parentRef,
-                                          std::map<std::string, std::string> *styles,
-                                          std::map<std::string, std::string> *attributes,
-                                          std::set<std::string> *events,
-                                          const WXCoreMargin &margins,
-                                          const WXCorePadding &paddings,
-                                          const WXCoreBorderWidth &borders,
-                                          bool willLayout) {
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = env->NewStringUTF(pageId);
-    jstring jRef = env->NewStringUTF(ref);
-    jstring jParentRef = env->NewStringUTF(parentRef);
-
-    jobject jStyles = nullptr;
-    if (styles != nullptr && styles->size() > 0) {
-      jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId);
-      cpyCMap2JMap(styles, jStyles, env);
-    }
-    jobject jAttributes = nullptr;
-    if (attributes != nullptr && attributes->size() > 0) {
-      jAttributes = env->NewObject(jMapClazz, jMapConstructorMethodId);
-      cpyCMap2JMap(attributes, jAttributes, env);
-    }
-
-    jobject jEvents = nullptr;
-    if (events != nullptr && events->size() > 0) {
-      jEvents = env->NewObject(jSetClazz, jSetConstructorMethodId);
-      cpyCSet2JSet(events, jEvents, env);
-    }
-
-    float c_margins[4];
-    float c_paddings[4];
-    float c_borders[4];
-
-    c_margins[0] = margins.getMargin(kMarginTop);
-    c_margins[1] = margins.getMargin(kMarginBottom);
-    c_margins[2] = margins.getMargin(kMarginLeft);
-    c_margins[3] = margins.getMargin(kMarginRight);
-
-    c_paddings[0] = paddings.getPadding(kPaddingTop);
-    c_paddings[1] = paddings.getPadding(kPaddingBottom);
-    c_paddings[2] = paddings.getPadding(kPaddingLeft);
-    c_paddings[3] = paddings.getPadding(kPaddingRight);
-
-    c_borders[0] = borders.getBorderWidth(kBorderWidthTop);
-    c_borders[1] = borders.getBorderWidth(kBorderWidthBottom);
-    c_borders[2] = borders.getBorderWidth(kBorderWidthLeft);
-    c_borders[3] = borders.getBorderWidth(kBorderWidthRight);
-
-    jfloatArray jMargins = c2jFloatArray(env, c_margins);
-    jfloatArray jPaddings = c2jFloatArray(env, c_paddings);
-    jfloatArray jBorders = c2jFloatArray(env, c_borders);
-
-    if (jCallAddElementMethodId == NULL)
-      jCallAddElementMethodId = env->GetMethodID(jBridgeClazz,
-                                                           "callAddElement",
-                                                           "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashSet;[F[F[FZ)I");
-
-    jstring jComponentType = env->NewStringUTF(componentType);
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallAddElementMethodId, jPageId, jComponentType, jRef, index,
-                              jParentRef, jStyles, jAttributes, jEvents, jMargins, jPaddings, jBorders, willLayout);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callAddElement");
-    }
-
-    env->DeleteLocalRef(jStyles);
-    env->DeleteLocalRef(jAttributes);
-    env->DeleteLocalRef(jEvents);
-    env->DeleteLocalRef(jMargins);
-    env->DeleteLocalRef(jPaddings);
-    env->DeleteLocalRef(jBorders);
-    env->DeleteLocalRef(jPageId);
-    env->DeleteLocalRef(jParentRef);
-    env->DeleteLocalRef(jRef);
-    env->DeleteLocalRef(jComponentType);
-
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callRemoveElement(const char* pageId, const char* ref) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    if (jCallRemoveElementMethodId == NULL) {
-      jCallRemoveElementMethodId = env->GetMethodID(jBridgeClazz,
-                                                    "callRemoveElement",
-                                                    "(Ljava/lang/String;Ljava/lang/String;)I");
-    }
-
-    int flag = env->CallIntMethod(jThis, jCallRemoveElementMethodId, jPageId, jRef);
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callRemoveElement");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return 0;
-  }
-
-  int Bridge_Impl_Android::callMoveElement(const char* pageId, const char* ref, const char* parentRef, int index) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-    jstring jParentRef = getKeyFromCache(env, parentRef);
-
-    if (jCallMoveElementMethodId == NULL) {
-      jCallMoveElementMethodId = env->GetMethodID(jBridgeClazz,
-                                                  "callMoveElement",
-                                                  "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I");
-    }
-
-    int flag = env->CallIntMethod(jThis, jCallMoveElementMethodId, jPageId, jRef, jParentRef, index);
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callRemoveElement");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return 0;
-  }
-
-  int Bridge_Impl_Android::callAddEvent(const char* pageId, const char* ref, const char *event) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    if (jCallAddEventMethodId == NULL) {
-      jCallAddEventMethodId = env->GetMethodID(jBridgeClazz,
-                                               "callAddEvent",
-                                               "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I");
-    }
-    jstring jEventId = env->NewStringUTF(event);
-
-    int flag = env->CallIntMethod(jThis, jCallAddEventMethodId, jPageId, jRef, jEventId);
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callAddEvent");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    env->DeleteLocalRef(jEventId);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callRemoveEvent(const char* pageId, const char* ref, const char *event) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    if (jCallRemoveEventMethodId == NULL) {
-      jCallRemoveEventMethodId = env->GetMethodID(jBridgeClazz,
-                                                  "callRemoveEvent",
-                                                  "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I");
-    }
-    jstring jEventId = env->NewStringUTF(event);
-
-    int flag = env->CallIntMethod(jThis, jCallRemoveEventMethodId, jPageId, jRef, jEventId);
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callRemoveElement");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    env->DeleteLocalRef(jEventId);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callUpdateStyle(const char* pageId, const char* ref,
-                                           std::vector<std::pair<std::string, std::string>> *style,
-                                           std::vector<std::pair<std::string, std::string>> *margin,
-                                           std::vector<std::pair<std::string, std::string>> *padding,
-                                           std::vector<std::pair<std::string, std::string>> *border) {
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    jobject jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId);
-    jobject jMargins = env->NewObject(jMapClazz, jMapConstructorMethodId);
-    jobject jPaddings = env->NewObject(jMapClazz, jMapConstructorMethodId);
-    jobject jBorders = env->NewObject(jMapClazz, jMapConstructorMethodId);
-
-    if (style != nullptr) {
-      cpyCVector2JMap(style, jStyles, env);
-    }
-
-    if (margin != nullptr) {
-      cpyCVector2JMap(margin, jMargins, env);
-    }
-
-    if (padding != nullptr) {
-      cpyCVector2JMap(padding, jPaddings, env);
-    }
-
-    if (border != nullptr) {
-      cpyCVector2JMap(border, jBorders, env);
-    }
-
-    if (jCallUpdateStyleMethodId == NULL)
-      jCallUpdateStyleMethodId = env->GetMethodID(jBridgeClazz,
-                                                            "callUpdateStyle",
-                                                            "(Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashMap;Ljava/util/HashMap;)I");
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallUpdateStyleMethodId, jPageId, jRef, jStyles, jMargins, jPaddings, jBorders);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callUpdateStyle");
-    }
-
-    env->DeleteLocalRef(jStyles);
-    env->DeleteLocalRef(jMargins);
-    env->DeleteLocalRef(jPaddings);
-    env->DeleteLocalRef(jBorders);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callUpdateAttr(const char* pageId, const char* ref, std::vector<std::pair<std::string, std::string>> *attrs) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    jobject jAttrs = env->NewObject(jMapClazz, jMapConstructorMethodId);
-
-    if (attrs != nullptr) {
-      cpyCVector2JMap(attrs, jAttrs, env);
-    }
-
-    if (jCallUpdateAttrsMethodId == NULL) {
-      jCallUpdateAttrsMethodId = env->GetMethodID(jBridgeClazz,
-                                                            "callUpdateAttrs",
-                                                            "(Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)I");
-    }
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallUpdateAttrsMethodId, jPageId, jRef, jAttrs);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callUpdateStyle");
-    }
-
-    env->DeleteLocalRef(jAttrs);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callLayout(const char* pageId, const char* ref,
-                                      int top, int bottom, int left, int right,
-                                      int height, int width, int index) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = env->NewStringUTF(pageId);
-    jstring jRef = env->NewStringUTF(ref);
-
-    if (jCallLayoutMethodId == NULL)
-      jCallLayoutMethodId = env->GetMethodID(jBridgeClazz,
-                                                       "callLayout",
-                                                       "(Ljava/lang/String;Ljava/lang/String;IIIIIII)I");
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallLayoutMethodId, jPageId,
-                              jRef, top, bottom, left, right, height, width, index);
-
-    env->DeleteLocalRef(jPageId);
-    env->DeleteLocalRef(jRef);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callLayout");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callCreateFinish(const char* pageId) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-
-    if (jCallCreateFinishMethodId == NULL)
-      jCallCreateFinishMethodId = env->GetMethodID(jBridgeClazz,
-                                                             "callCreateFinish",
-                                                             "(Ljava/lang/String;)I");
-
-    int flag = env->CallIntMethod(jThis, jCallCreateFinishMethodId, jPageId);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callCreateFinish");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callRenderSuccess(const char* pageId) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-
-    if (jCallRenderSuccessMethodId == NULL)
-      jCallRenderSuccessMethodId = env->GetMethodID(jBridgeClazz,
-                                                             "callRenderSuccess",
-                                                             "(Ljava/lang/String;)I");
-
-    int flag = env->CallIntMethod(jThis, jCallRenderSuccessMethodId, jPageId);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callRenderSuccess");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callAppendTreeCreateFinish(const char *pageId, const char *ref) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    if (jCallAppendTreeCreateFinishMethodId == NULL)
-      jCallAppendTreeCreateFinishMethodId = env->GetMethodID(jBridgeClazz,
-                                             "callAppendTreeCreateFinish",
-                                             "(Ljava/lang/String;Ljava/lang/String;)I");
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallAppendTreeCreateFinishMethodId, jPageId, jRef);
-
-    if (flag == -1) {
-      LOGE("instance destroy JFM must stop callAppendTreeCreateFinish");
-    }
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-  int Bridge_Impl_Android::callHasTransitionPros(const char* pageId, const char* ref, std::vector<std::pair<std::string, std::string>> *style) {
-
-    RenderPage *page = RenderManager::GetInstance()->GetPage(pageId);
-    int64_t startTime = getCurrentTime();
-
-    JNIEnv *env = getJNIEnv();
-
-    jstring jPageId = getKeyFromCache(env, pageId);
-    jstring jRef = getKeyFromCache(env, ref);
-
-    jobject jStyles = env->NewObject(jMapClazz, jMapConstructorMethodId);
-
-    if (style != nullptr) {
-      cpyCVector2JMap(style, jStyles, env);
-    }
-
-    if (jCallHasTransitionProsMethodId == NULL)
-        jCallHasTransitionProsMethodId = env->GetMethodID(jBridgeClazz,
-                                                            "callHasTransitionPros",
-                                                            "(Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)I");
-
-    int flag = 0;
-    flag = env->CallIntMethod(jThis, jCallHasTransitionProsMethodId, jPageId, jRef, jStyles);
-
-    env->DeleteLocalRef(jStyles);
-
-    if (page != nullptr)
-      page->CallBridgeTime(getCurrentTime() - startTime);
-    return flag;
-  }
-
-
-  void Bridge_Impl_Android::handlePostMessage(jstring jVmId, jbyteArray jData) {
-    JNIEnv *env = getJNIEnv();
-    if (jPostMessage == NULL) {
-      jPostMessage = env->GetMethodID(jWMBridgeClazz,
-                                    "postMessage",
-                                    "(Ljava/lang/String;[B)V");
-    }
-    env->CallVoidMethod(jWMThis, jPostMessage, jVmId, jData);
-  }
-
-  void Bridge_Impl_Android::handleDispatchMessage(jstring jClientId, jstring jVmId, jbyteArray jData, jstring jCallback) {
-    JNIEnv *env = getJNIEnv();
-    if (jDispatchMeaasge == NULL) {
-      jDispatchMeaasge = env->GetMethodID(jWMBridgeClazz,
-                                        "dispatchMessage",
-                                        "(Ljava/lang/String;Ljava/lang/String;[BLjava/lang/String;)V");
-    }
-    env->CallVoidMethod(jWMThis, jDispatchMeaasge, jClientId, jVmId, jData, jCallback);
-  }
-
-  jobject Bridge_Impl_Android::getMeasureFunc(const char* pageId, jlong renderObjectPtr) {
-    JNIEnv *env = getJNIEnv();
-    jstring jPageId = getKeyFromCache(env, pageId);
-    if (jCallGetMeasurementMethodId == NULL) {
-      jCallGetMeasurementMethodId = env->GetMethodID(jBridgeClazz,
-                                                     "getMeasurementFunc",
-                                                     "(Ljava/lang/String;J)Lcom/taobao/weex/layout/ContentBoxMeasurement;");
-    }
-    return env->CallObjectMethod(jThis, jCallGetMeasurementMethodId, jPageId, renderObjectPtr);
-  }
-} //end WeexCore
diff --git a/weex_core/Source/android/bridge/impl/bridge_impl_android.h b/weex_core/Source/android/bridge/impl/bridge_impl_android.h
deleted file mode 100644
index 22bee0ffa3..0000000000
--- a/weex_core/Source/android/bridge/impl/bridge_impl_android.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#ifndef BridgeAndroid_h
-#define BridgeAndroid_h
-
-#include <core/bridge/bridge.h>
-#include "weexcore_impl_android.h"
-
-namespace WeexCore {
-
-  class Bridge_Impl_Android : public Bridge {
-
-  private:
-    jobject jThis;
-    jobject jVMThis;
-
-  public:
-    static Bridge_Impl_Android *m_instance;
-
-    //just to release singleton object
-    class Garbo {
-    public:
-      ~Garbo() {
-        if (Bridge_Impl_Android::m_instance) {
-          delete Bridge_Impl_Android::m_instance;
-        }
-      }
-    };
-
-    static Garbo garbo;
-
-    Bridge_Impl_Android();
-
-    ~Bridge_Impl_Android();
-
-    static Bridge_Impl_Android *getInstance() {
-      if (m_instance == nullptr) {
-        m_instance = new Bridge_Impl_Android();
-      }
-      return m_instance;
-    }
-
-    void setGlobalRef(jobject &jRef);
-
-    void setGlobalWMRef(jobject &jRef) {
-      jWMThis = jRef;
-    }
-
-    void setJSVersion(const char* version);
-
-    void reportException(const char* pageId, const char *func, const char *exception_string);
-
-    int callNative(const char* pageId, const char *task, const char *callback);
-
-    void* callNativeModule(const char* pageId, const char *module, const char *method,
-                             const char *arguments, int argumentsLength, const char *options, int optionsLength);
-
-    void callNativeComponent(const char* pageId, const char* ref, const char *method,
-                             const char *arguments, int argumentsLength, const char *options, int optionsLength);
-
-    void setTimeout(const char* callbackID, const char* time);
-
-    void callNativeLog(const char* str_array);
-
-    int callUpdateFinish(const char* pageId, const char *task, const char *callback);
-
-    int callRefreshFinish(const char* pageId, const char *task, const char *callback);
-
-    int callAddEvent(const char* pageId, const char* ref, const char *event);
-
-    int callRemoveEvent(const char* pageId, const char* ref, const char *event);
-
-    int callCreateBody(const char* pageId, const char *componentType, const char* ref,
-                       std::map<std::string, std::string> *styles,
-                       std::map<std::string, std::string> *attributes,
-                       std::set<std::string> *events,
-                       const WXCoreMargin &margins,
-                       const WXCorePadding &paddings,
-                       const WXCoreBorderWidth &borders);
-
-    int callAddElement(const char* pageId, const char *componentType,
-                       const char* ref, int &index, const char* parentRef,
-                       std::map<std::string, std::string> *styles,
-                       std::map<std::string, std::string> *attributes,
-                       std::set<std::string> *events,
-                       const WXCoreMargin &margins,
-                       const WXCorePadding &paddings,
-                       const WXCoreBorderWidth &borders,
-                       bool willLayout= true);
-
-    int callRemoveElement(const char* pageId, const char* ref);
-
-    int callMoveElement(const char* pageId, const char* ref, const char* parentRef, int index);
-
-    int callLayout(const char* pageId, const char* ref,
-                   int top, int bottom, int left, int right,
-                   int height, int width, int index);
-
-    int callUpdateStyle(const char* pageId, const char* ref,
-                        std::vector<std::pair<std::string, std::string>> *style,
-                        std::vector<std::pair<std::string, std::string>> *margin,
-                        std::vector<std::pair<std::string, std::string>> *padding,
-                        std::vector<std::pair<std::string, std::string>> *border);
-
-    int callUpdateAttr(const char* pageId, const char* ref,
-                       std::vector<std::pair<std::string, std::string>> *attrs);
-
-    int callCreateFinish(const char* pageId);
-
-    int callRenderSuccess(const char* pageId);
-
-    int callAppendTreeCreateFinish(const char* pageId, const char* ref);
-
-    int callHasTransitionPros(const char* pageId, const char* ref,
-                              std::vector<std::pair<std::string, std::string>> *style);
-
-    // will change future to char *
-    void handlePostMessage(jstring jVmId, jbyteArray jData);
-
-    void handleDispatchMessage(jstring jClientId, jstring jVmId, jbyteArray jData, jstring jCallback);
-
-    jobject getMeasureFunc(const char* pageId, jlong renderObjectPtr);
-  };
-} //end WeexCore
-#endif //BridgeAndroid_h
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp b/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp
deleted file mode 100644
index 948450941c..0000000000
--- a/weex_core/Source/android/bridge/impl/jsfunction_impl_android.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include <android/base/jni/jbytearray_ref.h>
-#include <android/jsengine/api/WeexJSCoreApi.h>
-#include "jsfunction_impl_android.h"
-#include "../../base/string/string_utils.h"
-#include "../../jniprebuild/jniheader/WXJsFunctions_jni.h"
-#include "bridge_impl_android.h"
-#include "../../../core/render/manager/render_manager.h"
-
-using namespace WeexCore;
-
-extern jobject jThis;
-extern jclass jBridgeClazz;
-
-namespace WeexCore {
-    bool RegisterWXJsFunction(JNIEnv *env) {
-        return RegisterNativesImpl(env);
-    }
-}
-
-static const char *getCharFromJByte(JNIEnv *env, jbyteArray jbyteArray1) {
-    if (jbyteArray1 == nullptr)
-        return "";
-
-    return jByteArray2Str(env, jbyteArray1).c_str();
-}
-
-
-static const int getJByteArraySize(JNIEnv *env, jbyteArray array){
-    if(array == nullptr){
-        return  0;
-    }
-    jsize size = env->GetArrayLength(array);
-    return size;
-}
-
-
-static const char *getCharFromJString(JNIEnv *env, jstring string) {
-    if (string == nullptr)
-        return "";
-    return env->GetStringUTFChars(string, nullptr);
-}
-
-void initWxBridge(JNIEnv *env, jobject object, jobject bridge, jstring className) {
-    jThis = env->NewGlobalRef(bridge);
-    const char *classNameChar = env->GetStringUTFChars(className, 0);
-    jclass tempClass = env->FindClass(classNameChar);
-    jBridgeClazz = (jclass) env->NewGlobalRef(tempClass);
-    Bridge_Impl_Android::getInstance()->setGlobalRef(jThis);
-}
-
-void jsHandleSetJSVersion(JNIEnv *env, jobject object, jstring jsVersion) {
-    Bridge_Impl_Android::getInstance()->setJSVersion(getCharFromJString(env, jsVersion));
-}
-
-void jsHandleReportException(JNIEnv *env, jobject object, jstring instanceId, jstring func,
-                             jstring exceptionjstring) {
-    Bridge_Impl_Android::getInstance()->reportException(getCharFromJString(env, instanceId),
-                                                        getCharFromJString(env, func),
-                                                        getCharFromJString(env,
-                                                                           exceptionjstring));
-}
-
-void jsHandleCallNative(JNIEnv *env, jobject object, jstring instanceId, jbyteArray tasks,
-                        jstring callback) {
-    std::string pageId = jString2StrFast(env, instanceId);
-    std::string task = jByteArray2Str(env, tasks);
-
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] handleCallNative >>>> pageId: %s, task: %s", pageId.c_str(), task.c_str());
-#endif
-
-    if (task == "[{\"module\":\"dom\",\"method\":\"createFinish\",\"args\":[]}]") {
-        RenderManager::GetInstance()->CreateFinish(pageId) ? 0 : -1;
-        env->DeleteLocalRef(instanceId);
-        env->DeleteLocalRef(tasks);
-        env->DeleteLocalRef(callback);
-    } else {
-        Bridge_Impl_Android::getInstance()->callNative(getCharFromJString(env, instanceId),
-                                                       task.c_str(),
-                                                       getCharFromJString(env, callback));
-    }
-}
-
-void
-jsHandleCallNativeModule(JNIEnv *env, jobject object, jstring instanceId, jstring module,
-                         jstring method, jbyteArray
-                         arguments, jbyteArray options, jboolean from) {
-    JByteArrayRef argumentsRef(env, arguments);
-    JByteArrayRef optionsRef(env, options);
-
-
-    _callNativeModule(getCharFromJString(env, instanceId), getCharFromJString(env, module), getCharFromJString(env, method),
-                    argumentsRef.getBytes(), argumentsRef.length(), optionsRef.getBytes(), optionsRef.length());
-}
-
-void
-jsHandleCallNativeComponent(JNIEnv *env, jobject object, jstring instanceId, jstring componentRef,
-                            jstring method,
-                            jbyteArray arguments, jbyteArray options, jboolean from) {
-
-    JByteArrayRef argumentsRef(env, arguments);
-    JByteArrayRef optionsRef(env, options);
-    Bridge_Impl_Android::getInstance()->callNativeComponent(getCharFromJString(env, instanceId),
-                                                            getCharFromJString(env, componentRef),
-                                                            getCharFromJString(env, method),
-                                                            argumentsRef.getBytes(),
-                                                            argumentsRef.length(),
-                                                            optionsRef.getBytes(),
-                                                            optionsRef.length());
-
-}
-
-void
-jsHandleCallAddElement(JNIEnv *env, jobject object, jstring instanceId, jstring ref, jbyteArray dom,
-                       jstring index) {
-
-    const char *instanceChar = env->GetStringUTFChars(instanceId, 0);
-    const char *refChar = env->GetStringUTFChars(ref, 0);
-    JByteArrayRef domRef(env, dom);
-    const char *indexChar = env->GetStringUTFChars(index, 0);
-
-    int indexI = atoi(indexChar);
-    if (instanceChar == nullptr || refChar == nullptr || domRef.length() == 0 ||
-        indexChar == nullptr ||
-        indexI < -1)
-        return;
-
-    RenderManager::GetInstance()->AddRenderObject(instanceChar, refChar, indexI,  domRef.getBytes());
-}
-
-void jsHandleSetTimeout(JNIEnv *env, jobject object, jstring callbackId, jstring time) {
-
-    Bridge_Impl_Android::getInstance()->setTimeout(getCharFromJString(env, callbackId),
-                                                   getCharFromJString(env, time));
-
-}
-
-void jsHandleCallNativeLog(JNIEnv *env, jobject object, jbyteArray str_array) {
-    Bridge_Impl_Android::getInstance()->callNativeLog(getCharFromJByte(env, str_array));
-}
-
-void jsFunctionCallCreateBody(JNIEnv *env, jobject object, jstring pageId, jbyteArray domStr, jboolean from) {
-    if (pageId == nullptr || domStr == nullptr)
-        return;
-
-    const char *page = env->GetStringUTFChars(pageId, NULL);
-    JByteArrayRef dom(env, domStr);
-    if (page == nullptr || dom.length() == 0)
-        return;
-    RenderManager::GetInstance()->CreatePage(page, dom.getBytes());
-}
-
-void
-jsFunctionCallUpdateFinish(JNIEnv *env, jobject object, jstring instanceId, jbyteArray tasks,
-                           jstring callback) {
-
-    Bridge_Impl_Android::getInstance()->callUpdateFinish(getCharFromJString(env, instanceId),
-                                                         getCharFromJByte(env, tasks),
-                                                         getCharFromJString(env, callback));
-
-}
-
-void jsFunctionCallCreateFinish(JNIEnv *env, jobject object, jstring pageId) {
-    RenderManager::GetInstance()->CreateFinish(env->GetStringUTFChars(pageId, 0));
-}
-
-void
-jsFunctionCallRefreshFinish(JNIEnv *env, jobject object, jstring instanceId, jbyteArray tasks,
-                            jstring callback) {
-    Bridge_Impl_Android::getInstance()->callRefreshFinish(getCharFromJString(env, instanceId),
-                                                          getCharFromJByte(env, tasks),
-                                                          getCharFromJString(env, callback));
-}
-
-void
-jsFunctionCallUpdateAttrs(JNIEnv *env, jobject object, jstring pageId, jstring ref, jbyteArray data, jboolean from) {
-
-    JByteArrayRef dataRef(env, data);
-    RenderManager::GetInstance()->UpdateAttr(env->GetStringUTFChars(pageId, 0),
-                                             env->GetStringUTFChars(ref, 0),
-                                             dataRef.getBytes());
-}
-
-void
-jsFunctionCallUpdateStyle(JNIEnv *env, jobject object, jstring pageId, jstring ref, jbyteArray data, jboolean from) {
-
-    JByteArrayRef dataRef(env, data);
-    RenderManager::GetInstance()->UpdateStyle(env->GetStringUTFChars(pageId, 0),
-                                              env->GetStringUTFChars(ref, 0),
-                                              dataRef.getBytes());
-}
-
-void jsFunctionCallRemoveElement(JNIEnv *env, jobject object, jstring pageId, jstring ref) {
-
-    RenderManager::GetInstance()->RemoveRenderObject(env->GetStringUTFChars(pageId, 0),
-                                                     env->GetStringUTFChars(ref, 0));
-
-}
-
-void
-jsFunctionCallMoveElement(JNIEnv *env, jobject object, jstring pageId, jstring ref,
-                          jstring parentRef, jstring index_str) {
-
-    int index = atoi(env->GetStringUTFChars(index_str, 0));
-
-    RenderManager::GetInstance()->MoveRenderObject(env->GetStringUTFChars(pageId, 0),
-                                                   env->GetStringUTFChars(ref, 0),
-                                                   env->GetStringUTFChars(parentRef, 0), index);
-
-}
-
-void
-jsFunctionCallAddEvent(JNIEnv *env, jobject object, jstring pageId, jstring ref, jstring event) {
-    RenderManager::GetInstance()->AddEvent(env->GetStringUTFChars(pageId, 0),
-                                           env->GetStringUTFChars(ref, 0),
-                                           env->GetStringUTFChars(event, 0));
-
-}
-
-void
-jsFunctionCallRemoveEvent(JNIEnv *env, jobject object, jstring pageId, jstring ref,
-                          jstring event) {
-
-    RenderManager::GetInstance()->RemoveEvent(env->GetStringUTFChars(pageId, 0),
-                                              env->GetStringUTFChars(ref, 0),
-                                              env->GetStringUTFChars(event, 0));
-
-}
-
-void jsHandleSetInterval(JNIEnv *env, jobject object, jstring instanceId, jstring callbackId,
-                         jstring time) {}
-
-void
-jsHandleClearInterval(JNIEnv *env, jobject object, jstring instanceId, jstring callbackId) {}
-
-void jsHandleCallGCanvasLinkNative(JNIEnv *env, jobject object, jstring contextId, int type,
-                                   jstring val) {}
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp b/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
deleted file mode 100644
index ccbe6d9e19..0000000000
--- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.cpp
+++ /dev/null
@@ -1,537 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#include "weexcore_impl_android.h"
-#include <android/jsengine/multiprocess/WeexProxy.h>
-#include <android/base/jni/android_jni.h>
-#include <android/jniprebuild/jniheader/WXBridge_jni.h>
-#include <android/base/string/string_utils.h>
-#include <core/render/manager/render_manager.h>
-#include <core/render/page/render_page.h>
-#include <core/render/node/render_object.h>
-#include <core/config/core_environment.h>
-#include <map>
-#include <core/manager/weex_core_manager.h>
-
-using namespace WeexCore;
-
-jclass jBridgeClazz;
-jclass jWXJSObject;
-jclass jWXLogUtils;
-jclass jMapClazz;
-jclass jSetClazz;
-jmethodID jMapConstructorMethodId = nullptr;
-jmethodID jMapPutMethodId = nullptr;
-jmethodID jSetConstructorMethodId = nullptr;
-jmethodID jSetAddMethodId = nullptr;
-
-jclass jWMBridgeClazz = nullptr;
-jmethodID jDoubleValueMethodId;
-jobject jThis;
-jobject jWMThis;
-jlongArray jFirstScreenRenderTime = nullptr;
-jlongArray jRenderFinishTime = nullptr;
-std::map<std::string, jobject> componentTypeCache;
-
-JStringCache refCache(2048);
-
-static JavaVM *sVm = NULL;
-
-JNIEnv *getJNIEnv() {
-  JNIEnv *env = NULL;
-  if ((sVm)->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
-    return JNI_FALSE;
-  }
-  return env;
-}
-
-jstring getComponentTypeFromCache(const std::string type) {
-  std::map<std::string, jobject>::const_iterator iter = componentTypeCache.find(type);
-  if (iter != componentTypeCache.end()) {
-    return (jstring)(iter->second);
-  } else {
-    return nullptr;
-  }
-}
-
-jstring putComponentTypeToCache(const std::string type) {
-  JNIEnv *env = getJNIEnv();
-  jstring jType = env->NewStringUTF(type.c_str());
-  jobject jGlobalType = env->NewGlobalRef(jType);
-  componentTypeCache.insert(std::pair<std::string, jobject>(type, jGlobalType));
-  env->DeleteLocalRef(jType);
-  return (jstring) jGlobalType;
-}
-
-jstring getKeyFromCache(JNIEnv *env, const char *key) {
-  return refCache.GetString(env, key);
-}
-
-jfloatArray c2jFloatArray(JNIEnv *env, const float c_array[]) {
-  if (nullptr == c_array) {
-    return nullptr;
-  }
-  if (0 == c_array[0]
-      && 0 == c_array[1]
-      && 0 == c_array[2]
-      && 0 == c_array[3]) {
-    // Default value;
-    return nullptr;
-  }
-  jfloatArray jArray = env->NewFloatArray(4);
-  env->SetFloatArrayRegion(jArray, 0, 4, c_array);
-  return jArray;
-}
-
-static jint InitFrameworkEnv(JNIEnv *env, jobject jcaller,
-                             jstring framework,
-                             jobject params,
-                             jstring cacheDir,
-                             jboolean pieSupport) {
-  jThis = env->NewGlobalRef(jcaller);
-  jclass tempClass = env->FindClass(
-          "com/taobao/weex/bridge/WXBridge");
-  jBridgeClazz = (jclass) env->NewGlobalRef(tempClass);
-  env->DeleteLocalRef(tempClass);
-  return WeexProxy::doInitFramework(env, jThis, framework, params, cacheDir, pieSupport);
-}
-
-static void BindMeasurementToRenderObject(JNIEnv* env, jobject jcaller,
-                                          jlong ptr){
-  RenderObject *render =  convert_long_to_render_object(ptr);
-  if(render){
-    render->BindMeasureFunc();
-  }
-}
-
-static void OnInstanceClose(JNIEnv *env, jobject jcaller, jstring instanceId) {
-    WeexCoreManager::getInstance()->getPlatformBridge()->onInstanceClose(
-            env->GetStringUTFChars(instanceId, JNI_FALSE)
-    );
-}
-
-static void SetDefaultHeightAndWidthIntoRootDom(JNIEnv *env, jobject jcaller,
-                                                jstring instanceId, jfloat defaultWidth, jfloat defaultHeight,
-                                                jboolean isWidthWrapContent, jboolean isHeightWrapContent) {
-  WeexCoreManager::getInstance()->getPlatformBridge()->setDefaultHeightAndWidthIntoRootDom(
-          env->GetStringUTFChars(instanceId, JNI_FALSE),
-          defaultWidth,
-          defaultHeight,
-          isWidthWrapContent,
-          isHeightWrapContent
-  );
-}
-
-static void SetRenderContainerWrapContent(JNIEnv* env, jobject jcaller, jboolean wrap, jstring instanceId) {
-    const char *cInstanceId = env->GetStringUTFChars(instanceId, JNI_FALSE);
-    WeexCoreManager::getInstance()->getPlatformBridge()->setRenderContainerWrapContent(
-            cInstanceId,wrap
-    );
-}
-
-static jlongArray GetFirstScreenRenderTime(JNIEnv *env, jobject jcaller, jstring instanceId) {
-  jlongArray jTemp = env->NewLongArray(3);
-
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr) {
-    if (jFirstScreenRenderTime != nullptr) {
-      env->DeleteGlobalRef(jFirstScreenRenderTime);
-      jFirstScreenRenderTime = nullptr;
-    }
-    jFirstScreenRenderTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp));
-    return jFirstScreenRenderTime;
-  }
-
-  std::vector<int64_t> temp = page->PrintFirstScreenLog();
-
-  jlong ret[3];
-
-  ret[0] = temp[0];
-  ret[1] = temp[1];
-  ret[2] = temp[2];
-  env->SetLongArrayRegion(jTemp, 0, 3, ret);
-
-  if (jFirstScreenRenderTime != nullptr) {
-    env->DeleteGlobalRef(jFirstScreenRenderTime);
-    jFirstScreenRenderTime = nullptr;
-  }
-  jFirstScreenRenderTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp));
-
-  env->DeleteLocalRef(jTemp);
-  return jFirstScreenRenderTime;
-}
-
-static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller, jstring instanceId) {
-  jlongArray jTemp = env->NewLongArray(3);
-
-  RenderPage *page = RenderManager::GetInstance()->GetPage(jString2StrFast(env, instanceId));
-  if (page == nullptr) {
-    if (jRenderFinishTime != nullptr) {
-      env->DeleteGlobalRef(jRenderFinishTime);
-      jRenderFinishTime = nullptr;
-    }
-    jRenderFinishTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp));
-    return jRenderFinishTime;
-  }
-
-  std::vector<int64_t> temp = page->PrintRenderSuccessLog();
-
-  jlong ret[3];
-
-  ret[0] = temp[0];
-  ret[1] = temp[1];
-  ret[2] = temp[2];
-  env->SetLongArrayRegion(jTemp, 0, 3, ret);
-
-  if (jRenderFinishTime != nullptr) {
-    env->DeleteGlobalRef(jRenderFinishTime);
-    jRenderFinishTime = nullptr;
-  }
-  jRenderFinishTime = static_cast<jlongArray>(env->NewGlobalRef(jTemp));
-
-  env->DeleteLocalRef(jTemp);
-  return jRenderFinishTime;
-}
-
-//Notice that this method is invoked from main thread.
-static jboolean NotifyLayout(JNIEnv* env, jobject jcaller, jstring instanceId) {
-    bool ret = WeexCoreManager::getInstance()->getPlatformBridge()->notifyLayout(
-            env->GetStringUTFChars(instanceId, JNI_FALSE)
-    );
-    return ret ? JNI_TRUE : JNI_FALSE;
-}
-
-//Notice that this method is invoked from JS thread.
-static void ForceLayout(JNIEnv *env, jobject jcaller, jstring instanceId) {
-    WeexCoreManager::getInstance()->getPlatformBridge()->forceLayout(
-            env->GetStringUTFChars(instanceId, JNI_FALSE)
-    );
-}
-
-static void SetStyleWidth(JNIEnv *env, jobject jcaller,
-                          jstring instanceId, jstring ref, jfloat value) {
-
-
-    WeexCoreManager::getInstance()->getPlatformBridge()->setStyleWidth(
-            env->GetStringUTFChars(instanceId, JNI_FALSE),
-            env->GetStringUTFChars(ref, JNI_FALSE),
-            value
-    );
-}
-
-static void SetStyleHeight(JNIEnv *env, jobject jcaller,
-                           jstring instanceId, jstring ref, jfloat value) {
-    WeexCoreManager::getInstance()->getPlatformBridge()->setStyleHeight(
-            env->GetStringUTFChars(instanceId, JNI_FALSE),
-            env->GetStringUTFChars(ref, JNI_FALSE),
-            value
-    );
-}
-
-static void SetMargin(JNIEnv *env, jobject jcaller,
-                      jstring instanceId, jstring ref, jint edge, jfloat value) {
-    WeexCoreManager::getInstance()->getPlatformBridge()->setMargin(
-            env->GetStringUTFChars(instanceId, JNI_FALSE),
-            env->GetStringUTFChars(ref, JNI_FALSE),
-            edge,
-            value
-    );
-}
-
-static void SetPadding(JNIEnv *env, jobject jcaller,
-                       jstring instanceId, jstring ref, jint edge, jfloat value) {
-    WeexCoreManager::getInstance()->getPlatformBridge()->setPadding(
-            env->GetStringUTFChars(instanceId, JNI_FALSE),
-            env->GetStringUTFChars(ref, JNI_FALSE),
-            edge,
-            value
-    );
-}
-
-
-static void SetPosition(JNIEnv *env, jobject jcaller,
-                        jstring instanceId, jstring ref, jint edge, jfloat value) {
-  WeexCoreManager::getInstance()->getPlatformBridge()->setPosition(
-          env->GetStringUTFChars(instanceId, JNI_FALSE),
-          env->GetStringUTFChars(ref, JNI_FALSE),
-          edge,
-          value
-  );
-}
-
-static void MarkDirty(JNIEnv *env, jobject jcaller,
-                      jstring instanceId, jstring ref, jboolean dirty) {
-    WeexCoreManager::getInstance()->getPlatformBridge()->markDirty(
-            env->GetStringUTFChars(instanceId, JNI_FALSE),
-            env->GetStringUTFChars(ref, JNI_FALSE),
-            dirty
-    );
-}
-
-static void RegisterCoreEnv(JNIEnv *env, jobject jcaller, jstring key, jstring value) {
-  LOGE("RegisterCoreEnv,key: %s, value: %s", jString2StrFast(env, key).c_str(),
-       jString2StrFast(env, value).c_str());
-  WXCoreEnvironment::getInstance()->AddOption(jString2StrFast(env, key), jString2StrFast(env, value));
-}
-
-static jint InitFramework(JNIEnv *env, jobject object, jstring script, jobject params) {
-  jThis = env->NewGlobalRef(object);
-  jclass tempClass = env->FindClass(
-          "com/taobao/weex/bridge/WXBridge");
-  jBridgeClazz = (jclass) env->NewGlobalRef(tempClass);
-  env->DeleteLocalRef(tempClass);
-  return WeexProxy::doInitFramework(env, jThis, script, params);
-}
-
-static jint ExecJSService(JNIEnv *env, jobject object, jstring script) {
-  if (script == nullptr)
-    return false;
-  return WeexProxy::execJSService(env, object, script);
-}
-
-static void TakeHeapSnapshot(JNIEnv *env, jobject object, jstring name) {
-}
-
-static void RefreshInstance(JNIEnv* env, jobject jcaller,
-                            jstring instanceId,
-                            jstring _namespace,
-                            jstring _function,
-                            jobjectArray args) {
-  WeexProxy::RefreshInstance(env, jcaller, instanceId, _namespace, _function, args);
-}
-
-/**
- * Called to execute JavaScript such as . createInstance(),destroyInstance ext.
- *
- */
-static jint ExecJS(JNIEnv *env, jobject jthis, jstring jinstanceid, jstring jnamespace, jstring jfunction, jobjectArray jargs) {
-  if (jfunction == NULL || jinstanceid == NULL) {
-    LOGE("native_execJS function is NULL");
-    return false;
-  }
-
-  return WeexProxy::execJS(env, jThis, jinstanceid, jnamespace, jfunction, jargs);
-}
-
-static jbyteArray ExecJSWithResult(JNIEnv* env, jobject jcaller, jstring instanceId, jstring _namespace, jstring _function, jobjectArray args) {
-  if (_function == NULL || instanceId == NULL) {
-    LOGE("native_execJS function is NULL");
-    return NULL;
-  }
-
-  return WeexProxy::execJSWithResult(env, jcaller, instanceId, _namespace, _function, args);
-}
-
-static void UpdateGlobalConfig(JNIEnv* env, jobject jcaller, jstring config) {
-  WeexProxy::updateGlobalConfig(env, jcaller, config);
-}
-
-
-static jint CreateInstanceContext(JNIEnv* env, jobject jcaller, jstring instanceId, jstring name, jstring function, jobjectArray args) {
-  return WeexProxy::createInstanceContext(env, jcaller, instanceId, name, function, args);
-}
-
-static jint DestoryInstance(JNIEnv* env, jobject jcaller, jstring instanceId, jstring name, jstring function, jobjectArray args) {
-  return WeexProxy::destoryInstance(env, jcaller, instanceId, name, function, args);
-}
-
-static jstring ExecJSOnInstance(JNIEnv* env, jobject jcaller, jstring instanceId, jstring script, jint type) {
-  return WeexProxy::execJSOnInstance(env, jcaller, instanceId, script, type);
-}
-
-static jint native_initAppFramework(JNIEnv* env,
-                                    jobject jcaller,
-                                    jstring jinstanceid,
-                                    jstring jframwork,
-                                    jobjectArray jargs) {
-  jWMThis = env->NewGlobalRef(jcaller);
-  Bridge_Impl_Android::getInstance()->setGlobalWMRef(jWMThis);
-  return WeexProxy::initAppFramework(env, jcaller, jinstanceid, jframwork, jargs);
-}
-
-static jint native_destoryAppContext(JNIEnv* env,
-                                     jobject jcaller,
-                                     jstring jinstanceid) {
-  return WeexProxy::destoryAppContext(env, jcaller, jinstanceid);
-}
-
-static jint native_createAppContext(JNIEnv* env,
-                                    jobject jcaller,
-                                    jstring jinstanceid,
-                                    jstring jbundle,
-                                    jobject jargs) {
-  return WeexProxy::createAppContext(env, jcaller, jinstanceid, jbundle, jargs);
-}
-
-static jbyteArray native_execJsOnAppWithResult(JNIEnv* env,
-                                               jobject jcaller,
-                                               jstring jinstanceid,
-                                               jstring jbundle,
-                                               jobject jargs) {
-  return WeexProxy::execJsOnAppWithResult(env, jcaller, jinstanceid, jbundle, jargs);
-}
-
-static jint native_execJsOnApp(JNIEnv* env,
-                               jobject jcaller,
-                               jstring jinstanceid,
-                               jstring jfunction,
-                               jobjectArray jargs) {
-  return WeexProxy::execJsOnApp(env, jcaller, jinstanceid, jfunction, jargs);
-}
-
-
-namespace WeexCore {
-  bool RegisterJNIUtils(JNIEnv *env) {
-    return RegisterNativesImpl(env);
-  }
-  static JNINativeMethod gWMMethods[] = {
-        {"initAppFramework",
-                "(Ljava/lang/String;Ljava/lang/String;[Lcom/taobao/weex/bridge/WXJSObject;)I",
-                (void *) native_initAppFramework},
-        {"createAppContext",
-                "(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;)I",
-                (void *) native_createAppContext},
-        { "execJsOnApp",
-                "(Ljava/lang/String;Ljava/lang/String;"
-                        "[Lcom/taobao/weex/bridge/WXJSObject;)I",
-                (void*)native_execJsOnApp },
-        { "execJsOnAppWithResult",
-                "(Ljava/lang/String;Ljava/lang/String;"
-                        "Ljava/util/Map;)[B",
-                (void*)native_execJsOnAppWithResult },
-        { "destoryAppContext",
-                "(Ljava/lang/String;)I",
-                (void*)native_destoryAppContext },
-  };
-
-  static int registerWMLBridgeNativeMethods(JNIEnv* env, JNINativeMethod* methods, int numMethods) {
-    if (jWMBridgeClazz == NULL) {
-      LOGE("registerWMLBridgeNativeMethods failed to find bridge class.");
-      return JNI_FALSE;
-    }
-    if ((env)->RegisterNatives(jWMBridgeClazz, methods, numMethods) < 0) {
-      LOGE("registerWMLBridgeNativeMethods failed to register native methods for bridge class.");
-      return JNI_FALSE;
-    }
-
-    return JNI_TRUE;
-}
-
-
-
-jint OnLoad(JavaVM *vm, void *reserved) {
-    LOGD("begin JNI_OnLoad");
-    JNIEnv *env;
-    /* Get environment */
-    if ((vm)->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
-      return JNI_FALSE;
-    }
-    try {
-      throw 1;
-    } catch (int) {
-    }
-    sVm = vm;
-    jclass tempClass = env->FindClass(
-        "com/taobao/weex/bridge/WXBridge");
-    jBridgeClazz = (jclass) env->NewGlobalRef(tempClass);
-
-    tempClass = env->FindClass("com/taobao/weex/bridge/WXJSObject");
-    jWXJSObject = (jclass) env->NewGlobalRef(tempClass);
-
-    tempClass = env->FindClass("com/taobao/weex/utils/WXLogUtils");
-    jWXLogUtils = (jclass) env->NewGlobalRef(tempClass);
-
-    tempClass = env->FindClass("com/taobao/weex/utils/WXMap");
-    jMapClazz = (jclass) env->NewGlobalRef(tempClass);
-
-    tempClass = env->FindClass("java/util/HashSet");
-    jSetClazz = (jclass) env->NewGlobalRef(tempClass);
-
-    jMapConstructorMethodId = env->GetMethodID(jMapClazz, "<init>", "()V");
-    jMapPutMethodId = env->GetMethodID(jMapClazz, "put", "(Ljava/lang/String;[B)Ljava/lang/String;");
-    jSetConstructorMethodId = env->GetMethodID(jSetClazz, "<init>", "()V");
-    jSetAddMethodId = env->GetMethodID(jSetClazz, "add", "(Ljava/lang/Object;)Z");
-
-    // can use this code to manal register jni
-    tempClass = nullptr;
-    tempClass = env->FindClass("com/taobao/windmill/bridge/WMLBridge");
-    // use to check WMLBridge has already on env
-    if (env->ExceptionOccurred()) {
-      LOGE("failed find class WMBridge");
-      env->ExceptionDescribe();
-      env->ExceptionClear();
-      jWMBridgeClazz = nullptr;
-    } else if (tempClass != nullptr) {
-      jWMBridgeClazz = (jclass)env->NewGlobalRef(tempClass);
-      LOGE("success find class WMBridge");
-      registerWMLBridgeNativeMethods(env, gWMMethods, sizeof(gWMMethods) / sizeof(gWMMethods[0]));
-    }
-    env->DeleteLocalRef(tempClass);
-
-    LOGD("end JNI_OnLoad");
-    WeexProxy::setCacheDir(env);
-
-    return JNI_VERSION_1_4;
-  }
-
-  void Unload(JavaVM *vm, void *reserved) {
-    LOGD("beigin JNI_OnUnload");
-    JNIEnv *env;
-
-    /* Get environment */
-    if ((vm)->GetEnv((void **) &env, JNI_VERSION_1_4) != JNI_OK) {
-      return;
-    }
-    env->DeleteGlobalRef(jBridgeClazz);
-    env->DeleteGlobalRef(jWXJSObject);
-    env->DeleteGlobalRef(jWXLogUtils);
-    env->DeleteGlobalRef(jMapClazz);
-
-    jMapConstructorMethodId = nullptr;
-    jMapPutMethodId = nullptr;
-    jSetConstructorMethodId = nullptr;
-    jSetAddMethodId = nullptr;
-
-    if (jFirstScreenRenderTime != nullptr) {
-      env->DeleteLocalRef(jFirstScreenRenderTime);
-      jFirstScreenRenderTime = nullptr;
-    }
-
-    if (jRenderFinishTime != nullptr) {
-      env->DeleteLocalRef(jRenderFinishTime);
-      jRenderFinishTime = nullptr;
-    }
-
-    for (auto iter = componentTypeCache.begin(); iter != componentTypeCache.end(); iter++) {
-      if (iter->second != nullptr) {
-        env->DeleteGlobalRef(iter->second);
-        iter->second = nullptr;
-      }
-    }
-    componentTypeCache.clear();
-
-    refCache.clearRefCache(env);
-
-    if (jThis)
-      env->DeleteGlobalRef(jThis);
-    if (jWMThis)
-      env->DeleteLocalRef(jWMThis);
-    WeexProxy::reset();
-    LOGD(" end JNI_OnUnload");
-  }
-}
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/impl/weexcore_impl_android.h b/weex_core/Source/android/bridge/impl/weexcore_impl_android.h
deleted file mode 100644
index 1b3c1a1ff5..0000000000
--- a/weex_core/Source/android/bridge/impl/weexcore_impl_android.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-#ifndef _WEEX_CORE_H_
-#define _WEEX_CORE_H_
-
-#include <android/base/log_utils.h>
-#include <android/base/string/scoped_jstring.h>
-#include <android/base/string/scoped_jstring_utf8.h>
-#include <android/jsengine/multiprocess/WeexJSConnection.h>
-#include <android/base/string/jstring_cache.h>
-#include <jni.h>
-#include <string>
-#include <unistd.h>
-#include <map>
-#include <string>
-
-extern jclass jBridgeClazz;
-extern jclass jWXJSObject;
-extern jclass jWXLogUtils;
-extern jmethodID jDoubleValueMethodId;
-extern jobject jThis;
-extern jobject jWMThis;
-extern jclass jMapClazz;
-extern jclass jSetClazz;
-extern jmethodID jMapConstructorMethodId;
-extern jmethodID jMapPutMethodId;
-extern jmethodID jSetConstructorMethodId;
-extern jmethodID jSetAddMethodId;
-extern jclass jWMBridgeClazz;
-extern JNIEnv *getJNIEnv();
-extern jstring getComponentTypeFromCache(const std::string type);
-extern jstring putComponentTypeToCache(const std::string type);
-extern jstring getKeyFromCache(JNIEnv *env, const char *key);
-extern jfloatArray c2jFloatArray(JNIEnv *env, const float c_array[]);
-
-namespace WeexCore {
-
-bool RegisterJNIUtils(JNIEnv *env);
-
-jint OnLoad(JavaVM *vm, void *reserved);
-
-void Unload(JavaVM *vm, void *reserved);
-
-}
-
-#endif //_WEEX_CORE_H_
diff --git a/weex_core/Source/android/bridge/multi_process_and_so_initializer.cpp b/weex_core/Source/android/bridge/multi_process_and_so_initializer.cpp
new file mode 100644
index 0000000000..51a09ec584
--- /dev/null
+++ b/weex_core/Source/android/bridge/multi_process_and_so_initializer.cpp
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "multi_process_and_so_initializer.h"
+#include <Buffering/IPCBuffer.h>
+#include <IPCException.h>
+#include <IPCHandler.h>
+#include <IPCResult.h>
+#include <Serializing/IPCSerializer.h>
+#include <android/base/log_utils.h>
+#include <android/jsengine/multiprocess/ExtendJSApi.h>
+#include <android/jsengine/multiprocess/WeexJSConnection.h>
+
+namespace WeexCore {
+
+bool MultiProcessAndSoInitializer::Init(const std::function<void(IPCHandler*)>& OnHandlerCreated,
+                                        const std::function<bool(std::unique_ptr<WeexJSConnection>, std::unique_ptr<IPCHandler>, std::unique_ptr<IPCHandler>)>& OnInitFinished,
+                                        const std::function<void(const char*, const char*, const char*)>& ReportException){
+  bool reinit = false;
+  LOGE("MultiProcessAndSoInitializer IS IN init");
+startInitFrameWork:
+  try {
+    auto handler = std::move(createIPCHandler());
+    auto server_handler = std::move(createIPCHandler());
+    OnHandlerCreated(server_handler.get());
+    std::unique_ptr<WeexJSConnection> connection(new WeexJSConnection());
+    auto sender = connection->start(handler.get(), server_handler.get(), reinit);
+    if (sender == nullptr) {
+      LOGE("JSFramwork init start sender is null");
+      if (!reinit) {
+        reinit = true;
+        goto startInitFrameWork;
+      } else {
+        return false;
+      }
+    } else {
+      OnInitFinished(std::move(connection), std::move(handler), std::move(server_handler));
+    }
+  } catch (IPCException& e) {
+    LOGE("WeexProxy catch:%s", e.msg());
+    if (!reinit) {
+      reinit = true;
+      goto startInitFrameWork;
+    } else {
+      LOGE("%s", e.msg());
+      ReportException("", "initFramework", e.msg());
+      return false;
+    }
+  }
+  return true;
+}
+}  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/multi_process_and_so_initializer.h b/weex_core/Source/android/bridge/multi_process_and_so_initializer.h
new file mode 100644
index 0000000000..424e4d7d97
--- /dev/null
+++ b/weex_core/Source/android/bridge/multi_process_and_so_initializer.h
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WEEX_PROJECT_MULTI_PROCESS_AND_SO_INITIALIZER_H
+#define WEEX_PROJECT_MULTI_PROCESS_AND_SO_INITIALIZER_H
+
+#include <functional>
+#include <memory>
+
+class IPCHandler;
+class WeexJSConnection;
+namespace WeexCore {
+class MultiProcessAndSoInitializer {
+ public:
+  MultiProcessAndSoInitializer() {}
+  virtual ~MultiProcessAndSoInitializer() {}
+
+  bool Init(const std::function<void(IPCHandler*)>&,
+            const std::function<bool(std::unique_ptr<WeexJSConnection>, std::unique_ptr<IPCHandler>, std::unique_ptr<IPCHandler>)>&,
+            const std::function<void(const char*, const char*, const char*)>&);
+};
+}  // namespace WeexCore
+
+#endif  // WEEX_PROJECT_MULTI_PROCESS_AND_SO_INITIALIZER_H
diff --git a/weex_core/Source/android/bridge/multi_so_initializer.cpp b/weex_core/Source/android/bridge/multi_so_initializer.cpp
new file mode 100644
index 0000000000..fe70dd3d7b
--- /dev/null
+++ b/weex_core/Source/android/bridge/multi_so_initializer.cpp
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "multi_so_initializer.h"
+#include <android/base/log_utils.h>
+#include <android/utils/so_utils.h>
+#include <dlfcn.h>
+
+namespace WeexCore {
+
+bool MultiSoInitializer::Init(
+    const std::function<bool(void *)> &OnInitFinished,
+    const std::function<void(const char *, const char *)>
+        &ReportNativeInitStatus) {
+  std::string soPath = "";
+
+  // -----------------------------------------------
+  // use find path to get lib path
+  // use set path is better idea, should change in future
+  if (SoUtils::jss_so_path() != nullptr) {
+    soPath = SoUtils::jss_so_path();
+  }
+
+  if (soPath.empty()) {
+    soPath = SoUtils::FindLibJssSoPath();
+  }
+
+  LOGE("final executablePath:%s", soPath.c_str());
+  SoUtils::updateSoLinkPath(SoUtils::lib_ld_path());
+  void *handle = dlopen(soPath.c_str(), RTLD_NOW);
+  if (!handle) {
+    const char *error = dlerror();
+    LOGE("load %s failed,error=%s\n", SoUtils::jss_so_name(), error);
+    ReportNativeInitStatus("-1005", error);
+    // try again use current path
+    //dlclose(handle);
+    return false;
+  }
+
+  // clear dlopen error message
+  dlerror();
+
+  if (!OnInitFinished(handle)) {
+    const char *error = dlerror();
+    LOGE("load External_InitFrameWork failed,error=%s\n", error);
+    ReportNativeInitStatus("-1006", error);
+    dlclose(handle);
+    ReportNativeInitStatus("-1007", "Init Functions failed");
+    return false;
+  }
+  return true;
+}
+}  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/multi_so_initializer.h b/weex_core/Source/android/bridge/multi_so_initializer.h
new file mode 100644
index 0000000000..a7d947edeb
--- /dev/null
+++ b/weex_core/Source/android/bridge/multi_so_initializer.h
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WEEX_PROJECT_MULTI_SO_INITIALIZER_H
+#define WEEX_PROJECT_MULTI_SO_INITIALIZER_H
+
+#include <functional>
+
+namespace WeexCore {
+class MultiSoInitializer {
+ public:
+  MultiSoInitializer() {}
+  virtual ~MultiSoInitializer() {}
+
+  bool Init(const std::function<bool(void*)>& OnInitFinished,
+            const std::function<void(const char*, const char*)>&
+                ReportNativeInitStatus);
+};
+}  // namespace WeexCore
+
+#endif  // WEEX_PROJECT_MULTI_SO_INITIALIZER_H
diff --git a/weex_core/Source/android/bridge/platform/android_bridge.cpp b/weex_core/Source/android/bridge/platform/android_bridge.cpp
new file mode 100644
index 0000000000..0236e80479
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_bridge.cpp
@@ -0,0 +1,36 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include <base/LogDefines.h>
+#include "android_bridge.h"
+#include "android/bridge/platform/android_side.h"
+#include "core/bridge/platform/core_side_in_platform.h"
+
+namespace WeexCore {
+
+AndroidBridgeInSimple::AndroidBridgeInSimple() {
+  set_core_side(new CoreSideInPlatform);
+  set_platform_side(new AndroidSide);
+}
+
+AndroidBridgeInSimple::~AndroidBridgeInSimple() {
+  LOGE("~AndroidBridgeInSimple");
+}
+
+}  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/platform/android_bridge.h b/weex_core/Source/android/bridge/platform/android_bridge.h
new file mode 100644
index 0000000000..40e661cbc2
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_bridge.h
@@ -0,0 +1,34 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WEEX_PROJECT_PLATFORM_BRIDGE_IN_SIMPLE_H
+#define WEEX_PROJECT_PLATFORM_BRIDGE_IN_SIMPLE_H
+
+#include <jni.h>
+#include "core/bridge/platform_bridge.h"
+
+namespace WeexCore {
+    class AndroidBridgeInSimple : public PlatformBridge {
+    public:
+        AndroidBridgeInSimple();
+        ~AndroidBridgeInSimple();
+    };
+}
+
+#endif //WEEX_PROJECT_PLATFORM_BRIDGE_IN_SIMPLE_H
diff --git a/weex_core/Source/android/bridge/platform/android_bridge_in_multi_process.cc b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_process.cc
new file mode 100644
index 0000000000..6923bfbcad
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_process.cc
@@ -0,0 +1,835 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "android_bridge_in_multi_process.h"
+#include "IPC/IPCArguments.h"
+#include "IPC/IPCHandler.h"
+#include "IPC/IPCMessageJS.h"
+#include "IPC/IPCResult.h"
+#include "IPC/IPCSender.h"
+#include "IPC/Serializing/IPCSerializer.h"
+#include "android/base/string/string_utils.h"
+#include "android/bridge/platform/android_side.h"
+#include "android/utils/IPCStringResult.h"
+#include "core/layout/layout.h"
+#include "core/manager/weex_core_manager.h"
+#include "core/render/manager/render_manager.h"
+#include "core_side_in_multi_process.h"
+#include "include/WeexApiHeader.h"
+#include "android/bridge/multi_process_and_so_initializer.h"
+#include "wson/wson_parser.h"
+
+namespace WeexCore {
+
+AndroidBridgeInMultiProcess::AndroidBridgeInMultiProcess() {
+  set_platform_side(new AndroidSide);
+  set_core_side(new CoreSideInMultiProcess);
+
+  std::unique_ptr<MultiProcessAndSoInitializer> initializer(
+      new MultiProcessAndSoInitializer);
+  bool passable = initializer->Init(
+      [this](IPCHandler* handler) { RegisterIPCCallback(handler); },
+      [this](std::unique_ptr<WeexJSConnection> connection,
+             std::unique_ptr<IPCHandler> handler,
+             std::unique_ptr<IPCHandler> server_handler) {
+        static_cast<CoreSideInMultiProcess*>(core_side())
+            ->set_sender(connection->sender());
+        connection_ = std::move(connection);
+        handler_ = std::move(handler);
+        server_handler_ = std::move(server_handler);
+        return true;
+      },
+      [this](const char* page_id, const char* func,
+             const char* exception_string) {
+        platform_side()->ReportException(page_id, func, exception_string);
+      });
+  set_is_passable(passable);
+}
+
+AndroidBridgeInMultiProcess::~AndroidBridgeInMultiProcess() {}
+
+void AndroidBridgeInMultiProcess::RegisterIPCCallback(IPCHandler* handler) {
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::INVOKE_MEASURE_FUNCTION),
+      InvokeMeasureFunction);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::INVOKE_LAYOUT_BEFORE),
+      InvokeLayoutBefore);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::INVOKE_LAYOUT_AFTER),
+      InvokeLayoutAfter);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::SET_JS_VERSION),
+      SetJSVersion);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::REPORT_EXCEPTION),
+      ReportException);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::CALL_NATIVE), CallNative);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::CALL_NATIVE_MODULE),
+      CallNativeModule);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::CALL_NATIVE_COMPONENT),
+      CallNativeComponent);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::SET_TIMEOUT), SetTimeout);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::NATIVE_LOG), NativeLog);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::UPDATE_FINISH),
+      UpdateFinish);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::REFRESH_FINISH),
+      RefreshFinish);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::ADD_EVENT), AddEvent);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::REMOVE_EVENT),
+      RemoveEvent);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::CREATE_BODY), CreateBody);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::ADD_ELEMENT), AddElement);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::LAYOUT), Layout);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::UPDATE_STYLE),
+      UpdateStyle);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::UPDATE_ATTR), UpdateAttr);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::CREATE_FINISH),
+      CreateFinish);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::RENDER_SUCCESS),
+      RenderSuccess);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::REMOVE_ELEMENT),
+      RemoveElement);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::MOVE_ELEMENT),
+      MoveElement);
+  handler->registerHandler(
+      static_cast<uint32_t>(
+          IPCMsgFromCoreToPlatform::APPEND_TREE_CREATE_FINISH),
+      AppendTreeCreateFinish);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::HAS_TRANSITION_PROS),
+      HasTransitionPros);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::POST_MESSAGE),
+      PostMessage);
+  handler->registerHandler(
+      static_cast<uint32_t>(IPCMsgFromCoreToPlatform::DISPATCH_MESSAGE),
+      DispatchMessage);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::InvokeMeasureFunction(
+    IPCArguments* arguments) {
+  auto page_id = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  int64_t render_ptr = getArgumentAsInt64(arguments, 1);
+  float width = getArgumentAsFloat(arguments, 2);
+  int32_t width_measure_mode = getArgumentAsInt32(arguments, 3);
+  float height = getArgumentAsFloat(arguments, 4);
+  int32_t height_measure_mode = getArgumentAsInt32(arguments, 5);
+
+  WXCoreSize size = WeexCoreManager::Instance()
+                        ->getPlatformBridge()
+                        ->platform_side()
+                        ->InvokeMeasureFunction(page_id.get(), render_ptr,
+                                                width, width_measure_mode,
+                                                height, height_measure_mode);
+
+  float result[]{size.width, size.height};
+
+  return createByteArrayResult(reinterpret_cast<const char*>(result),
+                               2 * sizeof(float));
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::InvokeLayoutBefore(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  int64_t render_ptr = getArgumentAsInt64(arguments, 1);
+
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->InvokeLayoutBefore(page_id, render_ptr);
+
+  delete[] page_id;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::InvokeLayoutAfter(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  int64_t render_ptr = getArgumentAsInt64(arguments, 1);
+  float width = getArgumentAsFloat(arguments, 2);
+  float height = getArgumentAsFloat(arguments, 3);
+
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->InvokeLayoutAfter(page_id, render_ptr, width, height);
+
+  delete[] page_id;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::SetJSVersion(
+    IPCArguments* arguments) {
+  const char* version = getArumentAsCStr(arguments, 0);
+
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->SetJSVersion(version);
+
+  delete[] version;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::ReportException(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* func = getArumentAsCStr(arguments, 1);
+  const char* exception = getArumentAsCStr(arguments, 2);
+
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->ReportException(page_id, func, exception);
+
+  delete[] page_id;
+  delete[] func;
+  delete[] exception;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::CallNative(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* task = getArumentAsCStr(arguments, 1);
+  const char* callback = getArumentAsCStr(arguments, 2);
+
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->CallNative(page_id, task, callback);
+
+  delete[] page_id;
+  delete[] task;
+  delete[] callback;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::CallNativeModule(
+    IPCArguments* arguments) {
+  auto page_id = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  auto module = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  auto method = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+  auto arguments_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 3));
+  int arguments_data_length = getArumentAsCStrLen(arguments, 3);
+  auto options = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 4));
+  int options_length = getArumentAsCStrLen(arguments, 4);
+
+  auto result =
+      WeexCoreManager::Instance()
+          ->getPlatformBridge()
+          ->platform_side()
+          ->CallNativeModule(page_id.get(), module.get(), method.get(),
+                             arguments_data.get(), arguments_data_length,
+                             options.get(), options_length);
+
+  return result;
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::CallNativeComponent(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+  const char* method = getArumentAsCStr(arguments, 2);
+  const char* arguments_data = getArumentAsCStr(arguments, 3);
+  int arguments_data_length = getArgumentAsInt32(arguments, 4);
+  const char* options = getArumentAsCStr(arguments, 5);
+  int options_length = getArgumentAsInt32(arguments, 6);
+
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->CallNativeComponent(page_id, ref, method, arguments_data,
+                            arguments_data_length, options, options_length);
+
+  delete[] page_id;
+  delete[] ref;
+  delete[] method;
+  delete[] arguments_data;
+  delete[] options;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::SetTimeout(
+    IPCArguments* arguments) {
+  const char* callback_id = getArumentAsCStr(arguments, 0);
+  const char* time = getArumentAsCStr(arguments, 1);
+
+  WeexCoreManager::Instance()->getPlatformBridge()->platform_side()->SetTimeout(
+      callback_id, time);
+
+  delete[] callback_id;
+  delete[] time;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::NativeLog(
+    IPCArguments* arguments) {
+  const char* str_array = getArumentAsCStr(arguments, 0);
+
+  WeexCoreManager::Instance()->getPlatformBridge()->platform_side()->NativeLog(
+      str_array);
+
+  delete[] str_array;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::UpdateFinish(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* task = getArumentAsCStr(arguments, 1);
+  int taskLen = getArumentAsCStrLen(arguments, 1);
+  const char* callback = getArumentAsCStr(arguments, 2);
+  int callbackLen = getArumentAsCStrLen(arguments, 2);
+
+  int result =
+      WeexCoreManager::Instance()
+          ->getPlatformBridge()
+          ->platform_side()
+          ->UpdateFinish(page_id, task, taskLen, callback, callbackLen);
+
+  delete[] page_id;
+  delete[] task;
+  delete[] callback;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::RefreshFinish(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* task = getArumentAsCStr(arguments, 1);
+  const char* callback = getArumentAsCStr(arguments, 2);
+
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->RefreshFinish(page_id, task, callback);
+
+  delete[] page_id;
+  delete[] task;
+  delete[] callback;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::AddEvent(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+  const char* event = getArumentAsCStr(arguments, 2);
+
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->AddEvent(page_id, ref, event);
+
+  delete[] page_id;
+  delete[] ref;
+  delete[] event;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::RemoveEvent(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+  const char* event = getArumentAsCStr(arguments, 2);
+
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->RemoveEvent(page_id, ref, event);
+
+  delete[] page_id;
+  delete[] ref;
+  delete[] event;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::CreateBody(
+    IPCArguments* arguments) {
+  auto page_id = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  auto component_type = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  auto ref = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+  // styles
+  std::map<std::string, std::string> styles;
+  if (arguments->getType(3) != IPCType::VOID) {
+    auto styles_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 3));
+    wson_parser styles_parser = wson_parser(styles_data.get());
+    styles_parser.nextType();
+    int styles_length = styles_parser.nextMapSize();
+    for (int i = 0; i < styles_length; ++i) {
+      std::string key = styles_parser.nextStringUTF8(styles_parser.nextType());
+      std::string value =
+          styles_parser.nextStringUTF8(styles_parser.nextType());
+      styles.insert(std::make_pair<std::string, std::string>(std::move(key),
+                                                             std::move(value)));
+    }
+  }
+  // attributes
+  std::map<std::string, std::string> attributes;
+  if (arguments->getType(4) != IPCType::VOID) {
+    auto attributes_data =
+        std::unique_ptr<char[]>(getArumentAsCStr(arguments, 4));
+    wson_parser attributes_parser = wson_parser(attributes_data.get());
+    attributes_parser.nextType();
+    int attributes_length = attributes_parser.nextMapSize();
+    for (int i = 0; i < attributes_length; ++i) {
+      std::string key =
+          attributes_parser.nextStringUTF8(attributes_parser.nextType());
+      std::string value =
+          attributes_parser.nextStringUTF8(attributes_parser.nextType());
+      attributes.insert(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+  // events
+  std::set<std::string> events;
+  if (arguments->getType(5) != IPCType::VOID) {
+    auto events_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 5));
+    wson_parser events_parser = wson_parser(events_data.get());
+    events_parser.nextType();
+    int events_length = events_parser.nextArraySize();
+    for (int i = 0; i < events_length; ++i) {
+      events.insert(events_parser.nextStringUTF8(events_parser.nextType()));
+    }
+  }
+  // margin
+  auto margins_buffer = const_cast<uint16_t*>(arguments->getString(6)->content);
+  WXCoreMargin margin;
+  margin.setMargin(kMarginTop,
+                   reinterpret_cast<const float*>(margins_buffer)[0]);
+  margin.setMargin(kMarginBottom,
+                   reinterpret_cast<const float*>(margins_buffer)[1]);
+  margin.setMargin(kMarginLeft,
+                   reinterpret_cast<const float*>(margins_buffer)[2]);
+  margin.setMargin(kMarginRight,
+                   reinterpret_cast<const float*>(margins_buffer)[3]);
+  // padding
+  auto paddings_buffer =
+      const_cast<uint16_t*>(arguments->getString(7)->content);
+  WXCorePadding padding;
+  padding.setPadding(kPaddingTop,
+                     reinterpret_cast<const float*>(paddings_buffer)[0]);
+  padding.setPadding(kPaddingBottom,
+                     reinterpret_cast<const float*>(paddings_buffer)[1]);
+  padding.setPadding(kPaddingLeft,
+                     reinterpret_cast<const float*>(paddings_buffer)[2]);
+  padding.setPadding(kPaddingRight,
+                     reinterpret_cast<const float*>(paddings_buffer)[3]);
+  // border
+  auto borders_buffer = const_cast<uint16_t*>(arguments->getString(8)->content);
+  WXCoreBorderWidth border;
+  border.setBorderWidth(kBorderWidthTop,
+                        reinterpret_cast<const float*>(borders_buffer)[0]);
+  border.setBorderWidth(kBorderWidthBottom,
+                        reinterpret_cast<const float*>(borders_buffer)[1]);
+  border.setBorderWidth(kBorderWidthLeft,
+                        reinterpret_cast<const float*>(borders_buffer)[2]);
+  border.setBorderWidth(kBorderWidthRight,
+                        reinterpret_cast<const float*>(borders_buffer)[3]);
+
+  int result =
+      WeexCoreManager::Instance()
+          ->getPlatformBridge()
+          ->platform_side()
+          ->CreateBody(page_id.get(), component_type.get(), ref.get(), &styles,
+                       &attributes, &events, margin, padding, border);
+
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::AddElement(
+    IPCArguments* arguments) {
+  auto page_id = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  auto component_type = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  auto ref = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+  int index = getArgumentAsInt32(arguments, 3);
+  auto parent_ref = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 4));
+  // styles
+  std::map<std::string, std::string> styles;
+  if (arguments->getType(5) != IPCType::VOID) {
+    auto styles_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 5));
+    wson_parser styles_parser = wson_parser(styles_data.get());
+    styles_parser.nextType();
+    int styles_length = styles_parser.nextMapSize();
+    for (int i = 0; i < styles_length; ++i) {
+      std::string key = styles_parser.nextStringUTF8(styles_parser.nextType());
+      std::string value =
+          styles_parser.nextStringUTF8(styles_parser.nextType());
+      styles.insert(std::make_pair<std::string, std::string>(std::move(key),
+                                                             std::move(value)));
+    }
+  }
+  // attributes
+  std::map<std::string, std::string> attributes;
+  if (arguments->getType(6) != IPCType::VOID) {
+    auto attributes_data =
+        std::unique_ptr<char[]>(getArumentAsCStr(arguments, 6));
+    wson_parser attributes_parser = wson_parser(attributes_data.get());
+    attributes_parser.nextType();
+    int attributes_length = attributes_parser.nextMapSize();
+    for (int i = 0; i < attributes_length; ++i) {
+      std::string key =
+          attributes_parser.nextStringUTF8(attributes_parser.nextType());
+      std::string value =
+          attributes_parser.nextStringUTF8(attributes_parser.nextType());
+      attributes.insert(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+  // events
+  std::set<std::string> events;
+  if (arguments->getType(7) != IPCType::VOID) {
+    auto events_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 7));
+    wson_parser events_parser = wson_parser(events_data.get());
+    events_parser.nextType();
+    int events_length = events_parser.nextArraySize();
+    for (int i = 0; i < events_length; ++i) {
+      events.insert(events_parser.nextStringUTF8(events_parser.nextType()));
+    }
+  }
+  // margin
+  auto margins_buffer = const_cast<uint16_t*>(arguments->getString(8)->content);
+  WXCoreMargin margin;
+  margin.setMargin(kMarginTop,
+                   reinterpret_cast<const float*>(margins_buffer)[0]);
+  margin.setMargin(kMarginBottom,
+                   reinterpret_cast<const float*>(margins_buffer)[1]);
+  margin.setMargin(kMarginLeft,
+                   reinterpret_cast<const float*>(margins_buffer)[2]);
+  margin.setMargin(kMarginRight,
+                   reinterpret_cast<const float*>(margins_buffer)[3]);
+  // padding
+  auto paddings_buffer =
+      const_cast<uint16_t*>(arguments->getString(9)->content);
+  WXCorePadding padding;
+  padding.setPadding(kPaddingTop,
+                     reinterpret_cast<const float*>(paddings_buffer)[0]);
+  padding.setPadding(kPaddingBottom,
+                     reinterpret_cast<const float*>(paddings_buffer)[1]);
+  padding.setPadding(kPaddingLeft,
+                     reinterpret_cast<const float*>(paddings_buffer)[2]);
+  padding.setPadding(kPaddingRight,
+                     reinterpret_cast<const float*>(paddings_buffer)[3]);
+  // border
+  auto borders_buffer =
+      const_cast<uint16_t*>(arguments->getString(10)->content);
+  WXCoreBorderWidth border;
+  border.setBorderWidth(kBorderWidthTop,
+                        reinterpret_cast<const float*>(borders_buffer)[0]);
+  border.setBorderWidth(kBorderWidthBottom,
+                        reinterpret_cast<const float*>(borders_buffer)[1]);
+  border.setBorderWidth(kBorderWidthLeft,
+                        reinterpret_cast<const float*>(borders_buffer)[2]);
+  border.setBorderWidth(kBorderWidthRight,
+                        reinterpret_cast<const float*>(borders_buffer)[3]);
+  // will_layout
+  bool will_layout = static_cast<bool>(getArgumentAsInt32(arguments, 11));
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->AddElement(page_id.get(), component_type.get(), ref.get(),
+                                index, parent_ref.get(), &styles, &attributes,
+                                &events, margin, padding, border, will_layout);
+
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::Layout(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+  int32_t top = getArgumentAsInt32(arguments, 2);
+  int32_t bottom = getArgumentAsInt32(arguments, 3);
+  int32_t left = getArgumentAsInt32(arguments, 4);
+  int32_t right = getArgumentAsInt32(arguments, 5);
+  int32_t height = getArgumentAsInt32(arguments, 6);
+  int32_t width = getArgumentAsInt32(arguments, 7);
+  int32_t index = getArgumentAsInt32(arguments, 8);
+
+  auto result =
+      WeexCoreManager::Instance()->getPlatformBridge()->platform_side()->Layout(
+          page_id, ref, top, bottom, left, right, height, width, index);
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::UpdateStyle(
+    IPCArguments* arguments) {
+  auto page_id = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  auto ref = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  // styles
+  std::vector<std::pair<std::string, std::string>> styles;
+  if (arguments->getType(2) != IPCType::VOID) {
+    auto styles_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+    wson_parser styles_parser = wson_parser(styles_data.get());
+    styles_parser.nextType();
+    int styles_length = styles_parser.nextMapSize();
+    for (int i = 0; i < styles_length; ++i) {
+      std::string key = styles_parser.nextStringUTF8(styles_parser.nextType());
+      std::string value =
+          styles_parser.nextStringUTF8(styles_parser.nextType());
+      styles.push_back(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+
+  // margin
+  std::vector<std::pair<std::string, std::string>> margins;
+  if (arguments->getType(3) != IPCType::VOID) {
+    auto margins_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 3));
+    wson_parser margins_parser = wson_parser(margins_data.get());
+    margins_parser.nextType();
+    int margins_length = margins_parser.nextMapSize();
+    for (int i = 0; i < margins_length; ++i) {
+      std::string key =
+          margins_parser.nextStringUTF8(margins_parser.nextType());
+      std::string value =
+          margins_parser.nextStringUTF8(margins_parser.nextType());
+      margins.push_back(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+
+  // padding
+  std::vector<std::pair<std::string, std::string>> paddings;
+  if (arguments->getType(4) != IPCType::VOID) {
+    auto paddings_data =
+        std::unique_ptr<char[]>(getArumentAsCStr(arguments, 4));
+    wson_parser paddings_parser = wson_parser(paddings_data.get());
+    paddings_parser.nextType();
+    int paddings_length = paddings_parser.nextMapSize();
+    for (int i = 0; i < paddings_length; ++i) {
+      std::string key =
+          paddings_parser.nextStringUTF8(paddings_parser.nextType());
+      std::string value =
+          paddings_parser.nextStringUTF8(paddings_parser.nextType());
+      paddings.push_back(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+
+  // border
+  std::vector<std::pair<std::string, std::string>> borders;
+  if (arguments->getType(5) != IPCType::VOID) {
+    auto borders_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 5));
+    wson_parser borders_parser = wson_parser(borders_data.get());
+    borders_parser.nextType();
+    int borders_length = borders_parser.nextMapSize();
+    for (int i = 0; i < borders_length; ++i) {
+      std::string key =
+          borders_parser.nextStringUTF8(borders_parser.nextType());
+      std::string value =
+          borders_parser.nextStringUTF8(borders_parser.nextType());
+      borders.push_back(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->UpdateStyle(page_id.get(), ref.get(), &styles, &margins,
+                                 &paddings, &borders);
+
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::UpdateAttr(
+    IPCArguments* arguments) {
+  auto page_id = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  auto ref = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  // attributes
+  std::vector<std::pair<std::string, std::string>> attributes;
+  if (arguments->getType(2) != IPCType::VOID) {
+    auto attributes_data =
+        std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+    wson_parser attributes_parser = wson_parser(attributes_data.get());
+    attributes_parser.nextType();
+    int attributes_length = attributes_parser.nextMapSize();
+    for (int i = 0; i < attributes_length; ++i) {
+      std::string key =
+          attributes_parser.nextStringUTF8(attributes_parser.nextType());
+      std::string value =
+          attributes_parser.nextStringUTF8(attributes_parser.nextType());
+      attributes.push_back(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+
+  int result = WeexCoreManager::Instance()
+                   ->getPlatformBridge()
+                   ->platform_side()
+                   ->UpdateAttr(page_id.get(), ref.get(), &attributes);
+
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::CreateFinish(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+
+  auto result = WeexCoreManager::Instance()
+                    ->getPlatformBridge()
+                    ->platform_side()
+                    ->CreateFinish(page_id);
+  delete[] page_id;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::RenderSuccess(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+
+  auto result = WeexCoreManager::Instance()
+                    ->getPlatformBridge()
+                    ->platform_side()
+                    ->RenderSuccess(page_id);
+  delete[] page_id;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::RemoveElement(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+
+  auto result = WeexCoreManager::Instance()
+                    ->getPlatformBridge()
+                    ->platform_side()
+                    ->RemoveElement(page_id, ref);
+  delete[] page_id;
+  delete[] ref;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::MoveElement(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+  const char* parent_ref = getArumentAsCStr(arguments, 2);
+  int32_t index = getArgumentAsInt32(arguments, 3);
+
+  auto result = WeexCoreManager::Instance()
+                    ->getPlatformBridge()
+                    ->platform_side()
+                    ->MoveElement(page_id, ref, parent_ref, index);
+  delete[] page_id;
+  delete[] ref;
+  delete[] parent_ref;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::AppendTreeCreateFinish(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+
+  auto result = WeexCoreManager::Instance()
+                    ->getPlatformBridge()
+                    ->platform_side()
+                    ->AppendTreeCreateFinish(page_id, ref);
+  delete[] page_id;
+  delete[] ref;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::HasTransitionPros(
+    IPCArguments* arguments) {
+  const char* page_id = getArumentAsCStr(arguments, 0);
+  const char* ref = getArumentAsCStr(arguments, 1);
+
+  std::vector<std::pair<std::string, std::string>> styles;
+  if (arguments->getType(2) != IPCType::VOID) {
+    auto styles_data = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+    wson_parser styles_parser = wson_parser(styles_data.get());
+    styles_parser.nextType();
+    int styles_length = styles_parser.nextMapSize();
+    for (int i = 0; i < styles_length; ++i) {
+      std::string key = styles_parser.nextStringUTF8(styles_parser.nextType());
+      std::string value =
+          styles_parser.nextStringUTF8(styles_parser.nextType());
+      styles.push_back(std::make_pair<std::string, std::string>(
+          std::move(key), std::move(value)));
+    }
+  }
+
+  auto result = WeexCoreManager::Instance()
+                    ->getPlatformBridge()
+                    ->platform_side()
+                    ->HasTransitionPros(page_id, ref, &styles);
+  delete[] page_id;
+  delete[] ref;
+  return createInt32Result(result);
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::PostMessage(
+    IPCArguments* arguments) {
+  const char* vm_id = getArumentAsCStr(arguments, 0);
+  const char* data = getArumentAsCStr(arguments, 1);
+  int dataLength = getArumentAsCStrLen(arguments, 1);
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->PostMessage(vm_id, data,dataLength);
+  delete[] vm_id;
+  delete[] data;
+  return createVoidResult();
+}
+
+std::unique_ptr<IPCResult> AndroidBridgeInMultiProcess::DispatchMessage(
+    IPCArguments* arguments) {
+  const char* client_id = getArumentAsCStr(arguments, 0);
+  const char* vm_id = getArumentAsCStr(arguments, 1);
+  const char* data = getArumentAsCStr(arguments, 2);
+  int dataLength = getArumentAsCStrLen(arguments, 2);
+  const char* callback = getArumentAsCStr(arguments, 3);
+
+  
+
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->DispatchMessage(client_id, data, dataLength, callback, vm_id);
+  delete[] client_id;
+  delete[] vm_id;
+  delete[] data;
+  delete[] callback;
+  return createVoidResult();
+}
+
+}  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/platform/android_bridge_in_multi_process.h b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_process.h
new file mode 100644
index 0000000000..8df6ed98d7
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_process.h
@@ -0,0 +1,81 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WEEX_PROJECT_IPC_BRIDGE_IMPL_H
+#define WEEX_PROJECT_IPC_BRIDGE_IMPL_H
+
+#include "IPC/IPCHandler.h"
+#include "android/jsengine/multiprocess/WeexJSConnection.h"
+#include "core/bridge/platform_bridge.h"
+
+class IPCArguments;
+class IPCResult;
+class IPCSender;
+
+namespace WeexCore {
+
+// For multi-process and multi so
+class AndroidBridgeInMultiProcess : public PlatformBridge {
+ public:
+  AndroidBridgeInMultiProcess();
+  virtual ~AndroidBridgeInMultiProcess();
+
+  void RegisterIPCCallback(IPCHandler *handler);
+
+#define IPC_METHOD(method_name) \
+  static std::unique_ptr<IPCResult> method_name(IPCArguments *arguments);
+
+  IPC_METHOD(InvokeMeasureFunction)
+  IPC_METHOD(InvokeLayoutBefore)
+  IPC_METHOD(InvokeLayoutAfter)
+  IPC_METHOD(SetJSVersion)
+  IPC_METHOD(ReportException)
+  IPC_METHOD(CallNative)
+  IPC_METHOD(CallNativeModule)
+  IPC_METHOD(CallNativeComponent)
+  IPC_METHOD(SetTimeout)
+  IPC_METHOD(NativeLog)
+  IPC_METHOD(UpdateFinish)
+  IPC_METHOD(RefreshFinish)
+  IPC_METHOD(AddEvent)
+  IPC_METHOD(RemoveEvent)
+  IPC_METHOD(CreateBody)
+  IPC_METHOD(AddElement)
+  IPC_METHOD(Layout)
+  IPC_METHOD(UpdateStyle)
+  IPC_METHOD(UpdateAttr)
+  IPC_METHOD(CreateFinish)
+  IPC_METHOD(RenderSuccess)
+  IPC_METHOD(RemoveElement)
+  IPC_METHOD(MoveElement)
+
+  IPC_METHOD(AppendTreeCreateFinish)
+  IPC_METHOD(HasTransitionPros)
+  IPC_METHOD(PostMessage)
+  IPC_METHOD(DispatchMessage)
+
+ private:
+  std::unique_ptr<WeexJSConnection> connection_;
+  std::unique_ptr<IPCHandler> handler_;
+  std::unique_ptr<IPCHandler> server_handler_;
+  DISALLOW_COPY_AND_ASSIGN(AndroidBridgeInMultiProcess);
+};
+}  // namespace WeexCore
+
+#endif  // WEEX_PROJECT_IPC_BRIDGE_IMPL_H
diff --git a/weex_core/Source/android/bridge/platform/android_bridge_in_multi_so.cc b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_so.cc
new file mode 100644
index 0000000000..31fc4412e3
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_so.cc
@@ -0,0 +1,364 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "android_bridge_in_multi_so.h"
+#include <dlfcn.h>
+#include "android/bridge/platform/android_side.h"
+#include "core/layout/layout.h"
+#include "core/manager/weex_core_manager.h"
+#include "core_side_in_multi_so.h"
+#include "include/WeexApiHeader.h"
+#include "android/bridge/multi_so_initializer.h"
+
+namespace WeexCore {
+AndroidBridgeInMultiSo::AndroidBridgeInMultiSo() {
+  set_platform_side(new AndroidSide);
+  set_core_side(new CoreSideInMultiSo);
+
+  std::unique_ptr<MultiSoInitializer> initializer(new MultiSoInitializer);
+  bool passable = initializer->Init(
+      [this](void *handle) {
+        LOGE("dlopen so and call function");
+
+        typedef CoreSideFunctionsOfPlatformBridge *(
+            *ExchangePlatformBridgeFunctions)(PlatformExposeFunctions *);
+        auto exchange_platform_bridge_functions =
+            (ExchangePlatformBridgeFunctions)dlsym(
+                handle, "ExchangePlatformBridgeFunctions");
+        if (!exchange_platform_bridge_functions) {
+          return false;
+        }
+
+        PlatformExposeFunctions *platform_expose_functions =
+            GetExposedFunctions();
+        auto core_side_functions =
+            exchange_platform_bridge_functions(platform_expose_functions);
+
+        static_cast<CoreSideInMultiSo *>(core_side())
+            ->set_core_side_functions(core_side_functions);
+        return true;
+      },
+      [this](const char *status_code, const char *error_msg) {
+        platform_side()->ReportNativeInitStatus(status_code, error_msg);
+      });
+  set_is_passable(passable);
+}
+
+AndroidBridgeInMultiSo::~AndroidBridgeInMultiSo() {}
+
+PlatformExposeFunctions *AndroidBridgeInMultiSo::GetExposedFunctions() {
+  PlatformExposeFunctions temp = {SetJSVersion,
+                                  ReportException,
+                                  ReportServerCrash,
+                                  ReportNativeInitStatus,
+                                  CallNative,
+                                  CallNativeModule,
+                                  CallNativeComponent,
+                                  CallAddElement,
+                                  SetTimeout,
+                                  CallNativeLog,
+                                  CallCreateBody,
+                                  CallUpdateFinish,
+                                  CallCreateFinish,
+                                  CallRenderSuccess,
+                                  CallRefreshFinish,
+                                  CallUpdateAttr,
+                                  CallUpdateStyle,
+                                  CallRemoveElement,
+                                  CallMoveElement,
+                                  CallAddEvent,
+                                  CallRemoveEvent,
+                                  PostMessage,
+                                  DispatchMessage,
+                                  CallLayout,
+                                  CallAppendTreeCreateFinish,
+                                  CallHasTransitionPros,
+                                  CallInvokeMeasureFunction,
+                                  CallInvokeLayoutBefore,
+                                  CallInvokeLayoutAfter};
+  auto functions =
+      (PlatformExposeFunctions *)malloc(sizeof(PlatformExposeFunctions));
+  memset(functions, 0, sizeof(PlatformExposeFunctions));
+  memcpy(functions, &temp, sizeof(PlatformExposeFunctions));
+  return functions;
+}
+
+void AndroidBridgeInMultiSo::SetJSVersion(const char *version) {
+  //  LOGE("Android Bridge: SetJSVersion");
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->SetJSVersion(version);
+}
+
+void AndroidBridgeInMultiSo::ReportException(const char *pageId,
+                                             const char *func,
+                                             const char *exception_string) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->ReportException(pageId, func, exception_string);
+}
+
+void AndroidBridgeInMultiSo::ReportServerCrash(const char *instance_id) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->ReportServerCrash(instance_id);
+}
+
+void AndroidBridgeInMultiSo::ReportNativeInitStatus(const char *status_code,
+                                                    const char *error_msg) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->ReportNativeInitStatus(status_code, error_msg);
+}
+
+int AndroidBridgeInMultiSo::CallNative(const char *pageId, const char *task,
+                                       const char *callback) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->CallNative(pageId, task, callback);
+}
+
+std::unique_ptr<ValueWithType> AndroidBridgeInMultiSo::CallNativeModule(
+    const char *pageId, const char *module, const char *method,
+    const char *arguments, int argumentsLength, const char *options,
+    int optionsLength) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->CallNativeModule(pageId, module, method, arguments, argumentsLength,
+                         options, optionsLength);
+}
+
+void AndroidBridgeInMultiSo::CallNativeComponent(
+    const char *pageId, const char *ref, const char *method,
+    const char *arguments, int argumentsLength, const char *options,
+    int optionsLength) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->CallNativeComponent(pageId, ref, method, arguments, argumentsLength,
+                            options, optionsLength);
+}
+
+void AndroidBridgeInMultiSo::SetTimeout(const char *callbackID,
+                                        const char *time) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->SetTimeout(callbackID, time);
+}
+
+void AndroidBridgeInMultiSo::CallNativeLog(const char *str_array) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->NativeLog(str_array);
+}
+
+int AndroidBridgeInMultiSo::CallUpdateFinish(const char *pageId,
+                                             const char *task, int taskLen,
+                                             const char *callback,
+                                             int callbackLen) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->UpdateFinish(pageId, task, taskLen, callback, callbackLen);
+}
+
+int AndroidBridgeInMultiSo::CallRefreshFinish(const char *pageId,
+                                              const char *task,
+                                              const char *callback) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->RefreshFinish(pageId, task, callback);
+}
+
+int AndroidBridgeInMultiSo::CallAddEvent(const char *pageId, const char *ref,
+                                         const char *event) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->AddEvent(pageId, ref, event);
+}
+
+int AndroidBridgeInMultiSo::CallRemoveEvent(const char *pageId, const char *ref,
+                                            const char *event) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->RemoveEvent(pageId, ref, event);
+}
+
+int AndroidBridgeInMultiSo::CallCreateBody(
+    const char *pageId, const char *componentType, const char *ref,
+    std::map<std::string, std::string> *styles,
+    std::map<std::string, std::string> *attributes,
+    std::set<std::string> *events, const WXCoreMargin &margins,
+    const WXCorePadding &paddings, const WXCoreBorderWidth &borders) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->CreateBody(pageId, componentType, ref, styles, attributes, events,
+                   margins, paddings, borders);
+}
+
+int AndroidBridgeInMultiSo::CallAddElement(
+    const char *pageId, const char *componentType, const char *ref, int &index,
+    const char *parentRef, std::map<std::string, std::string> *styles,
+    std::map<std::string, std::string> *attributes,
+    std::set<std::string> *events, const WXCoreMargin &margins,
+    const WXCorePadding &paddings, const WXCoreBorderWidth &borders,
+    bool willLayout) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->AddElement(pageId, componentType, ref, index, parentRef, styles,
+                   attributes, events, margins, paddings, borders, willLayout);
+}
+
+int AndroidBridgeInMultiSo::CallLayout(const char *pageId, const char *ref,
+                                       int top, int bottom, int left, int right,
+                                       int height, int width, int index) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->Layout(pageId, ref, top, bottom, left, right, height, width, index);
+}
+
+int AndroidBridgeInMultiSo::CallUpdateStyle(
+    const char *pageId, const char *ref,
+    std::vector<std::pair<std::string, std::string>> *style,
+    std::vector<std::pair<std::string, std::string>> *margin,
+    std::vector<std::pair<std::string, std::string>> *padding,
+    std::vector<std::pair<std::string, std::string>> *border) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->UpdateStyle(pageId, ref, style, margin, padding, border);
+}
+
+int AndroidBridgeInMultiSo::CallUpdateAttr(
+    const char *pageId, const char *ref,
+    std::vector<std::pair<std::string, std::string>> *attrs) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->UpdateAttr(pageId, ref, attrs);
+}
+
+int AndroidBridgeInMultiSo::CallCreateFinish(const char *pageId) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->CreateFinish(pageId);
+}
+
+int AndroidBridgeInMultiSo::CallRenderSuccess(const char *pageId) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->RenderSuccess(pageId);
+}
+
+int AndroidBridgeInMultiSo::CallRemoveElement(const char *pageId,
+                                              const char *ref) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->RemoveElement(pageId, ref);
+}
+
+int AndroidBridgeInMultiSo::CallMoveElement(const char *pageId, const char *ref,
+                                            const char *parentRef, int index) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->MoveElement(pageId, ref, parentRef, index);
+}
+
+void AndroidBridgeInMultiSo::PostMessage(const char *vm_id, const char *data,
+                                         int dataLength) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->PostMessage(vm_id, data, dataLength);
+}
+
+void AndroidBridgeInMultiSo::DispatchMessage(const char *client_id,
+                                             const char *data,
+                                             int dataLength,
+                                             const char *callback,
+                                             const char *vm_id) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->DispatchMessage(client_id, data, dataLength, callback, vm_id);
+}
+
+int AndroidBridgeInMultiSo::CallAppendTreeCreateFinish(const char *pageId,
+                                                       const char *ref) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->AppendTreeCreateFinish(pageId, ref);
+}
+
+int AndroidBridgeInMultiSo::CallHasTransitionPros(
+    const char *pageId, const char *ref,
+    std::vector<std::pair<std::string, std::string>> *style) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->HasTransitionPros(pageId, ref, style);
+}
+
+WXCoreSize AndroidBridgeInMultiSo::CallInvokeMeasureFunction(
+    const char *page_id, long render_ptr, float width, int width_measure_mode,
+    float height, int height_measure_mode) {
+  return WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->InvokeMeasureFunction(page_id, render_ptr, width, width_measure_mode,
+                              height, height_measure_mode);
+}
+
+void AndroidBridgeInMultiSo::CallInvokeLayoutBefore(const char *page_id,
+                                                    long render_ptr) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->InvokeLayoutBefore(page_id, render_ptr);
+}
+
+void AndroidBridgeInMultiSo::CallInvokeLayoutAfter(const char *page_id,
+                                                   long render_ptr, float width,
+                                                   float height) {
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->platform_side()
+      ->InvokeLayoutAfter(page_id, render_ptr, width, height);
+}
+
+}  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/platform/android_bridge_in_multi_so.h b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_so.h
new file mode 100644
index 0000000000..2791be6d32
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_bridge_in_multi_so.h
@@ -0,0 +1,141 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef WEEX_PROJECT_MULTI_SO_BRIDGE_H
+#define WEEX_PROJECT_MULTI_SO_BRIDGE_H
+
+#include "core/bridge/platform_bridge.h"
+#include "include/WeexApiHeader.h"
+
+namespace WeexCore {
+// For situation in single process and multi so
+class AndroidBridgeInMultiSo : public PlatformBridge {
+ public:
+  AndroidBridgeInMultiSo();
+  ~AndroidBridgeInMultiSo();
+
+  PlatformExposeFunctions* GetExposedFunctions();
+
+  static void SetJSVersion(const char* version);
+
+  static void ReportException(const char* pageId, const char* func,
+                              const char* exception_string);
+
+  static void ReportServerCrash(const char* instance_id);
+
+  static void ReportNativeInitStatus(const char* status_code,
+                                     const char* error_msg);
+
+  static int CallNative(const char* pageId, const char* task,
+                        const char* callback);
+
+  static std::unique_ptr<ValueWithType> CallNativeModule(
+      const char* pageId, const char* module, const char* method,
+      const char* arguments, int argumentsLength, const char* options,
+      int optionsLength);
+
+  static void CallNativeComponent(const char* pageId, const char* ref,
+                                  const char* method, const char* arguments,
+                                  int argumentsLength, const char* options,
+                                  int optionsLength);
+
+  static void SetTimeout(const char* callbackID, const char* time);
+
+  static void CallNativeLog(const char* str_array);
+
+  static int CallUpdateFinish(const char* pageId, const char* task, int taskLen,
+                              const char* callback, int callbackLen);
+
+  static int CallRefreshFinish(const char* pageId, const char* task,
+                               const char* callback);
+
+  static int CallAddEvent(const char* pageId, const char* ref,
+                          const char* event);
+
+  static int CallRemoveEvent(const char* pageId, const char* ref,
+                             const char* event);
+
+  static int CallCreateBody(const char* pageId, const char* componentType,
+                            const char* ref,
+                            std::map<std::string, std::string>* styles,
+                            std::map<std::string, std::string>* attributes,
+                            std::set<std::string>* events,
+                            const WXCoreMargin& margins,
+                            const WXCorePadding& paddings,
+                            const WXCoreBorderWidth& borders);
+
+  static int CallAddElement(const char* pageId, const char* componentType,
+                            const char* ref, int& index, const char* parentRef,
+                            std::map<std::string, std::string>* styles,
+                            std::map<std::string, std::string>* attributes,
+                            std::set<std::string>* events,
+                            const WXCoreMargin& margins,
+                            const WXCorePadding& paddings,
+                            const WXCoreBorderWidth& borders,
+                            bool willLayout = true);
+
+  static int CallLayout(const char* pageId, const char* ref, int top,
+                        int bottom, int left, int right, int height, int width,
+                        int index);
+
+  static int CallUpdateStyle(
+      const char* pageId, const char* ref,
+      std::vector<std::pair<std::string, std::string>>* style,
+      std::vector<std::pair<std::string, std::string>>* margin,
+      std::vector<std::pair<std::string, std::string>>* padding,
+      std::vector<std::pair<std::string, std::string>>* border);
+
+  static int CallUpdateAttr(
+      const char* pageId, const char* ref,
+      std::vector<std::pair<std::string, std::string>>* attrs);
+
+  static int CallCreateFinish(const char* pageId);
+
+  static int CallRenderSuccess(const char* pageId);
+
+  static int CallRemoveElement(const char* pageId, const char* ref);
+
+  static int CallMoveElement(const char* pageId, const char* ref,
+                             const char* parentRef, int index);
+
+  static void PostMessage(const char* vm_id, const char* data, int dataLength);
+
+  static void DispatchMessage(const char* client_id,
+                              const char* data, int dataLength, const char* callback, const char* vm_id);
+
+  static int CallAppendTreeCreateFinish(const char* pageId, const char* ref);
+
+  static int CallHasTransitionPros(
+      const char* pageId, const char* ref,
+      std::vector<std::pair<std::string, std::string>>* style);
+  static WXCoreSize CallInvokeMeasureFunction(const char* page_id,
+                                              long render_ptr, float width,
+                                              int width_measure_mode,
+                                              float height,
+                                              int height_measure_mode);
+  static void CallInvokeLayoutBefore(const char* page_id, long render_ptr);
+  static void CallInvokeLayoutAfter(const char* page_id, long render_ptr,
+                                    float width, float height);
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AndroidBridgeInMultiSo);
+};
+}  // namespace WeexCore
+
+#endif  // WEEX_PROJECT_MULTI_SO_BRIDGE_H
diff --git a/weex_core/Source/android/bridge/platform/android_side.cpp b/weex_core/Source/android/bridge/platform/android_side.cpp
new file mode 100644
index 0000000000..f7c198a802
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_side.cpp
@@ -0,0 +1,370 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "android/bridge/platform/android_side.h"
+#include "IPC/IPCResult.h"
+#include "android/base/jni/android_jni.h"
+#include "android/base/jni_type.h"
+#include "android/base/string/string_utils.h"
+#include "android/utils/IPCStringResult.h"
+#include "android/utils/cache_utils.h"
+#include "android/utils/params_utils.h"
+#include "android/wrap/hash_set.h"
+#include "android/wrap/log_utils.h"
+#include "android/wrap/wml_bridge.h"
+#include "android/wrap/wx_js_object.h"
+#include "android/wrap/wx_map.h"
+#include "base/LogDefines.h"
+#include "core/layout/layout.h"
+#include "core/layout/measure_func_adapter.h"
+#include "core/manager/weex_core_manager.h"
+
+namespace WeexCore {
+
+AndroidSide::AndroidSide()
+    : wml_bridge_(WMLBridge::Instance()), wx_bridge_(WXBridge::Instance()) {}
+
+AndroidSide::~AndroidSide() {}
+
+WXCoreSize AndroidSide::InvokeMeasureFunction(const char *page_id,
+                                              long render_ptr, float width,
+                                              int width_measure_mode,
+                                              float height,
+                                              int height_measure_mode) {
+  return WeexCoreManager::Instance()->measure_function_adapter()->Measure(
+      page_id, render_ptr, width, static_cast<MeasureMode>(width_measure_mode),
+      height, static_cast<MeasureMode>(height_measure_mode));
+}
+void AndroidSide::InvokeLayoutBefore(const char *page_id, long render_ptr) {
+  WeexCoreManager::Instance()->measure_function_adapter()->LayoutBefore(
+      page_id, render_ptr);
+}
+
+void AndroidSide::InvokeLayoutPlatform(const char* page_id, long render_ptr) {
+  // do nothing
+}
+
+void AndroidSide::TriggerVSync(const char* page_id) {
+  // do nothing
+}
+
+void AndroidSide::InvokeLayoutAfter(const char *page_id, long render_ptr,
+                                    float width, float height) {
+  WeexCoreManager::Instance()->measure_function_adapter()->LayoutAfter(
+      page_id, render_ptr, width, height);
+}
+
+void AndroidSide::SetJSVersion(const char *version) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wx_bridge_->SetJSFrmVersion(env, version);
+}
+
+void AndroidSide::ReportException(const char *page_id, const char *func,
+                                  const char *exception_string) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wx_bridge_->ReportException(env, page_id, func, exception_string);
+}
+
+void AndroidSide::ReportServerCrash(const char *instance_id) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+
+  std::string crash_file;
+  crash_file.assign("/crash_dump.log");
+  wx_bridge_->ReportServerCrash(env, instance_id, crash_file.c_str());
+}
+
+void AndroidSide::ReportNativeInitStatus(const char *status_code,
+                                         const char *error_msg) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wx_bridge_->ReportNativeInitStatus(env, status_code, error_msg);
+}
+
+int AndroidSide::CallNative(const char *page_id, const char *task,
+                            const char *callback) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->CallNative(env, page_id, task, callback);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callNative");
+  }
+  return flag;
+}
+
+std::unique_ptr<ValueWithType> AndroidSide::CallNativeModule(
+    const char *page_id, const char *module, const char *method,
+    const char *arguments, int arguments_length, const char *options,
+    int options_length) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  auto result =
+      wx_bridge_->CallNativeModule(env, page_id, module, method, arguments,
+                                   arguments_length, options, options_length);
+
+  std::unique_ptr<ValueWithType> ipc_result(new ValueWithType());
+  ipc_result->type = ParamsType::INT32;
+  ipc_result->value.int32Value = -1;
+  if (result.IsNull()) {
+    return ipc_result;
+  }
+
+  auto wx_js_object_result =
+      std::unique_ptr<WXJSObject>(new WXJSObject(env, result.Get()));
+  jint jTypeInt = wx_js_object_result->GetType(env);
+  auto jDataObj = wx_js_object_result->GetData(env);
+
+  if (jTypeInt == 1) {
+    ipc_result->type = ParamsType::DOUBLE;
+    ipc_result->value.doubleValue =
+        base::android::JNIType::DoubleValue(env, jDataObj.Get());
+  } else if (jTypeInt == 2) {
+    jstring jDataStr = (jstring)jDataObj.Get();
+    ipc_result->type = ParamsType::STRING;
+    ipc_result->value.string = jstring2WeexString(env, jDataStr);
+  } else if (jTypeInt == 3) {
+    jstring jDataStr = (jstring)jDataObj.Get();
+    ipc_result->type = ParamsType::JSONSTRING;
+    ipc_result->value.string = jstring2WeexString(env, jDataStr);
+  } else if (jTypeInt == 4) {
+    jbyteArray array = (jbyteArray)jDataObj.Get();
+    if (array != nullptr) {
+      int length = env->GetArrayLength(array);
+      void *data = env->GetByteArrayElements(array, 0);
+      ipc_result->type = ParamsType::BYTEARRAY;
+      ipc_result->value.byteArray =
+          genWeexByteArray((const char *)data, length);
+      env->ReleaseByteArrayElements(array, (jbyte *)data, 0);
+    }
+  }
+
+  return ipc_result;
+}
+
+void AndroidSide::CallNativeComponent(const char *page_id, const char *ref,
+                                      const char *method, const char *arguments,
+                                      int arguments_length, const char *options,
+                                      int options_length) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wx_bridge_->CallNativeComponent(env, page_id, ref, method, arguments,
+                                  arguments_length, options, options_length);
+}
+
+void AndroidSide::SetTimeout(const char *callback_id, const char *time) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wx_bridge_->SetTimeout(env, callback_id, time);
+}
+
+void AndroidSide::NativeLog(const char *str_array) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  LogUtils::NativeLog(env, str_array);
+}
+
+int AndroidSide::UpdateFinish(const char *page_id, const char *task,
+                              int taskLen, const char *callback,
+                              int callbackLen) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->UpdateFinish(env, page_id, task, callback);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callUpdateFinish");
+  }
+  return flag;
+}
+
+int AndroidSide::RefreshFinish(const char *page_id, const char *task,
+                               const char *callback) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->RefreshFinish(env, page_id, task, callback);
+
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callNative");
+  }
+  return flag;
+}
+
+int AndroidSide::AddEvent(const char *page_id, const char *ref,
+                          const char *event) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->AddEvent(env, page_id, ref, event);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callAddEvent");
+  }
+  return flag;
+}
+
+int AndroidSide::RemoveEvent(const char *page_id, const char *ref,
+                             const char *event) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->RemoveEvent(env, page_id, ref, event);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callRemoveElement");
+  }
+  return flag;
+}
+
+int AndroidSide::CreateBody(const char *page_id, const char *component_type,
+                            const char *ref,
+                            std::map<std::string, std::string> *styles,
+                            std::map<std::string, std::string> *attributes,
+                            std::set<std::string> *events,
+                            const WXCoreMargin &margins,
+                            const WXCorePadding &paddings,
+                            const WXCoreBorderWidth &borders) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag =
+      wx_bridge_->CreateBody(env, page_id, component_type, ref, styles,
+                             attributes, events, margins, paddings, borders);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callCreateBody");
+  }
+  return flag;
+}
+
+int AndroidSide::AddElement(const char *page_id, const char *component_type,
+                            const char *ref, int &index, const char *parentRef,
+                            std::map<std::string, std::string> *styles,
+                            std::map<std::string, std::string> *attributes,
+                            std::set<std::string> *events,
+                            const WXCoreMargin &margins,
+                            const WXCorePadding &paddings,
+                            const WXCoreBorderWidth &borders, bool willLayout) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->AddElement(env, page_id, component_type, ref, index,
+                                    parentRef, styles, attributes, events,
+                                    margins, paddings, borders, willLayout);
+
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callAddElement");
+  }
+  return flag;
+}
+
+int AndroidSide::Layout(const char *page_id, const char *ref, float top,
+                        float bottom, float left, float right, float height,
+                        float width, int index) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = 0;
+  wx_bridge_->Layout(env, page_id, ref, top, bottom, left, right, height, width,
+                     index);
+
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callLayout");
+  }
+  return flag;
+}
+
+int AndroidSide::UpdateStyle(
+    const char *page_id, const char *ref,
+    std::vector<std::pair<std::string, std::string>> *style,
+    std::vector<std::pair<std::string, std::string>> *margin,
+    std::vector<std::pair<std::string, std::string>> *padding,
+    std::vector<std::pair<std::string, std::string>> *border) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->UpdateStyle(env, page_id, ref, style, margin, padding,
+                                     border);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callUpdateStyle");
+  }
+  return flag;
+}
+
+int AndroidSide::UpdateAttr(
+    const char *page_id, const char *ref,
+    std::vector<std::pair<std::string, std::string>> *attrs) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = 0;
+  flag = wx_bridge_->UpdateAttr(env, page_id, ref, attrs);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callUpdateStyle");
+  }
+  return flag;
+}
+
+int AndroidSide::CreateFinish(const char *page_id) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->CreateFinish(env, page_id);
+
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callCreateFinish");
+  }
+  return flag;
+}
+
+int AndroidSide::RenderSuccess(const char *page_id) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->RenderSuccess(env, page_id);
+
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callRenderFinish");
+  }
+  return flag;
+}
+
+int AndroidSide::RemoveElement(const char *page_id, const char *ref) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->RemoveElement(env, page_id, ref);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callRemoveElement");
+  }
+  return flag;
+}
+
+int AndroidSide::MoveElement(const char *page_id, const char *ref,
+                             const char *parent_ref, int index) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->MoveElement(env, page_id, ref, parent_ref, index);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callRemoveElement");
+  }
+  return flag;
+}
+
+int AndroidSide::AppendTreeCreateFinish(const char *page_id, const char *ref) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  int flag = wx_bridge_->AppendTreeCreateFinish(env, page_id, ref);
+  if (flag == -1) {
+    LOGE("instance destroy JFM must stop callAppendTreeCreateFinish");
+  }
+  return flag;
+}
+
+int AndroidSide::HasTransitionPros(
+    const char *page_id, const char *ref,
+    std::vector<std::pair<std::string, std::string>> *style) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  if (style == nullptr) {
+    return wx_bridge_->HasTransitionPros(env, page_id, ref, *style);
+  } else {
+    return wx_bridge_->HasTransitionPros(
+        env, page_id, ref, std::vector<std::pair<std::string, std::string>>());
+  }
+}
+
+void AndroidSide::PostMessage(const char *vm_id, const char *data, int dataLength) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wml_bridge_->PostMessage(env, vm_id, data, dataLength);
+}
+
+void AndroidSide::DispatchMessage(const char *client_id,
+                                  const char *data, int dataLength, const char *callback, const char *vm_id) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  wml_bridge_->DispatchMessage(env, client_id,  data, dataLength, callback, vm_id);
+}
+
+jobject AndroidSide::getMeasureFunc(const char *pageId, jlong renderObjectPtr) {
+  JNIEnv *env = base::android::AttachCurrentThread();
+  return wx_bridge_->GetMeasureFunc(env, pageId, renderObjectPtr).Release();
+}
+}  // namespace WeexCore
\ No newline at end of file
diff --git a/weex_core/Source/android/bridge/platform/android_side.h b/weex_core/Source/android/bridge/platform/android_side.h
new file mode 100644
index 0000000000..3f1117226c
--- /dev/null
+++ b/weex_core/Source/android/bridge/platform/android_side.h
@@ -0,0 +1,122 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one

  (This diff was longer than 20,000 lines, and has been truncated...)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services