This is an automated email from the ASF dual-hosted git repository.

zshshr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-weex.git


The following commit(s) were added to refs/heads/master by this push:
     new 4240988  Fork/master 2019 01 30 (#2098)
4240988 is described below

commit 4240988868d99db44b81a04db1461e142eae0916
Author: darin <[email protected]>
AuthorDate: Wed Jan 30 17:26:12 2019 +0800

    Fork/master 2019 01 30 (#2098)
    
    Add a backup jsEngine thread to exec js action
---
 android/sdk/libs/armeabi-v7a/libJavaScriptCore.so  | Bin 5237308 -> 5237308 
bytes
 android/sdk/libs/armeabi-v7a/libweexcore.so        | Bin 0 -> 2152328 bytes
 android/sdk/libs/armeabi-v7a/libweexjss.so         | Bin 550504 -> 554600 bytes
 android/sdk/libs/armeabi/libJavaScriptCore.so      | Bin 5237308 -> 5237308 
bytes
 android/sdk/libs/armeabi/libweexcore.so            | Bin 2156424 -> 2156424 
bytes
 android/sdk/libs/armeabi/libweexjss.so             | Bin 550504 -> 554600 bytes
 android/sdk/libs/x86/libweexcore.so                | Bin 0 -> 3344296 bytes
 android/sdk/libs/x86/libweexjss.so                 | Bin 972408 -> 988792 bytes
 .../main/java/com/taobao/weex/WXEnvironment.java   |   3 +
 .../taobao/weex/adapter/IWXJscProcessManager.java  |   1 +
 .../com/taobao/weex/bridge/WXBridgeManager.java    |   3 +-
 .../com/taobao/weex/ui/SimpleComponentHolder.java  |  13 +
 ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m   |  15 +-
 .../bridge/script_bridge_in_multi_process.cpp      |   8 +-
 weex_core/Source/android/jsengine/CMakeLists.txt   |   1 +
 .../bridge/script/core_side_in_multi_process.cpp   | 650 +++++++++------------
 .../jsengine/bridge/script/core_side_in_simple.cpp |   3 +-
 .../script/script_bridge_in_multi_process.cpp      |  11 +
 .../bridge/script/script_bridge_in_simple.cpp      |   2 +-
 .../bridge/script/script_side_in_queue.cpp         | 421 +++++++------
 .../jsengine/bridge/script/script_side_in_queue.h  |  40 +-
 .../Source/android/jsengine/object/weex_env.cpp    |  13 +-
 .../Source/android/jsengine/object/weex_env.h      |  24 +-
 .../android/jsengine/object/weex_global_object.cpp |  28 +-
 .../android/jsengine/object/weex_global_object.h   |   5 +
 .../android/jsengine/object/weex_object_holder.cpp |  39 +-
 .../android/jsengine/object/weex_object_holder.h   |   8 +-
 .../jsengine/task/back_to_weex_core_queue.cpp      | 154 +++++
 .../jsengine/task/back_to_weex_core_queue.h        | 118 ++++
 .../android/jsengine/task/impl/exe_js_task.cpp     |   8 +
 .../android/jsengine/task/impl/exe_js_task.h       |   1 +
 .../jsengine/task/impl/init_framework_task.cpp     |   3 +
 .../jsengine/task/impl/init_framework_task.h       |   1 +
 .../android/jsengine/task/impl/native_timer_task.h |   4 +-
 .../Source/android/jsengine/task/timer_queue.cpp   |   1 +
 .../Source/android/jsengine/task/timer_queue.h     |   3 +-
 weex_core/Source/android/jsengine/task/weex_task.h |   5 +-
 .../android/jsengine/task/weex_task_queue.cpp      |  16 +-
 .../Source/android/jsengine/weex_ipc_server.cpp    |  10 +
 weex_core/Source/android/jsengine/weex_runtime.cpp | 151 +++--
 weex_core/Source/android/jsengine/weex_runtime.h   |   7 +-
 weex_core/Source/base/CMakeLists.txt               |   1 +
 weex_core/Source/base/android/log_utils.h          |   4 +-
 weex_core/Source/base/log_defines.h                |   4 +-
 weex_core/Source/base/time_calculator.h            | 143 +++++
 weex_core/Source/base/utils/log_utils.h            |   4 +-
 .../core/bridge/script/core_side_in_script.cpp     |  12 +-
 47 files changed, 1258 insertions(+), 680 deletions(-)

diff --git a/android/sdk/libs/armeabi-v7a/libJavaScriptCore.so 
b/android/sdk/libs/armeabi-v7a/libJavaScriptCore.so
index 03deedb..2d59099 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
new file mode 100644
index 0000000..b45945c
Binary files /dev/null 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 9ca7221..8c66b72 100644
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 03deedb..2d59099 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 0f7743d..e0e0c90 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 0eca098..b5f25f4 100644
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
new file mode 100644
index 0000000..de34837
Binary files /dev/null and b/android/sdk/libs/x86/libweexcore.so differ
diff --git a/android/sdk/libs/x86/libweexjss.so 
b/android/sdk/libs/x86/libweexjss.so
index f960b90..6f3e7f6 100644
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 eb90d3a..b27d742 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -28,6 +28,7 @@ import android.os.Environment;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import com.taobao.weex.BuildConfig;
+import com.taobao.weex.adapter.IWXJscProcessManager;
 import com.taobao.weex.common.WXConfig;
 import com.taobao.weex.utils.FontDO;
 import com.taobao.weex.utils.LogLevel;
@@ -167,6 +168,8 @@ public class WXEnvironment {
         addCustomOptions(WXConfig.debugMode, "true");
       }
       addCustomOptions(WXConfig.scale, 
Float.toString(sApplication.getResources().getDisplayMetrics().density));
+      IWXJscProcessManager wxJscProcessManager = 
WXSDKManager.getInstance().getWXJscProcessManager();
+      addCustomOptions("enableBackupThread", 
String.valueOf(wxJscProcessManager != null && 
wxJscProcessManager.enableBackupThread()));
     }catch (NullPointerException e){
       //There is little chance of NullPointerException as sApplication may be 
null.
       WXLogUtils.e("WXEnvironment scale Exception: ", e);
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java 
b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java
index 59524f1..db15534 100644
--- 
a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java
+++ 
b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXJscProcessManager.java
@@ -21,6 +21,7 @@ package com.taobao.weex.adapter;
 import com.taobao.weex.WXSDKInstance;
 
 public interface IWXJscProcessManager {
+    boolean enableBackupThread();
     boolean shouldReboot();
     long rebootTimeout();
     boolean withException(WXSDKInstance instance);
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 792c0e7..2729a1e 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
@@ -901,7 +901,8 @@ public class WXBridgeManager implements Callback, 
BactchExecutor {
             } else {
               WXLogUtils.e("[WXBridgeManager] callReportCrash crash file is 
empty");
             }
-            file.delete();
+            if(!WXEnvironment.isApkDebugable())
+              file.delete();
           }
         } catch (Throwable throwable) {
           WXLogUtils.e("[WXBridgeManager] callReportCrash exception: ", 
throwable);
diff --git 
a/android/sdk/src/main/java/com/taobao/weex/ui/SimpleComponentHolder.java 
b/android/sdk/src/main/java/com/taobao/weex/ui/SimpleComponentHolder.java
index 3d4be30..afd992a 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/SimpleComponentHolder.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/SimpleComponentHolder.java
@@ -26,11 +26,13 @@ import com.taobao.weex.annotation.JSMethod;
 import com.taobao.weex.bridge.Invoker;
 import com.taobao.weex.bridge.MethodInvoker;
 import com.taobao.weex.annotation.Component;
+import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.common.WXRuntimeException;
 import com.taobao.weex.ui.action.BasicComponentData;
 import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.component.WXComponentProp;
 import com.taobao.weex.ui.component.WXVContainer;
+import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXLogUtils;
 
 import java.lang.annotation.Annotation;
@@ -41,6 +43,8 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
+import static 
com.taobao.weex.bridge.WXBridgeManager.METHOD_REGISTER_COMPONENTS;
+
 /**
  * Created by sospartan on 6/12/16.
  */
@@ -214,6 +218,15 @@ public class SimpleComponentHolder implements 
IFComponentHolder{
     try {
       return keys.toArray(new String[keys.size()]);
     } catch (Throwable throwable) {
+      if(mClz != null) {
+        String name = mClz.getName();
+        String errorMsg = name + ": gen methods failed";
+        WXExceptionUtils.commitCriticalExceptionRT(null,
+                WXErrorCode.WX_KEY_EXCEPTION_INVOKE_REGISTER_COMPONENT,
+                METHOD_REGISTER_COMPONENTS, errorMsg,
+                null);
+      }
+
       return new String[1];
     }
 
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m 
b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
index 1470df7..e56e076 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXBridgeContext.m
@@ -668,13 +668,14 @@ _Pragma("clang diagnostic pop") \
 
 - (bool)_isParserByRegEx
 {
-    bool useRegEx = true;
-    id<WXConfigCenterProtocol> configCenter = [WXSDKEngine 
handlerForProtocol:@protocol(WXConfigCenterProtocol)];
-
-    if ([configCenter 
respondsToSelector:@selector(configForKey:defaultValue:isDefault:)]) {
-        useRegEx = [[configCenter 
configForKey:@"iOS_weex_ext_config.parserTypeByRegEx" defaultValue:@(YES) 
isDefault:NULL] boolValue];
-    }
-    return useRegEx;
+    return false;
+//    bool useRegEx = true;
+//    id<WXConfigCenterProtocol> configCenter = [WXSDKEngine 
handlerForProtocol:@protocol(WXConfigCenterProtocol)];
+//
+//    if ([configCenter 
respondsToSelector:@selector(configForKey:defaultValue:isDefault:)]) {
+//        useRegEx = [[configCenter 
configForKey:@"iOS_weex_ext_config.parserTypeByRegEx" defaultValue:@(YES) 
isDefault:NULL] boolValue];
+//    }
+//    return useRegEx;
 }
 
 - (void)destroyInstance:(NSString *)instance
diff --git a/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp 
b/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
index 6cef124..f23a0dd 100644
--- a/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
+++ b/weex_core/Source/android/bridge/script_bridge_in_multi_process.cpp
@@ -229,7 +229,8 @@ static std::unique_ptr<IPCResult> 
HandleCallGCanvasLinkNative(
     IPCArguments *arguments) {
 
   auto arg1 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
-  int type = arguments->get<int32_t>(1);
+  auto typeStr = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  int type = atoi(typeStr.get());
   auto arg3 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
   weex::base::WaitableEvent event;
   char *retVal = nullptr;
@@ -279,7 +280,8 @@ static std::unique_ptr<IPCResult> 
HandleCallGCanvasLinkNative(
 static std::unique_ptr<IPCResult> HandleT3DLinkNative(IPCArguments *arguments) 
{
 
 
-  int type = arguments->get<int32_t>(0);
+  auto typeStr = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  int type = atoi(typeStr.get());
   auto arg1 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
   weex::base::WaitableEvent event;
   char *retVal = nullptr;
@@ -932,7 +934,7 @@ std::unique_ptr<IPCResult> OnReceivedResult(IPCArguments 
*arguments) {
   long callback_id = arguments->get<long>(0);
   std::unique_ptr<WeexJSResult> result;
   result.reset(new WeexJSResult);
-  if (arguments->getType(1) == IPCType::BYTEARRAY &&
+  if (arguments->getCount() > 1 && arguments->getType(1) == IPCType::BYTEARRAY 
&&
       arguments->getByteArray(1)->length > 0) {
     result->length = arguments->getByteArray(1)->length;
     char *string = new char[result->length + 1];
diff --git a/weex_core/Source/android/jsengine/CMakeLists.txt 
b/weex_core/Source/android/jsengine/CMakeLists.txt
index b914ed2..8c2a37c 100644
--- a/weex_core/Source/android/jsengine/CMakeLists.txt
+++ b/weex_core/Source/android/jsengine/CMakeLists.txt
@@ -108,6 +108,7 @@ set(${WEEXJSSERVER_NAME}_SOURCES
         task/weex_task_queue.cpp
         task/timer_task.cpp
         task/timer_queue.cpp
+        task/back_to_weex_core_queue.cpp
 
         wson/wson_jsc.h
         wson/wson_jsc.cpp
diff --git 
a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.cpp
 
b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.cpp
index 040701d..4590ebb 100644
--- 
a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.cpp
+++ 
b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.cpp
@@ -47,41 +47,31 @@ namespace weex {
 
             void CoreSideInMultiProcess::CallNative(const char *page_id, const 
char *task,
                                                     const char *callback) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLNATIVE));
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // task args[1]
-                serializer->add(task, strlen(task));
-                // callback args[2]
-                serializer->add(callback, strlen(callback));
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLNATIVE);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(task);
+                ipc_task->addParams(callback);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             std::unique_ptr<ValueWithType> 
CoreSideInMultiProcess::CallNativeModule(
                     const char *page_id, const char *module, const char 
*method,
                     const char *arguments, int arguments_length, const char 
*options,
                     int options_length) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLNATIVEMODULE));
-
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // module args[1]
-                serializer->add(module, strlen(module));
-                // method args[2]
-                serializer->add(method, strlen(method));
-                // arguments args[3]
-                serializer->add(arguments, arguments_length);
-                // options args[4]
-                serializer->add(options, options_length);
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-
-                auto ipc_result = sender->send(buffer.get());
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLNATIVEMODULE);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(module);
+                ipc_task->addParams(method);
+                ipc_task->addParams(arguments, arguments_length);
+                ipc_task->addParams(options, options_length);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> ipc_result = 
future.get()->waitResult();
 
                 std::unique_ptr<ValueWithType> ret(new ValueWithType);
 
@@ -92,15 +82,18 @@ namespace weex {
                         break;
                     case IPCType::STRING:
                         ret->type = ParamsType::STRING;
-                        ret->value.string = 
genWeexStringSS(ipc_result->getStringContent(), ipc_result->getStringLength());
+                        ret->value.string = 
genWeexStringSS(ipc_result->getStringContent(),
+                                                            
ipc_result->getStringLength());
                         break;
                     case IPCType::JSONSTRING:
                         ret->type = ParamsType::JSONSTRING;
-                        ret->value.string = 
genWeexStringSS(ipc_result->getStringContent(), ipc_result->getStringLength());
+                        ret->value.string = 
genWeexStringSS(ipc_result->getStringContent(),
+                                                            
ipc_result->getStringLength());
                         break;
                     case IPCType::BYTEARRAY: {
                         ret->type = ParamsType::BYTEARRAY;
-                        ret->value.byteArray = 
genWeexByteArraySS(ipc_result->getByteArrayContent(), 
ipc_result->getByteArrayLength());
+                        ret->value.byteArray = 
genWeexByteArraySS(ipc_result->getByteArrayContent(),
+                                                                  
ipc_result->getByteArrayLength());
                     }
                         break;
                     default:
@@ -113,271 +106,207 @@ namespace weex {
                     const char *page_id, const char *ref, const char *method,
                     const char *arguments, int arguments_length, const char 
*options,
                     int options_length) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLNATIVECOMPONENT));
-
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // module args[1]
-                serializer->add(ref, strlen(ref));
-                // method args[2]
-                serializer->add(method, strlen(method));
-                // arguments args[3]
-                serializer->add(arguments, arguments_length);
-                // options args[4]
-                serializer->add(options, options_length);
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallNativeComponent: unexpected result: %d",
-                         result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLNATIVECOMPONENT);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                ipc_task->addParams(method);
+                ipc_task->addParams(arguments, arguments_length);
+                ipc_task->addParams(options, options_length);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+//                if (result->getType() != IPCType::INT32) {
+//                    LOGE("functionCallNativeComponent: unexpected result: 
%d",
+//                         result->getType());
+//                }
             }
 
             void CoreSideInMultiProcess::AddElement(const char *page_id,
                                                     const char *parent_ref,
                                                     const char *dom_str, int 
dom_str_length,
                                                     const char *index_str) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLADDELEMENT) |
-                                   MSG_FLAG_ASYNC);
-
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // instacneID args[1]
-                serializer->add(parent_ref, strlen(parent_ref));
-                // dom node args[2]
-                serializer->add(dom_str, dom_str_length);
-                // index  args[3]
-                serializer->add(index_str, strlen(index_str));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLADDELEMENT);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(parent_ref);
+                ipc_task->addParams(dom_str, dom_str_length);
+                ipc_task->addParams(index_str);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::SetTimeout(const char *callback_id,
                                                     const char *time) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::SETTIMEOUT));
-                // callbackId
-                serializer->add(callback_id, strlen(callback_id));
-                // time
-                serializer->add(time, strlen(time));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallNativeComponent: unexpected result: %d",
-                         result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::SETTIMEOUT);
+                ipc_task->addParams(callback_id);
+                ipc_task->addParams(time);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::NativeLog(const char *str_array) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::NATIVELOG) |
-                                   MSG_FLAG_ASYNC);
-                serializer->add(str_array, strlen(str_array));
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                sender->send(buffer.get());
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::NATIVELOG);
+                ipc_task->addParams(str_array);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::CreateBody(const char *page_id,
                                                     const char *dom_str,
                                                     int dom_str_length) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLCREATEBODY));
-
-                // page id
-                serializer->add(page_id, strlen(page_id));
-                // dom node args[2]
-                serializer->add(dom_str, dom_str_length);
 
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallNative: unexpected result: %d", 
result->getType());
-                }
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLCREATEBODY);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(dom_str, dom_str_length);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             int CoreSideInMultiProcess::UpdateFinish(const char *page_id, 
const char *task,
                                                      int task_length, const 
char *callback,
                                                      int callback_length) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLUPDATEFINISH));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(task, task_length);
-                serializer->add(callback, callback_length);
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallUpdateFinish: unexpected result: %d", 
result->getType());
+
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLUPDATEFINISH);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(task, task_length);
+                ipc_task->addParams(callback, callback_length);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> ipc_result = 
future.get()->waitResult();
+
+                if (ipc_result->getType() != IPCType::INT32) {
+                    LOGE("functionCallUpdateFinish: unexpected result: %d", 
ipc_result->getType());
                     return 0;
                 }
-                return result->get<int32_t>();
+                return ipc_result->get<int32_t>();
             }
 
             void CoreSideInMultiProcess::CreateFinish(const char *page_id) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLCREATEFINISH));
 
-                serializer->add(page_id, strlen(page_id));
 
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallCreateFinish: unexpected result: %d", 
result->getType());
-                }
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLCREATEFINISH);
+                ipc_task->addParams(page_id);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             int CoreSideInMultiProcess::RefreshFinish(const char *page_id, 
const char *task,
                                                       const char *callback) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLREFRESHFINISH));
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // task args[1]
-                serializer->add(task, strlen(task));
-                // callback args[2]
-                serializer->add(callback, strlen(callback));
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallRefreshFinish: unexpected result: %d", 
result->getType());
+
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLREFRESHFINISH);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(task);
+                ipc_task->addParams(callback);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> ipc_result = 
future.get()->waitResult();
+
+                if (ipc_result->getType() != IPCType::INT32) {
+                    LOGE("functionCallRefreshFinish: unexpected result: %d", 
ipc_result->getType());
                     return 0;
                 }
-                return result->get<int32_t>();
+                return ipc_result->get<int32_t>();
             }
 
             void CoreSideInMultiProcess::UpdateAttrs(const char *page_id, 
const char *ref,
                                                      const char *data, int 
data_length) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLUPDATEATTRS));
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // ref args[1]
-                serializer->add(ref, strlen(ref));
-                // dom node args[2] TODO
-                serializer->add(data, data_length);
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallUpdateAttrs: unexpected result: %d", 
result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLUPDATEATTRS);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                ipc_task->addParams(data, data_length);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::UpdateStyle(const char *page_id, 
const char *ref,
                                                      const char *data, int 
data_length) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLUPDATESTYLE));
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // ref args[1]
-                serializer->add(ref, strlen(ref));
-                // dom node styles args[2]
-                serializer->add(data, data_length);
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallUpdateStyle: unexpected result: %d", 
result->getType());
-                }
+
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLUPDATESTYLE);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                ipc_task->addParams(data, data_length);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::RemoveElement(const char *page_id,
                                                        const char *ref) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLREMOVEELEMENT));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(ref, strlen(ref));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallRemoveElement: unexpected result: %d", 
result->getType());
-                }
+
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLREMOVEELEMENT);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::MoveElement(const char *page_id, 
const char *ref,
                                                      const char *parent_ref, 
int index) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLMOVEELEMENT));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(ref, strlen(ref));
-                serializer->add(parent_ref, strlen(parent_ref));
-                // Client need string
-                auto temp = std::to_string(index);
-                serializer->add(temp.c_str(), temp.size());
 
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallMoveElement: unexpected result: %d", 
result->getType());
-                }
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLMOVEELEMENT);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                ipc_task->addParams(parent_ref);
+                auto temp = std::to_string(index);
+                ipc_task->addParams(temp.c_str(), temp.length());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::AddEvent(const char *page_id, const 
char *ref,
                                                   const char *event) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLADDEVENT));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(ref, strlen(ref));
-                serializer->add(event, strlen(event));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallAddEvent: unexpected result: %d", 
result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLADDEVENT);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                ipc_task->addParams(event);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::RemoveEvent(const char *page_id, 
const char *ref,
                                                      const char *event) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLREMOVEEVENT));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(ref, strlen(ref));
-                serializer->add(event, strlen(event));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::INT32) {
-                    LOGE("functionCallRemoveEvent: unexpected result: %d", 
result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLREMOVEEVENT);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(ref);
+                ipc_task->addParams(event);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             const char *CoreSideInMultiProcess::CallGCanvasLinkNative(
                     const char *context_id, int type, const char *arg) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLGCANVASLINK));
 
-                // contextId args[0]
-                serializer->add(context_id, strlen(context_id));
-                // type args[1]
-                serializer->add(type);
-                // arg args[2]
-                serializer->add(arg, strlen(arg));
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLGCANVASLINK);
+                ipc_task->addParams(context_id);
+                auto temp = std::to_string(type);
+                ipc_task->addParams(temp.c_str(), temp.length());
+                ipc_task->addParams(arg);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> result = future.get()->waitResult();
+
 
                 try {
-                    std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                    std::unique_ptr<IPCResult> result = 
sender->send(buffer.get());
                     // LOGE("weexjsc functionGCanvasLinkNative");
                     // if (result->getType() == IPCType::VOID) {
                     //     return JSValue::encode(ret);
@@ -406,91 +335,79 @@ namespace weex {
             int CoreSideInMultiProcess::SetInterval(const char *page_id,
                                                     const char *callback_id,
                                                     const char *time) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::SETINTERVAL));
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // task args[1]
-                serializer->add(callback_id, strlen(callback_id));
-                // callback args[2]
-                serializer->add(time, strlen(time));
-                try {
-                    std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                    std::unique_ptr<IPCResult> result = 
sender->send(buffer.get());
-                    if (result->getType() != IPCType::INT32) {
-                        LOGE("functionSetIntervalWeex: unexpected result: %d", 
result->getType());
-                        return 0;
-                    }
-                    return result->get<int32_t>();
-                } catch (IPCException &e) {
-                    LOGE("functionSetIntervalWeex exception %s", e.msg());
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::SETINTERVAL);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(callback_id);
+                ipc_task->addParams(time);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> result = future.get()->waitResult();
+                if (result->getType() != IPCType::INT32) {
+                    LOGE("functionSetIntervalWeex: unexpected result: %d", 
result->getType());
+                    return 0;
                 }
-                return 0;
+                return result->get<int32_t>();
             }
 
             void CoreSideInMultiProcess::ClearInterval(const char *page_id,
                                                        const char 
*callback_id) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CLEARINTERVAL));
-                // instacneID args[0]
-                serializer->add(page_id, strlen(page_id));
-                // task args[1]
-                serializer->add(callback_id, strlen(callback_id));
-                try {
-                    std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                    std::unique_ptr<IPCResult> result = 
sender->send(buffer.get());
-                } catch (IPCException &e) {
-                    LOGE("functionClearIntervalWeex exception %s", e.msg());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CLEARINTERVAL);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(callback_id);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             const char *CoreSideInMultiProcess::CallT3DLinkNative(int type,
                                                                   const char 
*arg) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::CALLT3DLINK));
-                // type args[1]
-                serializer->add(type);
-                // arg args[2]
-                serializer->add(arg, strlen(arg));
-                try {
-                    std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                    std::unique_ptr<IPCResult> result = 
sender->send(buffer.get());
-                    // LOGE("weexjsc functionT3DLinkNative");
-                    // if (result->getType() == IPCType::VOID) {
-                    //     return JSValue::encode(ret);
-                    // } else if (result->getStringLength() > 0) {
-                    //     WTF::String retWString = 
jString2String(result->getStringContent(),
-                    //     result->getStringLength()); LOGE("weexjsc 
functionT3DLinkNative
-                    //     result length > 1 retWString:%s", 
retWString.utf8().data()); ret =
-                    //     String2JSValue(state, retWString);
 
-                    // }
-                    if (result->getType() != IPCType::VOID) {
-                        if (result->getStringLength() > 0) {
-                            return jString2String(result->getStringContent(),
-                                                  result->getStringLength())
-                                    .utf8()
-                                    .data();
-                        }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::CALLT3DLINK);
+                auto temp = std::to_string(type);
+                ipc_task->addParams(temp.c_str(), temp.length());
+                ipc_task->addParams(arg);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> result = future.get()->waitResult();
+                // LOGE("weexjsc functionT3DLinkNative");
+                // if (result->getType() == IPCType::VOID) {
+                //     return JSValue::encode(ret);
+                // } else if (result->getStringLength() > 0) {
+                //     WTF::String retWString = 
jString2String(result->getStringContent(),
+                //     result->getStringLength()); LOGE("weexjsc 
functionT3DLinkNative
+                //     result length > 1 retWString:%s", 
retWString.utf8().data()); ret =
+                //     String2JSValue(state, retWString);
+
+                // }
+                if (result->getType() != IPCType::VOID) {
+                    if (result->getStringLength() > 0) {
+                        return jString2String(result->getStringContent(),
+                                              result->getStringLength())
+                                .utf8()
+                                .data();
                     }
-                } catch (IPCException &e) {
-                    LOGE("functionT3DLinkNative exception: %s", e.msg());
-                    _exit(1);
                 }
-                return NULL;
+                return nullptr;
             }
 
-            void CoreSideInMultiProcess::PostMessage(const char *vim_id, const 
char *data, int dataLength) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::POSTMESSAGE));
-                serializer->add(data, dataLength);
-                serializer->add(vim_id, strlen(vim_id));
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
+            void CoreSideInMultiProcess::PostMessage(const char *vim_id, const 
char *data,
+                                                     int dataLength) {
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::POSTMESSAGE);
+                ipc_task->addParams(data, dataLength);
+                ipc_task->addParams(vim_id);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::DispatchMessage(const char *client_id,
@@ -498,19 +415,14 @@ namespace weex {
                                                          int dataLength,
                                                          const char *callback,
                                                          const char *vm_id) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::DISPATCHMESSAGE));
-                // clientid
-                serializer->add(client_id, strlen(client_id));
-                // data
-                serializer->add(data, dataLength);
-                // callback
-                serializer->add(callback, strlen(callback));
-                serializer->add(vm_id, strlen(vm_id));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::DISPATCHMESSAGE);
+                ipc_task->addParams(client_id);
+                ipc_task->addParams(data, dataLength);
+                ipc_task->addParams(callback);
+                ipc_task->addParams(vm_id);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             std::unique_ptr<WeexJSResult>
@@ -518,84 +430,72 @@ namespace weex {
                                                         const char *data,
                                                         int dataLength,
                                                         const char *vm_id) {
-              IPCSender *sender = client_->getSender();
-              std::unique_ptr<IPCSerializer> serializer(createIPCSerializer());
-              serializer->setMsg(
-                  static_cast<uint32_t>(IPCProxyMsg::DISPATCHMESSAGESYNC));
-              // clientid
-              serializer->add(client_id, strlen(client_id));
-              // data
-              serializer->add(data, dataLength);
-              serializer->add(vm_id, strlen(vm_id));
-
-              std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-              std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-
-              char *copy = nullptr;
-              int length = 0;
-              if (result->getType() == IPCType::BYTEARRAY) {
-                length = result->getByteArrayLength();
-                copy = new char[length];
-                strcpy(copy, result->getByteArrayContent());
-              }
-              return std::unique_ptr<WeexJSResult>(
-                  new WeexJSResult(std::unique_ptr<char[]>(copy), length));
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::DISPATCHMESSAGESYNC);
+                ipc_task->addParams(client_id);
+                ipc_task->addParams(data, dataLength);
+                ipc_task->addParams(vm_id);
+                auto future = std::unique_ptr<BackToWeexCoreQueue::Future>(
+                        new BackToWeexCoreQueue::Future());
+                ipc_task->set_future(future.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
+
+                std::unique_ptr<IPCResult> result = future.get()->waitResult();
+                char *copy = nullptr;
+                int length = 0;
+                if (result->getType() == IPCType::BYTEARRAY) {
+                    length = result->getByteArrayLength();
+                    copy = new char[length];
+                    strcpy(copy, result->getByteArrayContent());
+                }
+                return std::unique_ptr<WeexJSResult>(
+                        new WeexJSResult(std::unique_ptr<char[]>(copy), 
length));
             }
 
             void CoreSideInMultiProcess::ReportException(const char *page_id,
                                                          const char *func,
                                                          const char 
*exception_string) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::REPORTEXCEPTION));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(func, strlen(func));
-                serializer->add(exception_string, strlen(exception_string));
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::VOID) {
-                    LOGE("REPORTEXCEPTION: unexpected result: %d", 
result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::REPORTEXCEPTION);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(func);
+                ipc_task->addParams(exception_string);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
             void CoreSideInMultiProcess::SetJSVersion(const char *js_version) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::SETJSFVERSION));
-                serializer->add(js_version, strlen(js_version));
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                std::unique_ptr<IPCResult> result = sender->send(buffer.get());
-                if (result->getType() != IPCType::VOID) {
-                    LOGE("setJSFVersion: unexpected result: %d", 
result->getType());
-                }
+
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::SETJSFVERSION);
+                ipc_task->addParams(js_version);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
-            void CoreSideInMultiProcess::OnReceivedResult(long callback_id, 
std::unique_ptr<WeexJSResult>& result) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());;
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::ONRECEIVEDRESULT));
-                serializer->add(static_cast<int64_t>(callback_id));
+            void CoreSideInMultiProcess::OnReceivedResult(long callback_id,
+                                                          
std::unique_ptr<WeexJSResult> &result) {
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::ONRECEIVEDRESULT);
+
+                auto temp = std::to_string(callback_id);
+                ipc_task->addParams(temp.c_str(), temp.length());
                 if (result != nullptr) {
-                    serializer->add(result->data.get(), result->length);
-                } else {
-                    serializer->addVoid();
+                    ipc_task->addParams(result->data.get(), result->length);
                 }
-
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                sender->send(buffer.get());
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
 
-            void CoreSideInMultiProcess::UpdateComponentData(const char* 
page_id, const char* cid, const char* json_data) {
-                IPCSender *sender = client_->getSender();
-                std::unique_ptr<IPCSerializer> 
serializer(createIPCSerializer());
-                
serializer->setMsg(static_cast<uint32_t>(IPCProxyMsg::UPDATECOMPONENTDATA));
-                serializer->add(page_id, strlen(page_id));
-                serializer->add(cid, strlen(cid));
-                serializer->add(json_data, strlen(json_data));
+            void CoreSideInMultiProcess::UpdateComponentData(const char 
*page_id, const char *cid,
+                                                             const char 
*json_data) {
+
 
-                std::unique_ptr<IPCBuffer> buffer = serializer->finish();
-                sender->send(buffer.get());
+                BackToWeexCoreQueue::IPCTask *ipc_task = new 
BackToWeexCoreQueue::IPCTask(
+                        IPCProxyMsg::UPDATECOMPONENTDATA);
+                ipc_task->addParams(page_id);
+                ipc_task->addParams(cid);
+                ipc_task->addParams(json_data);
+                
WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->addTask(ipc_task);
             }
         }  // namespace js
     }  // namespace bridge
diff --git 
a/weex_core/Source/android/jsengine/bridge/script/core_side_in_simple.cpp 
b/weex_core/Source/android/jsengine/bridge/script/core_side_in_simple.cpp
index 2b2eea4..368b21d 100644
--- a/weex_core/Source/android/jsengine/bridge/script/core_side_in_simple.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/core_side_in_simple.cpp
@@ -24,7 +24,6 @@
 
 #include "android/jsengine/object/args.h"
 #include "base/android/log_utils.h"
-#include "base/android/log_utils.h"
 #include "core/manager/weex_core_manager.h"
 #include "core/render/manager/render_manager.h"
 #include "third_party/IPC/IPCResult.h"
@@ -217,7 +216,7 @@ void CoreSideInSimple::ReportException(const char *page_id, 
const char *func,
 }
 
 void CoreSideInSimple::SetJSVersion(const char *js_version) {
-  LOGA("init JSFrm version %s", js_version);
+  LOGD("init JSFrm version %s", js_version);
   WeexCoreManager::Instance()
       ->getPlatformBridge()
       ->platform_side()
diff --git 
a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
 
b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
index 4e135f1..56d83ac 100644
--- 
a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
+++ 
b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.cpp
@@ -251,6 +251,17 @@ namespace weex {
                     memset(init_framework_params, 0, 
sizeof(INIT_FRAMEWORK_PARAMS));
                     init_framework_params->type = 
IPCByteArrayToWeexByteArray(ba_type);
                     init_framework_params->value = 
IPCByteArrayToWeexByteArray(ba);
+
+                    if(!WeexEnv::getEnv()->enableBackupThread()) {
+                        auto type = 
String::fromUTF8(init_framework_params->type->content);
+                        auto value = 
String::fromUTF8(init_framework_params->value->content);
+                        if(type == "enableBackupThread") {
+                            auto enable = value == "true";
+                            LOGE("enable backupThread %d",enable);
+                            WeexEnv::getEnv()->setEnableBackupThread(enable);
+                        }
+                    }
+
                     params.push_back(init_framework_params);
                 }
                 int val = Instance()->script_side()->InitFramework(source, 
params);
diff --git 
a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_simple.cpp 
b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_simple.cpp
index e714220..054ff6b 100644
--- 
a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_simple.cpp
+++ 
b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_simple.cpp
@@ -35,7 +35,7 @@ ScriptBridgeInSimple* ScriptBridgeInSimple::g_instance = NULL;
 
 ScriptBridgeInSimple::ScriptBridgeInSimple() {
   WeexEnv::getEnv()->setScriptBridge(this);
-  set_script_side(new ScriptSideInSimple(new WeexRuntime(this, false)));
+  set_script_side(new ScriptSideInSimple(new WeexRuntime(nullptr, this, 
false)));
   set_core_side(new CoreSideInSimple());
 }
 
diff --git 
a/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp 
b/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp
index a4bfe66..3275790 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.cpp
@@ -20,6 +20,7 @@
 // Created by Darin on 2018/7/22.
 //
 
+#include <object/weex_env.h>
 #include "script_side_in_queue.h"
 
 #include "android/jsengine/task/impl/init_framework_task.h"
@@ -38,182 +39,268 @@
 #include "android/jsengine/task/impl/native_timer_task.h"
 
 namespace weex {
-    namespace bridge {
-        namespace js {
-            int ScriptSideInQueue::InitFramework(
-                    const char *script, std::vector<INIT_FRAMEWORK_PARAMS *> 
&params) {
-                LOGD("ScriptSideInQueue::InitFramework");
+namespace bridge {
+namespace js {
+int ScriptSideInQueue::InitFramework(
+    const char *script, std::vector<INIT_FRAMEWORK_PARAMS *> &params) {
+  LOGD("ScriptSideInQueue::InitFramework");
 //                return runtime_->initFramework(String::fromUTF8(script), 
params);
-                weexTaskQueue_->addTask(new 
InitFrameworkTask(String::fromUTF8(script), params));
-                weexTaskQueue_->init();
-                return 1;
-            }
-
-            int ScriptSideInQueue::InitAppFramework(
-                    const char *instanceId, const char *appFramework,
-                    std::vector<INIT_FRAMEWORK_PARAMS *> &params) {
-                LOGD("ScriptSideInQueue::InitAppFramework");
-                weexTaskQueue_->addTask(new 
InitFrameworkTask(String::fromUTF8(instanceId),
-                                                              
String::fromUTF8(appFramework), params));
-                return 1;
+  weexTaskQueue_->addTask(new InitFrameworkTask(String::fromUTF8(script), 
params));
+  weexTaskQueue_->init();
+
+  if (WeexEnv::getEnv()->enableBackupThread()) {
+    weexTaskQueue_bk_ = new WeexTaskQueue(weexTaskQueue_->isMultiProgress);
+    weexTaskQueue_bk_->addTask(new InitFrameworkTask(String::fromUTF8(script), 
params));
+    weexTaskQueue_bk_->init();
+  }
+
+  return 1;
+}
+
+int ScriptSideInQueue::InitAppFramework(
+    const char *instanceId, const char *appFramework,
+    std::vector<INIT_FRAMEWORK_PARAMS *> &params) {
+  LOGD("ScriptSideInQueue::InitAppFramework");
+  weexTaskQueue_->addTask(new InitFrameworkTask(String::fromUTF8(instanceId),
+                                                
String::fromUTF8(appFramework), params));
+  return 1;
 
 //                return 
runtime_->initAppFramework(String::fromUTF8(instanceId),
 //                                                  
String::fromUTF8(appFramework), params);
-            }
+}
 
-            int ScriptSideInQueue::CreateAppContext(const char *instanceId,
-                                                    const char *jsBundle) {
-                LOGD("ScriptSideInQueue::CreateAppContext");
-                auto script = String::fromUTF8(jsBundle);
-                if(script.isEmpty()) {
-                    return 0;
-                }
-                weexTaskQueue_->addTask(new 
CreateAppContextTask(String::fromUTF8(instanceId),
-                                                                 script));
-                return 1;
-            }
+int ScriptSideInQueue::CreateAppContext(const char *instanceId,
+                                        const char *jsBundle) {
+  LOGD("ScriptSideInQueue::CreateAppContext");
+  auto script = String::fromUTF8(jsBundle);
+  if (script.isEmpty()) {
+    return 0;
+  }
+  weexTaskQueue_->addTask(new 
CreateAppContextTask(String::fromUTF8(instanceId),
+                                                   script));
+  return 1;
+}
 
-            std::unique_ptr<WeexJSResult> 
ScriptSideInQueue::ExecJSOnAppWithResult(const char *instanceId,
-                                                           const char 
*jsBundle) {
-                LOGD("ScriptSideInQueue::ExecJSOnAppWithResult");
+std::unique_ptr<WeexJSResult> ScriptSideInQueue::ExecJSOnAppWithResult(const 
char *instanceId,
+                                                                       const 
char *jsBundle) {
+  LOGD("ScriptSideInQueue::ExecJSOnAppWithResult");
 
-                WeexTask *task = new 
ExeJsOnAppWithResultTask(String::fromUTF8(instanceId),
-                                                              
String::fromUTF8(jsBundle));
+  WeexTask *task = new ExeJsOnAppWithResultTask(String::fromUTF8(instanceId),
+                                                String::fromUTF8(jsBundle));
 
-                auto future = std::unique_ptr<WeexTask::Future>(new 
WeexTask::Future());
-                task->set_future(future.get());
+  auto future = std::unique_ptr<WeexTask::Future>(new WeexTask::Future());
+  task->set_future(future.get());
 
-                weexTaskQueue_->addTask(task);
+  weexTaskQueue_->addTask(task);
 
-                return std::move(future->waitResult());
-            }
-
-            int ScriptSideInQueue::CallJSOnAppContext(
-                    const char *instanceId, const char *func,
-                    std::vector<VALUE_WITH_TYPE *> &params) {
-                LOGD("ScriptSideInQueue::CallJSOnAppContext");
-
-                weexTaskQueue_->addTask(new 
CallJsOnAppContextTask(String::fromUTF8(instanceId),
-                                                                   
String::fromUTF8(func), params));
-
-                return 1;
-            }
-
-            int ScriptSideInQueue::DestroyAppContext(const char *instanceId) {
-                LOGD("ScriptSideInQueue::DestroyAppContext");
-
-                weexTaskQueue_->addTask(new 
DestoryAppContextTask(String::fromUTF8(instanceId)));
-
-                return 1;
-            }
-
-            int ScriptSideInQueue::ExecJsService(const char *source) {
-                LOGD("ScriptSideInQueue::ExecJsService");
-
-                weexTaskQueue_->addTask(new 
ExeJsServicesTask(String::fromUTF8(source)));
-
-                return 1;
-            }
-
-            int ScriptSideInQueue::ExecTimeCallback(const char *source) {
-                LOGD("ScriptSideInQueue::ExecTimeCallback");
-
-                weexTaskQueue_->addTask(new 
CTimeCallBackTask(String::fromUTF8(source)));
-
-                return 1;
-            }
-
-            int ScriptSideInQueue::ExecJS(const char *instanceId, const char 
*nameSpace,
-                                          const char *func,
-                                          std::vector<VALUE_WITH_TYPE *> 
&params) {
-                LOGD("ScriptSideInQueue::ExecJS");
-
-                ExeJsTask *task = new ExeJsTask(instanceId, params);
-
-                task->addExtraArg(String::fromUTF8(nameSpace));
-                task->addExtraArg(String::fromUTF8(func));
-
-                weexTaskQueue_->addTask(task);
-
-                return 1;
-            }
-
-            std::unique_ptr<WeexJSResult>  ScriptSideInQueue::ExecJSWithResult(
-                    const char *instanceId, const char *nameSpace, const char 
*func,
-                    std::vector<VALUE_WITH_TYPE *> &params) {
-                LOGD("ScriptSideInQueue::ExecJSWithResult");
-
-                ExeJsTask *task = new ExeJsTask(instanceId, params, true);
-
-                auto future = std::unique_ptr<WeexTask::Future>(new 
WeexTask::Future());
-                task->set_future(future.get());
-
-                task->addExtraArg(String::fromUTF8(nameSpace));
-                task->addExtraArg(String::fromUTF8(func));
-                weexTaskQueue_->addTask(task);
-                return std::move(future->waitResult());
-            }
-
-            void  ScriptSideInQueue::ExecJSWithCallback(
-                    const char *instanceId, const char *nameSpace, const char 
*func,
-                    std::vector<VALUE_WITH_TYPE *> &params, long callback_id) {
-                LOGD("ScriptSideInQueue::ExecJSWithCallback");
-
-                ExeJsTask *task = new ExeJsTask(instanceId, params, 
callback_id);
-
-                task->addExtraArg(String::fromUTF8(nameSpace));
-                task->addExtraArg(String::fromUTF8(func));
-                weexTaskQueue_->addTask(task);
-            }
-
-            int ScriptSideInQueue::CreateInstance(const char *instanceId, 
const char *func,
-                                                  const char *script, const 
char *opts,
-                                                  const char *initData,
-                                                  const char *extendsApi, 
std::vector<INIT_FRAMEWORK_PARAMS*>& params) {
-                LOGD(
-                        "CreateInstance id = %s, func = %s, script = %s, opts 
= %s, initData = "
-                        "%s, extendsApi = %s",
-                        instanceId, func, script, opts, initData, extendsApi);
-
-                auto string = String::fromUTF8(script);
-                if(string.isEmpty()) {
-                    return 0;
-                }
-                CreateInstanceTask *task = new 
CreateInstanceTask(String::fromUTF8(instanceId),
-                                                                  string, 
params);
-
-                task->addExtraArg(String::fromUTF8(func));
-                task->addExtraArg(String::fromUTF8(opts));
-                task->addExtraArg(String::fromUTF8(initData));
-                task->addExtraArg(String::fromUTF8(extendsApi));
-                weexTaskQueue_->addTask(task);
-
-                return 1;
-            }
-
-            std::unique_ptr<WeexJSResult> 
ScriptSideInQueue::ExecJSOnInstance(const char *instanceId,
-                                                      const char *script) {
-                LOGD("ScriptSideInQueue::ExecJSOnInstance");
-                ExeJsOnInstanceTask *task = new 
ExeJsOnInstanceTask(String::fromUTF8(instanceId),
-                                                                    
String::fromUTF8(script));
-                weexTaskQueue_->addTask(task);
-                auto future = std::unique_ptr<WeexTask::Future>(new 
WeexTask::Future());
-                task->set_future(future.get());
-                return std::move(future->waitResult());
-            }
-
-            int ScriptSideInQueue::DestroyInstance(const char *instanceId) {
-                LOGD("ScriptSideInQueue::DestroyInstance instanceId: %s \n", 
instanceId);
-                weexTaskQueue_->addTask(new 
DestoryInstanceTask(String::fromUTF8(instanceId)));
-                return 1;
-            }
-
-            int ScriptSideInQueue::UpdateGlobalConfig(const char *config) {
-                LOGD("ScriptSideInQueue::UpdateGlobalConfig");
-                weexTaskQueue_->addTask(new 
UpdateGlobalConfigTask(String::fromUTF8(config)));
-                return 1;
-            }
-        }  // namespace js
-    }  // namespace bridge
+  return std::move(future->waitResult());
+}
+
+int ScriptSideInQueue::CallJSOnAppContext(
+    const char *instanceId, const char *func,
+    std::vector<VALUE_WITH_TYPE *> &params) {
+  LOGD("ScriptSideInQueue::CallJSOnAppContext");
+
+  weexTaskQueue_->addTask(new 
CallJsOnAppContextTask(String::fromUTF8(instanceId),
+                                                     String::fromUTF8(func), 
params));
+
+  return 1;
+}
+
+int ScriptSideInQueue::DestroyAppContext(const char *instanceId) {
+  LOGD("ScriptSideInQueue::DestroyAppContext");
+
+  weexTaskQueue_->addTask(new 
DestoryAppContextTask(String::fromUTF8(instanceId)));
+
+  return 1;
+}
+
+int ScriptSideInQueue::ExecJsService(const char *source) {
+  LOGD("ScriptSideInQueue::ExecJsService");
+
+  weexTaskQueue_->addTask(new ExeJsServicesTask(String::fromUTF8(source)));
+  if (WeexEnv::getEnv()->enableBackupThread() && weexTaskQueue_bk_ != nullptr) 
{
+    weexTaskQueue_bk_->addTask(new 
ExeJsServicesTask(String::fromUTF8(source)));
+  }
+
+  return 1;
+}
+
+int ScriptSideInQueue::ExecTimeCallback(const char *source) {
+  LOGD("ScriptSideInQueue::ExecTimeCallback");
+
+  weexTaskQueue_->addTask(new CTimeCallBackTask(String::fromUTF8(source)));
+  if (WeexEnv::getEnv()->enableBackupThread() && weexTaskQueue_bk_ != nullptr) 
{
+    weexTaskQueue_bk_->addTask(new 
CTimeCallBackTask(String::fromUTF8(source)));
+  }
+
+  return 1;
+}
+
+int ScriptSideInQueue::ExecJS(const char *instanceId, const char *nameSpace,
+                              const char *func,
+                              std::vector<VALUE_WITH_TYPE *> &params) {
+  LOGD("ScriptSideInQueue::ExecJS");
+
+  ExeJsTask *task = new ExeJsTask(instanceId, params);
+
+  task->addExtraArg(String::fromUTF8(nameSpace));
+  task->addExtraArg(String::fromUTF8(func));
+
+  if (instanceId == nullptr || strlen(instanceId) == 0) {
+    if (WeexEnv::getEnv()->enableBackupThread() && weexTaskQueue_bk_ != 
nullptr) {
+      weexTaskQueue_bk_->addTask(task->clone());
+    }
+
+    weexTaskQueue_->addTask(task);
+  } else {
+    taskQueue(instanceId, false)->addTask(task);
+  }
+  return 1;
+}
+
+std::unique_ptr<WeexJSResult> ScriptSideInQueue::ExecJSWithResult(
+    const char *instanceId, const char *nameSpace, const char *func,
+    std::vector<VALUE_WITH_TYPE *> &params) {
+  LOGD("ScriptSideInQueue::ExecJSWithResult");
+
+  ExeJsTask *task = new ExeJsTask(instanceId, params, true);
+
+  auto future = std::unique_ptr<WeexTask::Future>(new WeexTask::Future());
+  task->set_future(future.get());
+
+  task->addExtraArg(String::fromUTF8(nameSpace));
+  task->addExtraArg(String::fromUTF8(func));
+  taskQueue(instanceId, false)->addTask(task);
+  return std::move(future->waitResult());
+}
+
+void ScriptSideInQueue::ExecJSWithCallback(
+    const char *instanceId, const char *nameSpace, const char *func,
+    std::vector<VALUE_WITH_TYPE *> &params, long callback_id) {
+  LOGD("ScriptSideInQueue::ExecJSWithCallback");
+
+  ExeJsTask *task = new ExeJsTask(instanceId, params, callback_id);
+
+  task->addExtraArg(String::fromUTF8(nameSpace));
+  task->addExtraArg(String::fromUTF8(func));
+  taskQueue(instanceId, false)->addTask(task);
+}
+
+int ScriptSideInQueue::CreateInstance(const char *instanceId,
+                                      const char *func,
+                                      const char *script,
+                                      const char *opts,
+                                      const char *initData,
+                                      const char *extendsApi,
+                                      std::vector<INIT_FRAMEWORK_PARAMS *> 
&params) {
+  LOGD(
+      "CreateInstance id = %s, func = %s, script = %s, opts = %s, initData = "
+      "%s, extendsApi = %s",
+      instanceId, func, script, opts, initData, extendsApi);
+  if (WeexEnv::getEnv()->enableBackupThread()) {
+    for (int i = 0; i < params.size(); ++i) {
+      auto param = params[i];
+      auto type = String::fromUTF8(param->type->content);
+      auto value = String::fromUTF8(param->value->content);
+      if (type == "use_back_thread") {
+        if (value == "true") {
+          useBackUpWeexRuntime(instanceId);
+        }
+        break;
+      }
+    }
+  }
+  auto string = String::fromUTF8(script);
+  if (string.isEmpty()) {
+    return 0;
+  }
+  CreateInstanceTask *task = new 
CreateInstanceTask(String::fromUTF8(instanceId),
+                                                    string, params);
+
+  task->addExtraArg(String::fromUTF8(func));
+  task->addExtraArg(String::fromUTF8(opts));
+  task->addExtraArg(String::fromUTF8(initData));
+  task->addExtraArg(String::fromUTF8(extendsApi));
+  auto pQueue = taskQueue(instanceId, true);
+  pQueue->addTask(task);
+  if (!pQueue->isInitOk) {
+    pQueue->init();
+  }
+  return 1;
+}
+
+std::unique_ptr<WeexJSResult> ScriptSideInQueue::ExecJSOnInstance(const char 
*instanceId,
+                                                                  const char 
*script) {
+  LOGD("ScriptSideInQueue::ExecJSOnInstance");
+  ExeJsOnInstanceTask *task = new 
ExeJsOnInstanceTask(String::fromUTF8(instanceId),
+                                                      
String::fromUTF8(script));
+  taskQueue(instanceId, false)->addTask(task);
+  auto future = std::unique_ptr<WeexTask::Future>(new WeexTask::Future());
+  task->set_future(future.get());
+  return std::move(future->waitResult());
+}
+
+int ScriptSideInQueue::DestroyInstance(const char *instanceId) {
+  LOGD("ScriptSideInQueue::DestroyInstance instanceId: %s \n", instanceId);
+  taskQueue(instanceId,
+            false)->addTask(new 
DestoryInstanceTask(String::fromUTF8(instanceId)));
+  deleteBackUpRuntimeInstance(instanceId);
+  return 1;
+}
+
+int ScriptSideInQueue::UpdateGlobalConfig(const char *config) {
+  LOGD("ScriptSideInQueue::UpdateGlobalConfig");
+  weexTaskQueue_->addTask(new 
UpdateGlobalConfigTask(String::fromUTF8(config)));
+  if (WeexEnv::getEnv()->enableBackupThread() && weexTaskQueue_bk_ != nullptr) 
{
+    weexTaskQueue_bk_->addTask(new 
UpdateGlobalConfigTask(String::fromUTF8(config)));
+  }
+
+  return 1;
+}
+
+void ScriptSideInQueue::useBackUpWeexRuntime(std::string id) {
+  usingBackThreadId.push_back(id);
+}
+
+bool ScriptSideInQueue::shouldUseBackUpWeexRuntime(std::string id) {
+  if (id.empty() || !WeexEnv::getEnv()->enableBackupThread())
+    return false;
+  auto iter = std::find(usingBackThreadId.begin(), usingBackThreadId.end(), 
id);
+  return iter != usingBackThreadId.end();
+}
+
+void ScriptSideInQueue::deleteBackUpRuntimeInstance(std::string id) {
+  if (!WeexEnv::getEnv()->enableBackupThread()) {
+    return;
+  }
+
+  auto iter = std::find(usingBackThreadId.begin(), usingBackThreadId.end(), 
id);
+  if (iter != usingBackThreadId.end()) {
+    usingBackThreadId.erase(iter);
+  }
+}
+
+WeexTaskQueue *ScriptSideInQueue::taskQueue(const char *id, bool log) {
+  if (!WeexEnv::getEnv()->enableBackupThread()) {
+    return weexTaskQueue_;
+  }
+
+  if (id != nullptr && shouldUseBackUpWeexRuntime(id)) {
+    if (weexTaskQueue_bk_ == nullptr) {
+      weexTaskQueue_bk_ = new WeexTaskQueue(weexTaskQueue_->isMultiProgress);
+    }
+    if (log) {
+      LOGE("dyyLog instance %s use back up thread time is %lld", id, 
microTime());
+    }
+    return weexTaskQueue_bk_;
+  }
+  if (log && id != nullptr) {
+    LOGE("dyyLog instance %s use main thread time is %lld", id, microTime());
+  }
+  return weexTaskQueue_;
+}
+}  // namespace js
+}  // namespace bridge
 
 }  // namespace weex
diff --git 
a/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.h 
b/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.h
index 39c65eb..5947a25 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.h
+++ b/weex_core/Source/android/jsengine/bridge/script/script_side_in_queue.h
@@ -34,10 +34,14 @@ namespace weex {
             private:
                 WeexTaskQueue *weexTaskQueue_;
 
+                WeexTaskQueue *weexTaskQueue_bk_;
+
             public:
-                explicit ScriptSideInQueue() : weexTaskQueue_(nullptr) {};
+                explicit ScriptSideInQueue() : weexTaskQueue_(nullptr),
+                                               weexTaskQueue_bk_(nullptr) {};
 
-                explicit ScriptSideInQueue(WeexTaskQueue *taskQueue) { 
weexTaskQueue_ = taskQueue; }
+                explicit ScriptSideInQueue(WeexTaskQueue *taskQueue) : 
weexTaskQueue_bk_(
+                        nullptr) { weexTaskQueue_ = taskQueue; }
 
             public:
 
@@ -52,7 +56,7 @@ namespace weex {
                 int CreateAppContext(const char *instanceId, const char 
*jsBundle) override;
 
                 std::unique_ptr<WeexJSResult> ExecJSOnAppWithResult(const char 
*instanceId,
-                                            const char *jsBundle) override;
+                                                                    const char 
*jsBundle) override;
 
                 int CallJSOnAppContext(const char *instanceId, const char 
*func,
                                        std::vector<VALUE_WITH_TYPE *> &params) 
override;
@@ -66,24 +70,40 @@ namespace weex {
                 int ExecJS(const char *instanceId, const char *nameSpace, 
const char *func,
                            std::vector<VALUE_WITH_TYPE *> &params) override;
 
-                std::unique_ptr<WeexJSResult>  ExecJSWithResult(const char 
*instanceId, const char *nameSpace,
-                                              const char *func,
-                                              std::vector<VALUE_WITH_TYPE *> 
&params) override;
+                std::unique_ptr<WeexJSResult>
+                ExecJSWithResult(const char *instanceId, const char *nameSpace,
+                                 const char *func,
+                                 std::vector<VALUE_WITH_TYPE *> &params) 
override;
+
                 void ExecJSWithCallback(const char *instanceId, const char 
*nameSpace,
-                                              const char *func,
-                                              std::vector<VALUE_WITH_TYPE *> 
&params, long callback_id) override;
+                                        const char *func,
+                                        std::vector<VALUE_WITH_TYPE *> &params,
+                                        long callback_id) override;
 
 
                 int CreateInstance(const char *instanceId, const char *func,
                                    const char *script, const char *opts, const 
char *initData,
-                                   const char *extendsApi, 
std::vector<INIT_FRAMEWORK_PARAMS*>& params) override;
+                                   const char *extendsApi,
+                                   std::vector<INIT_FRAMEWORK_PARAMS *> 
&params) override;
 
-                std::unique_ptr<WeexJSResult> ExecJSOnInstance(const char 
*instanceId, const char *script) override;
+                std::unique_ptr<WeexJSResult>
+                ExecJSOnInstance(const char *instanceId, const char *script) 
override;
 
                 int DestroyInstance(const char *instanceId) override;
 
                 int UpdateGlobalConfig(const char *config) override;
 
+            private:
+                std::vector<std::string> usingBackThreadId;
+
+                void useBackUpWeexRuntime(std::string id);
+
+                bool shouldUseBackUpWeexRuntime(std::string id);
+
+                void deleteBackUpRuntimeInstance(std::string id);
+
+                WeexTaskQueue *taskQueue(const char *id, bool log);
+
             };
         }  // namespace js
     }  // namespace bridge
diff --git a/weex_core/Source/android/jsengine/object/weex_env.cpp 
b/weex_core/Source/android/jsengine/object/weex_env.cpp
index d982af2..f4d7241 100644
--- a/weex_core/Source/android/jsengine/object/weex_env.cpp
+++ b/weex_core/Source/android/jsengine/object/weex_env.cpp
@@ -24,16 +24,19 @@
 
 WeexEnv *WeexEnv::env_ = nullptr;
 
-TimerQueue *WeexEnv::timerQueue() { return weexTimerQueue_.get(); }
-
-void WeexEnv::setTimerQueue(TimerQueue *timerQueue) { 
weexTimerQueue_.reset(timerQueue); }
-
 WeexCore::ScriptBridge *WeexEnv::scriptBridge() { return scriptBridge_; }
 
-
 bool WeexEnv::useWson() { return isUsingWson; }
 
 void WeexEnv::setUseWson(bool useWson) { isUsingWson = useWson; }
 
 void WeexEnv::setScriptBridge(WeexCore::ScriptBridge *scriptBridge) { 
scriptBridge_ = scriptBridge; }
 
+void WeexEnv::initIPC() {
+    // init IpcClient in io Thread
+    m_ipc_client_.reset(new WeexIPCClient(ipcClientFd_));
+}
+WeexEnv::WeexEnv() {
+    this->enableBackupThread__ = false;
+    this->isUsingWson = true;
+}
diff --git a/weex_core/Source/android/jsengine/object/weex_env.h 
b/weex_core/Source/android/jsengine/object/weex_env.h
index 192ed0b..207eca7 100644
--- a/weex_core/Source/android/jsengine/object/weex_env.h
+++ b/weex_core/Source/android/jsengine/object/weex_env.h
@@ -24,6 +24,7 @@
 #define WEEXV8_WEEXENV_H
 
 #include <mutex>
+#include "android/jsengine/task/back_to_weex_core_queue.h"
 
 #include "android/jsengine/task/timer_queue.h"
 #include "android/jsengine/weex_ipc_server.h"
@@ -38,17 +39,12 @@ public:
         return env_;
     }
 
+    WeexEnv();
 
     bool useWson();
 
     void setUseWson(bool useWson);
 
-
-    TimerQueue *timerQueue();
-
-    void setTimerQueue(TimerQueue *timerQueue);
-
-
     WeexCore::ScriptBridge *scriptBridge();
 
     void setScriptBridge(WeexCore::ScriptBridge *scriptBridge);
@@ -78,16 +74,30 @@ public:
     }
 
 
+    void initIPC();
+
+    void setEnableBackupThread(bool enable) {
+        this->enableBackupThread__ = enable;
+    }
+
+    bool enableBackupThread() {
+        return enableBackupThread__;
+    }
+
+public:
+    std::unique_ptr<BackToWeexCoreQueue> m_back_to_weex_core_thread;
+    volatile bool isMultiProcess = true;
+    std::unique_ptr<WeexIPCClient> m_ipc_client_;
 private:
     static WeexEnv *env_;
 
-    volatile bool isMultiProcess = true;
     volatile bool isUsingWson = true;
 
     std::unique_ptr<TimerQueue> weexTimerQueue_;
 
     WeexCore::ScriptBridge *scriptBridge_;
 
+    bool enableBackupThread__ = false;
 
     volatile int ipcClientFd_;
     volatile int ipcServerFd_;
diff --git a/weex_core/Source/android/jsengine/object/weex_global_object.cpp 
b/weex_core/Source/android/jsengine/object/weex_global_object.cpp
index 33952b0..07d9d70 100644
--- a/weex_core/Source/android/jsengine/object/weex_global_object.cpp
+++ b/weex_core/Source/android/jsengine/object/weex_global_object.cpp
@@ -23,9 +23,11 @@
 #include "android/jsengine/object/weex_global_object.h"
 
 #include <sys/stat.h>
+#include <base/time_calculator.h>
 #include "android/jsengine/object/weex_env.h"
 #include "android/jsengine/object/weex_console_object.h"
 #include "android/jsengine/task/timer_task.h"
+#include "android/jsengine/task/timer_queue.h"
 #include "android/jsengine/weex_jsc_utils.h"
 #include "base/utils/log_utils.h"
 #include "core/bridge/script_bridge.h"
@@ -401,6 +403,13 @@ JSFUNCTION functionCallNativeModule(ExecState *state) {
     getWsonOrJsonArgsFromState(state, 3, arguments);
     getWsonOrJsonArgsFromState(state, 4, options);
 
+//    String a;
+//    a.append("functionCallNativeModule:");
+//    a.append(moduleChar.getValue());
+//    a.append(":");
+//    a.append(methodChar.getValue());
+//    weex::base::TimeCalculator 
timeCalculator(weex::base::TaskPlatform::JSS_ENGINE, a.utf8().data(), 
instanceId.getValue());
+//    timeCalculator.taskStart();
     auto result = 
globalObject->js_bridge()->core_side()->CallNativeModule(instanceId.getValue(),
                                                                            
moduleChar.getValue(),
                                                                            
methodChar.getValue(),
@@ -408,6 +417,7 @@ JSFUNCTION functionCallNativeModule(ExecState *state) {
                                                                            
arguments.getLength(),
                                                                            
options.getValue(),
                                                                            
options.getLength());
+//    timeCalculator.taskEnd();
     JSValue ret;
     switch (result->type) {
         case ParamsType::DOUBLE:
@@ -509,9 +519,15 @@ JSFUNCTION functionCallUpdateFinish(ExecState *state) {
     getWsonArgsFromState(state, 1, taskChar);
     getWsonArgsFromState(state, 2, callBackChar);
     WeexGlobalObject *globalObject = static_cast<WeexGlobalObject 
*>(state->lexicalGlobalObject());
+//    weex::base::TimeCalculator 
timeCalculator(weex::base::TaskPlatform::JSS_ENGINE, 
"functionCallUpdateFinish",globalObject->id);
+//    timeCalculator.taskStart();
+
+
     auto result = 
globalObject->js_bridge()->core_side()->UpdateFinish(idChar.getValue(), 
taskChar.getValue(),
                                                                        
taskChar.getLength(), callBackChar.getValue(),
                                                                        
callBackChar.getLength());
+
+//    timeCalculator.taskEnd();
     return JSValue::encode(jsNumber(result));
 }
 
@@ -535,9 +551,14 @@ JSFUNCTION functionCallRefreshFinish(ExecState *state) {
     getStringArgsFromState(state, 1, taskChar);
     getStringArgsFromState(state, 2, callBackChar);
     WeexGlobalObject *globalObject = static_cast<WeexGlobalObject 
*>(state->lexicalGlobalObject());
+//    weex::base::TimeCalculator 
timeCalculator(weex::base::TaskPlatform::JSS_ENGINE, 
"functionCallRefreshFinish",globalObject->id);
+//    timeCalculator.taskStart();
+
     int result = 
globalObject->js_bridge()->core_side()->RefreshFinish(idChar.getValue(),
                                                                        
taskChar.getValue(),
                                                                        
callBackChar.getValue());
+
+//    timeCalculator.taskEnd();
     return JSValue::encode(jsNumber(result));
 }
 
@@ -792,7 +813,7 @@ JSFUNCTION functionNativeSetTimeout(ExecState *state) {
     VM &vm = globalObject->vm();
     const JSValue value = state->argument(0);
     const JSValue jsValue = state->argument(1);
-    TimerQueue *timerQueue =WeexEnv::getEnv()->timerQueue();
+    TimerQueue *timerQueue = globalObject->timeQueue;
     if (timerQueue != nullptr) {
         uint32_t function_id = globalObject->genFunctionID();
         globalObject->addTimer(function_id, JSC::Strong<JSC::Unknown> { vm, 
JSC::asObject(value) });
@@ -817,7 +838,7 @@ JSFUNCTION functionNativeSetInterval(ExecState *state) {
     VM &vm = globalObject->vm();
     const JSValue value = state->argument(0);
     const JSValue jsValue = state->argument(1);
-    TimerQueue *timerQueue =WeexEnv::getEnv()->timerQueue();
+    TimerQueue *timerQueue =globalObject->timeQueue;
     if (timerQueue != nullptr) {
         uint32_t function_id = globalObject->genFunctionID();
         globalObject->addTimer(function_id, JSC::Strong<JSC::Unknown> { vm, 
JSC::asObject(value) });
@@ -831,7 +852,8 @@ JSFUNCTION functionNativeSetInterval(ExecState *state) {
 }
 
 JSFUNCTION functionNativeClearTimeout(ExecState *state) {
-    TimerQueue *timerQueue = WeexEnv::getEnv()->timerQueue();
+    WeexGlobalObject *globalObject = static_cast<WeexGlobalObject 
*>(state->lexicalGlobalObject());
+    TimerQueue *timerQueue = globalObject->timeQueue;
     const JSValue& value = state->argument(0);
     if (timerQueue != nullptr) {
         timerQueue->removeTimer(value.asInt32());
diff --git a/weex_core/Source/android/jsengine/object/weex_global_object.h 
b/weex_core/Source/android/jsengine/object/weex_global_object.h
index e84773f..dbcd531 100644
--- a/weex_core/Source/android/jsengine/object/weex_global_object.h
+++ b/weex_core/Source/android/jsengine/object/weex_global_object.h
@@ -26,12 +26,16 @@
 #include <map>
 #include "android/jsengine/weex_ipc_server.h"
 #include "android/jsengine/weex_jsc_utils.h"
+
 #include "include/WeexApiHeader.h"
 #include "APICast.h"
 #include "JSStringRef.h"
 #include "JSContextRef.h"
 
 using namespace JSC;
+
+class TimerQueue;
+
 namespace weex {
     class GlobalObjectDelegate;
 }
@@ -48,6 +52,7 @@ public:
     typedef JSGlobalObject Base;
     std::vector<INIT_FRAMEWORK_PARAMS *> m_initFrameworkParams;
     std::string id = "";
+    TimerQueue* timeQueue = nullptr;
     static WeexGlobalObject* create(VM& vm, Structure* structure)
     {
         WeexGlobalObject* object = new (NotNull, 
allocateCell<WeexGlobalObject>(vm.heap)) WeexGlobalObject(vm, structure);
diff --git a/weex_core/Source/android/jsengine/object/weex_object_holder.cpp 
b/weex_core/Source/android/jsengine/object/weex_object_holder.cpp
index 9d89c22..196402f 100644
--- a/weex_core/Source/android/jsengine/object/weex_object_holder.cpp
+++ b/weex_core/Source/android/jsengine/object/weex_object_holder.cpp
@@ -56,45 +56,36 @@ void WeexObjectHolder::initFromIPCArguments(IPCArguments 
*arguments, size_t star
 }
 
 void WeexObjectHolder::initFromParams(std::vector<INIT_FRAMEWORK_PARAMS *> 
&params, bool forAppContext) {
-    if (!WEEXICU::initICUEnv(isMultiProgress)) {
-        LOGE("failed to init ICUEnv single process");
-        // return false;
-    }
-
-    Options::enableRestrictedOptions(true);
-// Initialize JSC before getting VM.
-    WTF::initializeMainThread();
-    initHeapTimer();
-    JSC::initializeThreading();
-#if ENABLE(WEBASSEMBLY)
-    JSC::Wasm::enableFastMemory();
-#endif
-    VM &vm = VM::sharedInstance();
-    JSLockHolder locker(&vm);
-    WeexGlobalObject *globalObject = WeexGlobalObject::create(vm, 
WeexGlobalObject::createStructure(vm, jsNull()));
+    JSLockHolder locker(this->m_globalVM);
+    VM& vm = *(this->m_globalVM);
+    WeexGlobalObject *globalObject = WeexGlobalObject::create(vm, 
WeexGlobalObject::createStructure(
+        vm, jsNull()));
     globalObject->initWxEnvironment(params, forAppContext, true);
     if (forAppContext)
         globalObject->initFunctionForAppContext();
     else
         globalObject->initFunction();
 
+    globalObject->timeQueue = this->timeQueue;
     m_globalObject.set(vm, globalObject);
     vm.heap.setGarbageCollectionTimerEnabled(true);
     wson::init(&vm);
 }
 
-WeexObjectHolder::WeexObjectHolder(bool isMultiProgress) {
+WeexObjectHolder::WeexObjectHolder(VM* vm,  TimerQueue* timeQueue, bool 
isMultiProgress) {
     this->isMultiProgress = isMultiProgress;
+    this->timeQueue = timeQueue;
+    this->m_globalVM = vm;
 }
 
-WeexGlobalObject *WeexObjectHolder::cloneWeexObject(bool initContext, bool 
forAppContext) {
-    VM &vm = VM::sharedInstance();
-    JSLockHolder locker(&vm);
+WeexGlobalObject *WeexObjectHolder::cloneWeexObject(std::string page_id, bool 
initContext, bool forAppContext) {
+    JSLockHolder locker(this->m_globalVM);
+    VM& vm = *(this->m_globalVM);
     auto *temp_object = WeexGlobalObject::create(vm,
                                                  
WeexGlobalObject::createStructure(vm, jsNull()));
 
     temp_object->initWxEnvironment(m_globalObject->m_initFrameworkParams, 
forAppContext, false);
-
+    temp_object->timeQueue = this->timeQueue;
     if (forAppContext)
         temp_object->initFunctionForAppContext();
     else if (initContext)
@@ -102,13 +93,13 @@ WeexGlobalObject *WeexObjectHolder::cloneWeexObject(bool 
initContext, bool forAp
     else
         temp_object->initFunction();
 
+    temp_object->id = page_id;
     return temp_object;
 }
 
 WeexObjectHolder::~WeexObjectHolder() {
-    VM &vm = VM::sharedInstance();
     wson::destory();
-    JSLockHolder locker(&vm);
-    vm.heap.collectAllGarbage();
+    JSLockHolder locker(this->m_globalVM);
+    this->m_globalVM->heap.collectAllGarbage();
 }
 
diff --git a/weex_core/Source/android/jsengine/object/weex_object_holder.h 
b/weex_core/Source/android/jsengine/object/weex_object_holder.h
index 62ecd14..5f73a2d 100644
--- a/weex_core/Source/android/jsengine/object/weex_object_holder.h
+++ b/weex_core/Source/android/jsengine/object/weex_object_holder.h
@@ -23,6 +23,7 @@
 #ifndef WEEXV8_WEEXOBJECTHOLDER_H
 #define WEEXV8_WEEXOBJECTHOLDER_H
 
+#include "android/jsengine/task/timer_queue.h"
 #include "android/jsengine/object/weex_global_object.h"
 #include "android/jsengine/weex_jsc_utils.h"
 
@@ -31,19 +32,22 @@ class WeexObjectHolder {
 public:
     Strong<WeexGlobalObject> m_globalObject;
 
+    VM* m_globalVM;
+
     std::map<std::string, WeexGlobalObject *> m_jsInstanceGlobalObjectMap;
 
     ~WeexObjectHolder();
 
 
-    explicit WeexObjectHolder(bool isMultiProgress);
+    explicit WeexObjectHolder(VM* vm, TimerQueue* timeQueue, bool 
isMultiProgress);
 
     void initFromIPCArguments(IPCArguments *arguments, size_t startCount, bool 
forAppContext);
 
     void initFromParams(std::vector<INIT_FRAMEWORK_PARAMS *> &params, bool 
forAppContext);
 
-    WeexGlobalObject *cloneWeexObject(bool initContext, bool forAppContext);
+    WeexGlobalObject *cloneWeexObject(std::string page_id, bool initContext, 
bool forAppContext);
 
+    TimerQueue* timeQueue;
 
 private:
     bool isMultiProgress;
diff --git a/weex_core/Source/android/jsengine/task/back_to_weex_core_queue.cpp 
b/weex_core/Source/android/jsengine/task/back_to_weex_core_queue.cpp
new file mode 100644
index 0000000..2db1cd9
--- /dev/null
+++ b/weex_core/Source/android/jsengine/task/back_to_weex_core_queue.cpp
@@ -0,0 +1,154 @@
+/**
+ * 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.
+ */
+//
+// Created by 董亚运 on 2019/1/8.
+//
+
+#include <base/android/log_utils.h>
+#include <object/weex_env.h>
+#include "back_to_weex_core_queue.h"
+
+
+static void *startThread(void *td) {
+    auto *self = static_cast<BackToWeexCoreQueue *>(td);
+    WeexEnv::getEnv()->initIPC();
+    self->isInitOk = true;
+    self->start();
+    return NULL;
+}
+
+int BackToWeexCoreQueue::addTask(BackToWeexCoreQueue::IPCTask *task) {
+    threadLocker.lock();
+    taskQueue_.push_back(task);
+    int size = taskQueue_.size();
+    threadLocker.unlock();
+    threadLocker.signal();
+    return size;
+}
+
+void BackToWeexCoreQueue::init() {
+    pthread_t thread;
+    pthread_create(&thread, nullptr, startThread, this);
+    pthread_setname_np(thread, "BackToWeexCoreQueue");
+}
+
+void BackToWeexCoreQueue::start() {
+    while (!m_stop) {
+        BackToWeexCoreQueue::IPCTask *task = getTask();
+        if (task == nullptr) {
+            continue;
+        }
+        task->run();
+        delete task;
+    }
+
+}
+
+BackToWeexCoreQueue::IPCTask *BackToWeexCoreQueue::getTask() {
+    BackToWeexCoreQueue::IPCTask *task = nullptr;
+    while (task == nullptr) {
+        threadLocker.lock();
+        while (taskQueue_.empty() || !isInitOk) {
+            threadLocker.wait();
+        }
+
+        if (taskQueue_.empty()) {
+            threadLocker.unlock();
+            continue;
+        }
+
+        assert(!taskQueue_.empty());
+        task = taskQueue_.front();
+        taskQueue_.pop_front();
+        threadLocker.unlock();
+    }
+
+    return task;
+}
+
+void BackToWeexCoreQueue::stop() {
+    m_stop = true;
+}
+
+void BackToWeexCoreQueue::IPCTask::run() {
+    if (params.empty())
+        return;
+
+    std::unique_ptr<IPCSerializer> serializer(createIPCSerializer());;
+    serializer->setMsg(static_cast<uint32_t>(this->m_type));
+    std::vector<BackToWeexCoreQueue::IPCArgs *>::iterator it;
+    it = params.begin();
+    while (it != params.end()) {
+        IPCArgs *&reference = *it;
+        serializer->add(reference->m_str, reference->m_length);
+        delete reference;
+        it++;
+    }
+
+    std::unique_ptr<IPCBuffer> buffer = serializer->finish();
+    std::unique_ptr<IPCResult> result = 
WeexEnv::getEnv()->m_ipc_client_->getSender()->send(
+            buffer.get());
+    if (m_future != nullptr) {
+        m_future->setResult(result);
+    }
+}
+
+void BackToWeexCoreQueue::IPCTask::addParams(const char *str, size_t len) {
+    IPCArgs *x = new BackToWeexCoreQueue::IPCArgs(str, len);
+    this->params.push_back(x);
+}
+
+void BackToWeexCoreQueue::IPCTask::set_future(BackToWeexCoreQueue::Future 
*m_feature) {
+    IPCTask::m_future = m_feature;
+}
+
+BackToWeexCoreQueue::IPCTask::~IPCTask() {
+}
+
+
+void BackToWeexCoreQueue::Future::setResult(std::unique_ptr<IPCResult> 
&result) {
+    thread_locker_.lock();
+    has_result_ = true;
+    result_ = std::move(result);
+    thread_locker_.unlock();
+    thread_locker_.signal();
+}
+
+std::unique_ptr<IPCResult> BackToWeexCoreQueue::Future::waitResult() {
+    thread_locker_.lock();
+    while (!has_result_) {
+        thread_locker_.wait();
+    }
+    thread_locker_.unlock();
+    return std::move(result_);
+}
+
+BackToWeexCoreQueue::IPCArgs::IPCArgs(const char *str, size_t len) {
+    char *ret = nullptr;
+    size_t strLen = 0;
+    if (str != nullptr) {
+        strLen = len == 0 ? strlen(str) : len;
+        ret = new char[strLen + 1];
+        memcpy(ret, str, static_cast<size_t>(strLen));
+        ret[strLen] = '\0';
+
+    }
+    this->m_str = ret;
+    this->m_length = strLen;
+}
diff --git a/weex_core/Source/android/jsengine/task/back_to_weex_core_queue.h 
b/weex_core/Source/android/jsengine/task/back_to_weex_core_queue.h
new file mode 100644
index 0000000..ef808cd
--- /dev/null
+++ b/weex_core/Source/android/jsengine/task/back_to_weex_core_queue.h
@@ -0,0 +1,118 @@
+/**
+ * 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.
+ */
+//
+// Created by 董亚运 on 2019/1/8.
+//
+
+#ifndef WEEX_PROJECT_BACK_TO_WEEX_CORE_QUEUE_H
+#define WEEX_PROJECT_BACK_TO_WEEX_CORE_QUEUE_H
+
+
+#include <deque>
+#include <map>
+#include <third_party/IPC/IPCResult.h>
+#include <third_party/IPC/IPCMessageJS.h>
+#include <vector>
+#include "base/utils/ThreadLocker.h"
+#include "base/closure.h"
+
+class BackToWeexCoreQueue {
+
+public:
+
+    class Future {
+
+    public:
+
+        Future() : has_result_(false) {}
+
+        ~Future() {}
+
+        void setResult(std::unique_ptr<IPCResult> &result);
+
+        std::unique_ptr<IPCResult> waitResult();
+
+    private:
+        bool has_result_ = false;
+        std::unique_ptr<IPCResult> result_;
+        ThreadLocker thread_locker_;
+    };
+
+    class IPCArgs {
+
+    public:
+        explicit IPCArgs(const char *str, size_t len = 0);
+
+        ~IPCArgs() {
+            if (m_str != nullptr)
+                delete (m_str);
+            m_length = 0;
+        }
+
+    public:
+        char *m_str;
+        size_t m_length;
+    };
+
+    class IPCTask {
+    public:
+        std::vector<BackToWeexCoreQueue::IPCArgs *> params;
+
+        explicit IPCTask(IPCProxyMsg type) : m_type(type),
+                                             m_future(nullptr) {}
+
+        ~IPCTask();
+
+        void run();
+
+        void addParams(const char *str, size_t len = 0);
+
+        void set_future(Future *m_feature);
+
+    private:
+        IPCProxyMsg m_type;
+        Future *m_future;
+
+    };
+
+    explicit BackToWeexCoreQueue():
+            m_stop(false) {};
+
+    BackToWeexCoreQueue::IPCTask *getTask();
+
+    void start();
+
+    void stop();
+
+    void init();
+
+    int addTask(BackToWeexCoreQueue::IPCTask *task);
+
+
+private:
+    std::deque<BackToWeexCoreQueue::IPCTask *> taskQueue_;
+    ThreadLocker threadLocker;
+    bool m_stop;
+
+public:
+    volatile bool isInitOk = false;
+};
+
+
+#endif //WEEX_PROJECT_BACK_TO_WEEX_CORE_QUEUE_H
diff --git a/weex_core/Source/android/jsengine/task/impl/exe_js_task.cpp 
b/weex_core/Source/android/jsengine/task/impl/exe_js_task.cpp
index 4b09a4a..85288f4 100644
--- a/weex_core/Source/android/jsengine/task/impl/exe_js_task.cpp
+++ b/weex_core/Source/android/jsengine/task/impl/exe_js_task.cpp
@@ -69,3 +69,11 @@ ExeJsTask::ExeJsTask(const String &instanceId, IPCArguments 
*arguments, size_t s
 ExeJsTask::~ExeJsTask() {
     delete exeJsArgs;
 }
+
+ExeJsTask *ExeJsTask::clone() {
+    ExeJsTask *task = new ExeJsTask(instanceId, this->exeJsArgs->params);
+    for (int i = 0; i < this->extraArgs.size(); ++i) {
+        task->addExtraArg(this->extraArgs[i]);
+    }
+    return task;
+}
diff --git a/weex_core/Source/android/jsengine/task/impl/exe_js_task.h 
b/weex_core/Source/android/jsengine/task/impl/exe_js_task.h
index e9380a2..dde25b8 100644
--- a/weex_core/Source/android/jsengine/task/impl/exe_js_task.h
+++ b/weex_core/Source/android/jsengine/task/impl/exe_js_task.h
@@ -40,6 +40,7 @@ public:
     void run(WeexRuntime *runtime) override;
     std::string taskName() override { return "ExeJsTask"; }
 
+  ExeJsTask * clone();
 
     ~ExeJsTask() override;
 
diff --git 
a/weex_core/Source/android/jsengine/task/impl/init_framework_task.cpp 
b/weex_core/Source/android/jsengine/task/impl/init_framework_task.cpp
index 7a61b5b..14091c2 100644
--- a/weex_core/Source/android/jsengine/task/impl/init_framework_task.cpp
+++ b/weex_core/Source/android/jsengine/task/impl/init_framework_task.cpp
@@ -55,3 +55,6 @@ InitFrameworkTask::InitFrameworkTask(const String 
&instanceId, const String &scr
 InitFrameworkTask::~InitFrameworkTask() {
     delete args;
 }
+InitFrameworkTask *InitFrameworkTask::clone() {
+  return new InitFrameworkTask(this->script.utf8().data(), args->params);
+}
diff --git a/weex_core/Source/android/jsengine/task/impl/init_framework_task.h 
b/weex_core/Source/android/jsengine/task/impl/init_framework_task.h
index 336b680..a5f648c 100644
--- a/weex_core/Source/android/jsengine/task/impl/init_framework_task.h
+++ b/weex_core/Source/android/jsengine/task/impl/init_framework_task.h
@@ -46,6 +46,7 @@ public:
 
     std::string taskName() override { return "InitFrameworkTask"; }
 
+    InitFrameworkTask *clone();
 
     ~InitFrameworkTask();
 
diff --git a/weex_core/Source/android/jsengine/task/impl/native_timer_task.h 
b/weex_core/Source/android/jsengine/task/impl/native_timer_task.h
index 0f6209e..d44db17 100644
--- a/weex_core/Source/android/jsengine/task/impl/native_timer_task.h
+++ b/weex_core/Source/android/jsengine/task/impl/native_timer_task.h
@@ -20,8 +20,8 @@
 // Created by Darin on 20/07/2018.
 //
 
-#ifndef WEEXV8_TIMERTASK_H
-#define WEEXV8_TIMERTASK_H
+#ifndef WEEXV8_NATIVE_TIMERTASK_H
+#define WEEXV8_NATIVE_TIMERTASK_H
 
 #include "android/jsengine/task/weex_task.h"
 
diff --git a/weex_core/Source/android/jsengine/task/timer_queue.cpp 
b/weex_core/Source/android/jsengine/task/timer_queue.cpp
index be4b4d7..c749a2b 100644
--- a/weex_core/Source/android/jsengine/task/timer_queue.cpp
+++ b/weex_core/Source/android/jsengine/task/timer_queue.cpp
@@ -21,6 +21,7 @@
 //
 
 #include "timer_queue.h"
+#include "android/jsengine/task/weex_task_queue.h"
 
 static void *startThread(void *td) {
     auto *self = static_cast<TimerQueue *>(td);
diff --git a/weex_core/Source/android/jsengine/task/timer_queue.h 
b/weex_core/Source/android/jsengine/task/timer_queue.h
index 51ece91..c185fd8 100644
--- a/weex_core/Source/android/jsengine/task/timer_queue.h
+++ b/weex_core/Source/android/jsengine/task/timer_queue.h
@@ -27,9 +27,10 @@
 #include <deque>
 
 #include "android/jsengine/task/timer_task.h"
-#include "android/jsengine/task/weex_task_queue.h"
+#include "base/utils/ThreadLocker.h"
 
 class TimerTask;
+class WeexTaskQueue;
 
 class TimerQueue {
 
diff --git a/weex_core/Source/android/jsengine/task/weex_task.h 
b/weex_core/Source/android/jsengine/task/weex_task.h
index b97eb0d..3b0eaaa 100644
--- a/weex_core/Source/android/jsengine/task/weex_task.h
+++ b/weex_core/Source/android/jsengine/task/weex_task.h
@@ -23,6 +23,7 @@
 #ifndef WEEXV8_WEEXTASK_H
 #define WEEXV8_WEEXTASK_H
 
+#include "base/time_calculator.h"
 #include "android/jsengine/weex_runtime.h"
 #include "base/utils/ThreadLocker.h"
 
@@ -53,11 +54,12 @@ public:
     explicit WeexTask(const String &instanceId, int taskId) : 
future_(nullptr), global_object_(nullptr) {
         this->instanceId = instanceId;
         this->taskId = taskId;
+        this->timeCalculator = new 
weex::base::TimeCalculator(weex::base::TaskPlatform::JSS_ENGINE, "", 
this->instanceId.utf8().data());
     };
 
     explicit WeexTask(const String &instanceId) : WeexTask(instanceId, 
genTaskId()) {};
 
-    virtual ~WeexTask() = default;
+    virtual ~WeexTask() {if(timeCalculator != nullptr) delete timeCalculator;};
 
     virtual void run(WeexRuntime *runtime) = 0;
     virtual std::string taskName() = 0;
@@ -78,6 +80,7 @@ public:
         global_object_ = global_object;
     }
 
+    weex::base::TimeCalculator *timeCalculator;
 private:
     Future* future_;
     WeexGlobalObject* global_object_;
diff --git a/weex_core/Source/android/jsengine/task/weex_task_queue.cpp 
b/weex_core/Source/android/jsengine/task/weex_task_queue.cpp
index 65a423d..6fe03ce 100644
--- a/weex_core/Source/android/jsengine/task/weex_task_queue.cpp
+++ b/weex_core/Source/android/jsengine/task/weex_task_queue.cpp
@@ -29,7 +29,10 @@
 #include "android/jsengine/object/weex_env.h"
 
 void WeexTaskQueue::run(WeexTask *task) {
+    task->timeCalculator->set_task_name(task->taskName());
+    task->timeCalculator->taskStart();
     task->run(weexRuntime);
+    task->timeCalculator->taskEnd();
     delete task;
 }
 
@@ -108,14 +111,13 @@ static void *startThread(void *td) {
     self->isInitOk = true;
 
     if (self->weexRuntime == nullptr) {
-        self->weexRuntime = new WeexRuntime(WeexEnv::getEnv()->scriptBridge(), 
self->isMultiProgress);
+        self->weexRuntime = new WeexRuntime(new 
TimerQueue(self),WeexEnv::getEnv()->scriptBridge(), self->isMultiProgress);
         // init IpcClient in Js Thread
-        if (self->isMultiProgress) {
-            auto *client = new 
WeexIPCClient(WeexEnv::getEnv()->getIpcClientFd());
-            static_cast<weex::bridge::js::CoreSideInMultiProcess 
*>(weex::bridge::js::ScriptBridgeInMultiProcess::Instance()->core_side())->set_ipc_client(
-                    client);
-        }
-        WeexEnv::getEnv()->setTimerQueue(new TimerQueue(self));
+//        if (self->isMultiProgress) {
+//            auto *client = new 
WeexIPCClient(WeexEnv::getEnv()->getIpcClientFd());
+//            static_cast<weex::bridge::js::CoreSideInMultiProcess 
*>(weex::bridge::js::ScriptBridgeInMultiProcess::Instance()->core_side())->set_ipc_client(
+//                    client);
+//        }
     }
 
     auto pTask = self->getTask();
diff --git a/weex_core/Source/android/jsengine/weex_ipc_server.cpp 
b/weex_core/Source/android/jsengine/weex_ipc_server.cpp
index 839a1cc..2593a5a 100644
--- a/weex_core/Source/android/jsengine/weex_ipc_server.cpp
+++ b/weex_core/Source/android/jsengine/weex_ipc_server.cpp
@@ -63,6 +63,16 @@ WeexJSServer::WeexJSServerImpl::WeexJSServerImpl(int 
serverFd, int clientFd, boo
     // initialize signal handler
     crashHandler.reset(new CrashHandlerInfo(crashFileName));
     crashHandler->initializeCrashHandler();
+
+    WeexEnv::getEnv()->m_back_to_weex_core_thread.reset(new 
BackToWeexCoreQueue());
+    WeexEnv::getEnv()->m_back_to_weex_core_thread.get()->init();
+
+    auto pQueue = WeexEnv::getEnv()->m_back_to_weex_core_thread.get();
+    while (!pQueue->isInitOk) {
+        continue;
+    }
+
+    //WeexEnv::getEnv()->initJSC(true);
 }
 
 WeexJSServer::WeexJSServer(int serverFd, int clientFd, bool enableTrace, 
std::string crashFileName)
diff --git a/weex_core/Source/android/jsengine/weex_runtime.cpp 
b/weex_core/Source/android/jsengine/weex_runtime.cpp
index 6238a18..e908cdc 100644
--- a/weex_core/Source/android/jsengine/weex_runtime.cpp
+++ b/weex_core/Source/android/jsengine/weex_runtime.cpp
@@ -33,12 +33,27 @@ using namespace WTF;
 using namespace WEEXICU;
 
 
-WeexRuntime::WeexRuntime(bool isMultiProgress) : 
is_multi_process_(isMultiProgress), script_bridge_(nullptr) {
-    weexObjectHolder.reset(new WeexObjectHolder(isMultiProgress));
+WeexRuntime::WeexRuntime(TimerQueue* timeQueue,bool isMultiProgress) : 
is_multi_process_(isMultiProgress), script_bridge_(nullptr) {
+    if (!WEEXICU::initICUEnv(isMultiProgress)) {
+        LOGE("failed to init ICUEnv single process");
+        // return false;
+    }
+
+    Options::enableRestrictedOptions(true);
+// Initialize JSC before getting VM.
+    WTF::initializeMainThread();
+    initHeapTimer();
+    JSC::initializeThreading();
+#if ENABLE(WEBASSEMBLY)
+    JSC::Wasm::enableFastMemory();
+#endif
+    m_globalVM = std::move(VM::create(LargeHeap));
+
+    weexObjectHolder.reset(new WeexObjectHolder(m_globalVM.get(), timeQueue, 
isMultiProgress));
     LOGE("WeexRuntime is running and mode is %s", isMultiProgress ? 
"multiProcess" : "singleProcess");
 }
 
-WeexRuntime::WeexRuntime(WeexCore::ScriptBridge *script_bridge, bool 
isMultiProgress) : WeexRuntime(isMultiProgress) {
+WeexRuntime::WeexRuntime(TimerQueue* timeQueue, WeexCore::ScriptBridge 
*script_bridge, bool isMultiProgress) : WeexRuntime(timeQueue, isMultiProgress) 
{
     this->script_bridge_ = script_bridge;
 }
 
@@ -65,7 +80,7 @@ int WeexRuntime::initAppFrameworkMultiProcess(const String 
&instanceId, const St
                                               IPCArguments *arguments) {
     auto pHolder = getLightAppObjectHolder(instanceId);
     if (pHolder == nullptr) {
-        auto holder = new WeexObjectHolder(true);
+        auto holder = new WeexObjectHolder(this->m_globalVM.get(), 
weexObjectHolder->timeQueue, true);
         holder->initFromIPCArguments(arguments, 2, true);
         appWorkerContextHolderMap[instanceId.utf8().data()] = holder;
     }
@@ -79,7 +94,7 @@ int WeexRuntime::initAppFramework(const String &instanceId, 
const String &appFra
     auto pHolder = getLightAppObjectHolder(instanceId);
     LOGE("Weex jsserver initAppFramework %s",instanceId.utf8().data());
     if (pHolder == nullptr) {
-        auto holder = new WeexObjectHolder(is_multi_process_);
+        auto holder = new WeexObjectHolder(this->m_globalVM.get(), 
weexObjectHolder->timeQueue, is_multi_process_);
         holder->initFromParams(params, true);
         LOGE("Weex jsserver initAppFramework pHolder == null and id 
%s",instanceId.utf8().data());
         appWorkerContextHolderMap[instanceId.utf8().data()] = holder;
@@ -88,8 +103,7 @@ int WeexRuntime::initAppFramework(const String &instanceId, 
const String &appFra
 }
 
 int WeexRuntime::_initAppFramework(const String &instanceId, const String 
&appFramework) {
-  VM &vm = VM::sharedInstance();
-  JSLockHolder locker_global(&vm);
+  JSLockHolder locker_global(this->m_globalVM.get());
 
   auto appWorkerObjectHolder = getLightAppObjectHolder(instanceId);
   if (appWorkerObjectHolder == nullptr) {
@@ -141,20 +155,19 @@ int WeexRuntime::createAppContext(const String 
&instanceId, const String &jsBund
           return static_cast<int32_t>(false);
         }
 
-        VM &vm_global = VM::sharedInstance();
-        JSLockHolder locker_global(&vm_global);
+        JSLockHolder locker_global(this->m_globalVM.get());
 
-        WeexGlobalObject *app_globalObject = 
appWorkerObjectHolder->cloneWeexObject(true, true);
+        WeexGlobalObject *app_globalObject = 
appWorkerObjectHolder->cloneWeexObject(final_instanceId.utf8().data(),true, 
true);
         weex::GlobalObjectDelegate *delegate = NULL;
         app_globalObject->SetScriptBridge(script_bridge_);
-        VM &vm = worker_globalObject->vm();
-
-        JSLockHolder locker_1(&vm);
-
-        VM &thisVm = app_globalObject->vm();
-        JSLockHolder locker_2(&thisVm);
-
-        PropertyName createInstanceContextProperty(Identifier::fromString(&vm, 
get_context_fun_name));
+//        VM &vm = worker_globalObject->vm();
+//
+//        JSLockHolder locker_1(&vm);
+//
+//        VM &thisVm = app_globalObject->vm();
+//        JSLockHolder locker_2(&thisVm);
+//
+        PropertyName 
createInstanceContextProperty(Identifier::fromString(this->m_globalVM.get(), 
get_context_fun_name));
         ExecState *state = worker_globalObject->globalExec();
         JSValue createInstanceContextFunction = 
worker_globalObject->get(state, createInstanceContextProperty);
         MarkedArgumentBuffer args;
@@ -168,7 +181,7 @@ int WeexRuntime::createAppContext(const String &instanceId, 
const String &jsBund
             String exceptionInfo = exceptionToString(worker_globalObject, 
returnedException->value());
             return static_cast<int32_t>(false);
         }
-        app_globalObject->resetPrototype(vm, ret);
+        app_globalObject->resetPrototype(*(this->m_globalVM.get()), ret);
         app_globalObject->id = final_instanceId.utf8().data();
         // --------------------------------------------------
 
@@ -205,17 +218,14 @@ WeexRuntime::callJSOnAppContext(const String &instanceId, 
const String &func, st
             return static_cast<int32_t>(false);
         }
 //        LOGE("Weex jsserver IPCJSMsg::CALLJSONAPPCONTEXT1");
-        VM &vm_global = VM::sharedInstance();
-        JSLockHolder locker_global(&vm_global);
+        JSLockHolder locker_global(this->m_globalVM.get());
 
-        VM &vm = worker_globalObject->vm();
-        JSLockHolder locker(&vm);
 //        LOGE("Weex jsserver IPCJSMsg::CALLJSONAPPCONTEXT2");
         MarkedArgumentBuffer obj;
         ExecState *state = worker_globalObject->globalExec();
         _getArgListFromJSParams(&obj, state, params);
 //        LOGE("Weex jsserver IPCJSMsg::CALLJSONAPPCONTEXT3");
-        Identifier funcIdentifier = Identifier::fromString(&vm, func);
+        Identifier funcIdentifier = 
Identifier::fromString(this->m_globalVM.get(), func);
 
         JSValue function;
         JSValue result;
@@ -261,17 +271,14 @@ int WeexRuntime::callJSOnAppContext(IPCArguments 
*arguments) {
             return static_cast<int32_t>(false);
         }
 //        LOGE("Weex jsserver IPCJSMsg::CALLJSONAPPCONTEXT1");
-        VM &vm_global = VM::sharedInstance();
-        JSLockHolder locker_global(&vm_global);
 
-        VM &vm = worker_globalObject->vm();
-        JSLockHolder locker(&vm);
+        JSLockHolder locker(this->m_globalVM.get());
         // LOGE("Weex jsserver IPCJSMsg::CALLJSONAPPCONTEXT2");
         MarkedArgumentBuffer obj;
         ExecState *state = worker_globalObject->globalExec();
         _getArgListFromIPCArguments(&obj, state, arguments, 2);
         // LOGE("Weex jsserver IPCJSMsg::CALLJSONAPPCONTEXT3");
-        Identifier funcIdentifier = Identifier::fromString(&vm, func);
+        Identifier funcIdentifier = 
Identifier::fromString(this->m_globalVM.get(), func);
 
         JSValue function;
         JSValue result;
@@ -309,7 +316,8 @@ int WeexRuntime::destroyAppContext(const String 
&instanceId) {
         objectMap.erase(instanceId.utf8().data());
     }
 
-    WeexEnv::getEnv()->timerQueue()->destroyPageTimer(instanceId);
+    if(appWorkerObjectHolder->timeQueue != nullptr)
+        
appWorkerObjectHolder->timeQueue->destroyPageTimer(instanceId.utf8().data());
 
     // GC on VM
 //    WeexGlobalObject* instanceGlobalObject = 
mAppInstanceGlobalObjectMap[instanceId.utf8().data()];
@@ -342,8 +350,7 @@ int WeexRuntime::exeJsService(const String &source) {
 //        JSLockHolder locker_global(&vm_global);
 //    }
     JSGlobalObject *globalObject = weexObjectHolder->m_globalObject.get();
-    VM &vm = globalObject->vm();
-    JSLockHolder locker(&vm);
+    JSLockHolder locker(this->m_globalVM.get());
     if (!ExecuteJavaScript(globalObject, source, ("weex service"), true, 
"execjsservice")) {
         LOGE("jsLog JNI_Error >>> scriptStr :%s", source.utf8().data());
         return static_cast<int32_t>(false);
@@ -355,8 +362,7 @@ int WeexRuntime::exeCTimeCallback(const String &source) {
     base::debug::TraceScope traceScope("weex", "EXECTIMERCALLBACK");
 //    LOGE("IPC EXECTIMERCALLBACK and ExecuteJavaScript");
     JSGlobalObject *globalObject = weexObjectHolder->m_globalObject.get();
-    VM &vm = globalObject->vm();
-    JSLockHolder locker(&vm);
+    JSLockHolder locker(this->m_globalVM.get());
     if (!ExecuteJavaScript(globalObject, source, ("weex service"), false, 
"timercallback")) {
         LOGE("jsLog EXECTIMERCALLBACK >>> scriptStr :%s", 
source.utf8().data());
         return static_cast<int32_t>(false);
@@ -367,10 +373,9 @@ int WeexRuntime::exeCTimeCallback(const String &source) {
 
 int WeexRuntime::exeJS(const String &instanceId, const String &nameSpace, 
const String &func,
                        std::vector<VALUE_WITH_TYPE *> &params) {
-    //LOGE("jsengine shopp EXECJS func:%s and params size is %d", 
func.utf8().data(), params.size());
+//    LOGE("dyyLog EXECJS func:%s and params size is %d", func.utf8().data(), 
params.size());
 
     String runFunc = func;
-
     JSGlobalObject *globalObject;
     // fix instanceof Object error
     // if function is callJs on instance, should us Instance object to call 
__WEEX_CALL_JAVASCRIPT__
@@ -386,8 +391,7 @@ int WeexRuntime::exeJS(const String &instanceId, const 
String &nameSpace, const
     } else {
         globalObject = weexObjectHolder->m_globalObject.get();
     }
-    VM &vm = globalObject->vm();
-    JSLockHolder locker(&vm);
+    JSLockHolder locker(this->m_globalVM.get());
 //    if (weexLiteAppObjectHolder.get() != nullptr) {
 //        VM & vm_global = *weexLiteAppObjectHolder->m_globalVM.get();
 //        JSLockHolder locker_global(&vm_global);
@@ -398,14 +402,14 @@ int WeexRuntime::exeJS(const String &instanceId, const 
String &nameSpace, const
     ExecState *state = globalObject->globalExec();
     _getArgListFromJSParams(&obj, state, params);
 
-    Identifier funcIdentifier = Identifier::fromString(&vm, runFunc);
+    Identifier funcIdentifier = Identifier::fromString(this->m_globalVM.get(), 
runFunc);
 
     JSValue function;
     JSValue result;
     if (nameSpace.isEmpty()) {
         function = globalObject->get(state, funcIdentifier);
     } else {
-        Identifier namespaceIdentifier = Identifier::fromString(&vm, 
nameSpace);
+        Identifier namespaceIdentifier = 
Identifier::fromString(this->m_globalVM.get(), nameSpace);
         JSValue master = globalObject->get(state, namespaceIdentifier);
         if (!master.isObject()) {
             return static_cast<int32_t>(false);
@@ -417,7 +421,7 @@ int WeexRuntime::exeJS(const String &instanceId, const 
String &nameSpace, const
     NakedPtr<Exception> returnedException;
     JSValue ret = call(state, function, callType, callData, globalObject, obj, 
returnedException);
 
-    vm.drainMicrotasks();
+    this->m_globalVM.get()->drainMicrotasks();
 
 
     if (returnedException) {
@@ -584,7 +588,8 @@ int WeexRuntime::destroyInstance(const String &instanceId) {
     // LOGE("DestoryInstance map 11 length:%d", 
weexObjectHolder->m_jsGlobalObjectMap.size());
     
weexObjectHolder->m_jsInstanceGlobalObjectMap.erase(instanceId.utf8().data());
     // LOGE("DestoryInstance map 22 length:%d", 
weexObjectHolder->m_jsGlobalObjectMap.size());
-    
WeexEnv::getEnv()->timerQueue()->destroyPageTimer(instanceId.utf8().data());
+    if(weexObjectHolder->timeQueue != nullptr)
+    weexObjectHolder->timeQueue->destroyPageTimer(instanceId.utf8().data());
     // release JSGlobalContextRelease
     // when instanceId % 20 == 0 GC
     bool needGc = false;
@@ -601,8 +606,9 @@ int WeexRuntime::destroyInstance(const String &instanceId) {
       VM &vm = exec->vm();
       globalObject->resetPrototype(vm, jsNull());
       bool protectCountIsZero = 
Heap::heap(exec->vmEntryGlobalObject())->unprotect(exec->vmEntryGlobalObject());
-      vm.heap.reportAbandonedObjectGraph();                                  
+      vm.heap.reportAbandonedObjectGraph();
       
//vm.heap.collectSync(CollectionScope::Full);//collectAllGarbage();//collectAsync(CollectionScope::Full);
+      //TODO disable gc temporary
       vm.heap.collectAllGarbage();
     }
 
@@ -632,6 +638,7 @@ int WeexRuntime::createInstance(const String &instanceId, 
const String &func, co
                                 const String &initData,
                                 const String &extendsApi,
                                 std::vector<INIT_FRAMEWORK_PARAMS*>& params) {
+
     JSGlobalObject *impl_globalObject = weexObjectHolder->m_globalObject.get();
     JSGlobalObject *globalObject;
     if (instanceId == "") {
@@ -647,11 +654,10 @@ int WeexRuntime::createInstance(const String &instanceId, 
const String &func, co
 //                JSLockHolder locker_global(&vm_global);
 //            }
 
-            temp_object = weexObjectHolder->cloneWeexObject(true, false);
+            temp_object = 
weexObjectHolder->cloneWeexObject(instanceId.utf8().data(), true, false);
             VM &vm = temp_object->vm();
             JSLockHolder locker(&vm);
             temp_object->addExtraOptions(params);
-            temp_object->id = instanceId.utf8().data();
             temp_object->SetScriptBridge(script_bridge_);
 
 
@@ -689,12 +695,35 @@ int WeexRuntime::createInstance(const String &instanceId, 
const String &func, co
             // use it to set Vue prototype to instance context
             JSObject *object = ret.toObject(state, temp_object);
             JSObjectRef ref = toRef(object);
-            JSGlobalContextRef contextRef = toGlobalRef(state);
-            JSValueRef vueRef = JSObjectGetProperty(contextRef, ref, 
JSStringCreateWithUTF8CString("Vue"), nullptr);
+            JSGlobalContextRef globalContextRef = toGlobalRef(state);
+            JSGlobalContextRef instanceContextRef = 
toGlobalRef(temp_object->globalExec());
+            auto instanceGlobalObject = 
JSContextGetGlobalObject(instanceContextRef);
+            auto pArray = JSObjectCopyPropertyNames(globalContextRef, ref);
+            size_t keyCount = JSPropertyNameArrayGetCount(pArray);
+//            LOGE("dyyLog instance create and id is %s, and time is %lld, 
currentThread is %u", instanceId.utf8().data(), microTime(), pthread_self());
+            for (size_t i = 0; i < keyCount; ++i) {
+                auto propertyName_ = JSPropertyNameArrayGetNameAtIndex(pArray, 
i);
+                auto propertyValue_ = JSObjectGetProperty(globalContextRef, 
ref, propertyName_, NULL);
+                if(propertyValue_ == nullptr) {
+                    LOGE("dyy create instance propertyValue_ == null");
+                    continue;
+                }
+
+                if(propertyName_ == nullptr) {
+                    LOGE("dyy create instance propertyName_ == null");
+                    continue;
+                }
+
+                JSObjectSetProperty(instanceContextRef, instanceGlobalObject, 
propertyName_, propertyValue_, 0, NULL);
+            }
+
+
+
+            JSValueRef vueRef = JSObjectGetProperty(globalContextRef, ref, 
JSStringCreateWithUTF8CString("Vue"), nullptr);
             if (vueRef != nullptr) {
-                JSObjectRef vueObject = JSValueToObject(contextRef, vueRef, 
nullptr);
+                JSObjectRef vueObject = JSValueToObject(globalContextRef, 
vueRef, nullptr);
                 if (vueObject != nullptr) {
-                    JSGlobalContextRef instanceContextRef = 
toGlobalRef(temp_object->globalExec());
+
                     JSObjectSetPrototype(instanceContextRef, vueObject,
                                          
JSObjectGetPrototype(instanceContextRef,
                                                               
JSContextGetGlobalObject(instanceContextRef)));
@@ -702,7 +731,7 @@ int WeexRuntime::createInstance(const String &instanceId, 
const String &func, co
             }
             //-------------------------------------------------
 
-            temp_object->resetPrototype(vm, ret);
+//            temp_object->resetPrototype(vm, ret);
             
weexObjectHolder->m_jsInstanceGlobalObjectMap[instanceId.utf8().data()] = 
temp_object;
 //            LOGE("create Instance instanceId.utf8().data() 
%s",instanceId.utf8().data());
             // -----------------------------------------
@@ -741,8 +770,7 @@ int WeexRuntime::createInstance(const String &instanceId, 
const String &func, co
 }
 
 int WeexRuntime::_initFramework(const String &source) {
-    VM &vm = VM::sharedInstance();
-    JSLockHolder locker(&vm);
+    JSLockHolder locker(this->m_globalVM.get());
 
     auto globalObject = weexObjectHolder->m_globalObject.get();
     globalObject->SetScriptBridge(script_bridge_);
@@ -793,16 +821,25 @@ 
WeexRuntime::_getArgListFromIPCArguments(MarkedArgumentBuffer *obj, ExecState *s
 
 void WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState 
*state,
                                           std::vector<VALUE_WITH_TYPE *> 
&params) {
+
+    //dyyLog delete
+//    String msg = "exejs Args ";
+
     for (unsigned int i = 0; i < params.size(); i++) {
         VALUE_WITH_TYPE *paramsObject = params[i];
         switch (paramsObject->type) {
             case ParamsType::DOUBLE:
                 obj->append(jsNumber(paramsObject->value.doubleValue));
+//                msg.append(":");
+//                
msg.append(std::to_string(paramsObject->value.doubleValue).c_str());
                 break;
             case ParamsType::STRING: {
                 WeexString *ipcstr = paramsObject->value.string;
                 const String &string2String = weexString2String(ipcstr);
                 obj->append(jString2JSValue(state, ipcstr->content, 
ipcstr->length));
+
+//                msg.append(":");
+//                msg.append(string2String.utf8().data());
             }
                 break;
             case ParamsType::JSONSTRING: {
@@ -811,12 +848,19 @@ void 
WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *
                 String str = jString2String(ipcstr->content, ipcstr->length);
                 JSValue o = parseToObject(state, str);
                 obj->append(o);
+
+//                msg.append(":");
+//                msg.append(str.utf8().data());
             }
                 break;
             case ParamsType::BYTEARRAY: {
                 const WeexByteArray *array = paramsObject->value.byteArray;
                 JSValue o = wson::toJSValue(state, (void *) array->content, 
array->length);
+
                 obj->append(o);
+
+//                msg.append(":");
+//                msg.append(JSONStringify(state, o, 0).utf8().data());
             }
                 break;
             default:
@@ -824,6 +868,8 @@ void 
WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *
                 break;
         }
     }
+
+//    LOGE("dyyLog exejs Args is %s", msg.utf8().data());
 }
 
 WeexObjectHolder *WeexRuntime::getLightAppObjectHolder(const String 
&instanceId) {
@@ -857,7 +903,6 @@ int WeexRuntime::exeTimerFunction(const String &instanceId, 
uint32_t timerFuncti
     }
 
     ArgList a;
-
     JSValue ret = call(globalObject->globalExec(), value, callType, callData, 
globalObject, a, returnedException);
     uint64_t end = microTime();
 
diff --git a/weex_core/Source/android/jsengine/weex_runtime.h 
b/weex_core/Source/android/jsengine/weex_runtime.h
index 680411c..37f1dbf 100644
--- a/weex_core/Source/android/jsengine/weex_runtime.h
+++ b/weex_core/Source/android/jsengine/weex_runtime.h
@@ -23,6 +23,7 @@
 #ifndef WEEXV8_JSRUNTIME_H
 #define WEEXV8_JSRUNTIME_H
 
+#include "android/jsengine/task/timer_queue.h"
 #include "android/jsengine/object/weex_object_holder.h"
 #include "android/jsengine/weex_ipc_client.h"
 
@@ -36,9 +37,11 @@ public:
     std::unique_ptr<WeexObjectHolder> weexObjectHolder;
     std::map<std::string, WeexObjectHolder *> appWorkerContextHolderMap;
 
-    explicit WeexRuntime(bool isMultiProgress = true);
+    RefPtr<VM> m_globalVM;
 
-    explicit WeexRuntime(WeexCore::ScriptBridge *script_bridge, bool 
isMultiProgress = true);
+  explicit WeexRuntime(TimerQueue* timeQueue, bool isMultiProgress = true);
+
+    explicit WeexRuntime(TimerQueue* timeQueue, WeexCore::ScriptBridge 
*script_bridge, bool isMultiProgress = true);
 
     bool hasInstanceId(String &id);
 
diff --git a/weex_core/Source/base/CMakeLists.txt 
b/weex_core/Source/base/CMakeLists.txt
index 737aa9e..78c424e 100644
--- a/weex_core/Source/base/CMakeLists.txt
+++ b/weex_core/Source/base/CMakeLists.txt
@@ -7,6 +7,7 @@ set(${BASE_LIBRARY_NAME}_SOURCES
     common.h
     closure.h
     make_copyable.h
+    time_calculator.h
     time_point.h
     time_point.cc
     time_unit.h
diff --git a/weex_core/Source/base/android/log_utils.h 
b/weex_core/Source/base/android/log_utils.h
index b398194..52b6cf1 100644
--- a/weex_core/Source/base/android/log_utils.h
+++ b/weex_core/Source/base/android/log_utils.h
@@ -35,7 +35,7 @@
 
 #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__)
+#define LOGD(...)    ((void)0)//__android_log_print(ANDROID_LOG_DEBUG, 
LOG_TAG, __VA_ARGS__)
 
 #endif
 //#define DEBUG
@@ -53,7 +53,7 @@
 #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 LOGD(...)      ((void)0)//__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__)
diff --git a/weex_core/Source/base/log_defines.h 
b/weex_core/Source/base/log_defines.h
index d1f78d8..abf6e05 100644
--- a/weex_core/Source/base/log_defines.h
+++ b/weex_core/Source/base/log_defines.h
@@ -27,8 +27,8 @@
 #include <android/log.h>
 
 #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__)
+#define LOGA(...)    ((void)0) //__android_log_print(ANDROID_LOG_DEBUG, 
LOG_TAG, __VA_ARGS__)
+#define LOGD(...)    ((void)0) //__android_log_print(ANDROID_LOG_DEBUG, 
LOG_TAG, __VA_ARGS__)
 
 #ifdef DEBUG
 
diff --git a/weex_core/Source/base/time_calculator.h 
b/weex_core/Source/base/time_calculator.h
new file mode 100644
index 0000000..5a91306
--- /dev/null
+++ b/weex_core/Source/base/time_calculator.h
@@ -0,0 +1,143 @@
+/**
+ * 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.
+ */
+//
+// Created by 董亚运 on 2019/1/14.
+//
+
+#ifndef WEEX_PROJECT_TIME_CALCULATOR_H
+#define WEEX_PROJECT_TIME_CALCULATOR_H
+
+#include <string>
+#include "time_point.h"
+#include "time_unit.h"
+#include "android/log_utils.h"
+
+namespace weex {
+namespace base {
+enum TaskPlatform {
+  WEEXCORE,
+  JSS_ENGINE
+};
+
+class TimeCalculator {
+ public:
+  TimeCalculator(TaskPlatform taskPlatform, std::string name, std::string id) :
+      task_name(name),
+      instance_id(id),
+      end(TimePoint::Now()),
+      start(TimePoint::Now()),
+      task_end(TimePoint::Now()),
+      task_start(TimePoint::Now()),
+      task_id(genTaskId()) {
+    if (taskPlatform == TaskPlatform::JSS_ENGINE) {
+      task_platform = "jsengine";
+    } else {
+      task_platform = "weexcore";
+    }
+  }
+
+  int genTaskId() {
+    static int taskIdGenerator = 0;
+    return __sync_fetch_and_add(&taskIdGenerator, 1);
+  }
+
+  ~TimeCalculator() {
+    if (!task_end_flag) {
+      task_end = TimePoint::Now();
+    }
+    end = TimePoint::Now();
+    print();
+  }
+
+  void taskStart() {
+//    LOGE(
+//        "dyyLog %s taskName is %s : instanceId %s : task_id %d: taskStart",
+//        task_platform.c_str(),
+//        task_name.c_str(),
+//        instance_id.c_str(),
+//        task_id);
+    this->task_start = TimePoint::Now();
+  }
+
+  void taskEnd() {
+//    LOGE(
+//        "dyyLog %s taskName is %s : instanceId %s : task_id %d: taskEnd",
+//        task_platform.c_str(),
+//        task_name.c_str(),
+//        instance_id.c_str(),
+//        task_id);
+    this->task_end = TimePoint::Now();
+    task_end_flag = true;
+  }
+
+  void set_task_name(std::string name) {
+    this->task_name = name;
+  }
+
+  void print() {
+    const TimeUnit &allCost = end.ToTimeUnit() - start.ToTimeUnit();
+    const TimeUnit &taskWait = task_start.ToTimeUnit() - start.ToTimeUnit();
+    const TimeUnit &taskCost = task_end.ToTimeUnit() - task_start.ToTimeUnit();
+
+//    int64_t taskCostMS = taskCost.ToMilliseconds();
+//    if (taskCostMS < 5) {
+//      LOGD("dyyLog %s taskName is %s cost less than 5ms", 
task_platform.c_str(),
+//           task_name.c_str());
+//    } else {
+//      std::string msg = "normal";
+//
+//      if (taskCostMS > 100) {
+//        msg = "task cost than 100, ";
+//      }
+//
+//      if (taskWait.ToMilliseconds() > 100) {
+//        std::string a = "wait to long time than 100ms";
+//        msg += a;
+//      }
+//
+//      LOGE(
+//          "dyyLog %s taskName is %s : instanceId %s : task_id %d: start : 
%lld  ---  end : %lld  ---  allCost:%lld  ---  taskCost:%lld  ---  
taskWait:%lld --- msg:%s",
+//          task_platform.c_str(),
+//          task_name.c_str(),
+//          instance_id.c_str(),
+//          task_id,
+//          start.ToTimeUnit().ToMilliseconds(),
+//          end.ToTimeUnit().ToMilliseconds(),
+//          allCost.ToMilliseconds(),
+//          taskCostMS,
+//          taskWait.ToMilliseconds(),
+//          msg.c_str());
+//    }
+  }
+
+ private:
+  std::string task_name;
+  int task_id;
+  std::string instance_id;
+  TimePoint start;
+  TimePoint end;
+  TimePoint task_start;
+  TimePoint task_end;
+  bool task_end_flag = false;
+  std::string task_platform;
+};
+}  // namespace base
+}  // namespace weex
+
+#endif //WEEX_PROJECT_TIME_CALCULATOR_H
diff --git a/weex_core/Source/base/utils/log_utils.h 
b/weex_core/Source/base/utils/log_utils.h
index 4b5607b..1967faf 100644
--- a/weex_core/Source/base/utils/log_utils.h
+++ b/weex_core/Source/base/utils/log_utils.h
@@ -24,13 +24,13 @@
 #define LOG_TAG "jsengine"
 
 #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 LOGA(...)      ((void)0)//__android_log_print(ANDROID_LOG_DEBUG, 
LOG_TAG, __VA_ARGS__)
 //#define DEBUG
 
 #ifdef DEBUG
 
 #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 LOGD(...)      ((void)0)//__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__)
diff --git a/weex_core/Source/core/bridge/script/core_side_in_script.cpp 
b/weex_core/Source/core/bridge/script/core_side_in_script.cpp
index 68085a0..e0bbd40 100644
--- a/weex_core/Source/core/bridge/script/core_side_in_script.cpp
+++ b/weex_core/Source/core/bridge/script/core_side_in_script.cpp
@@ -26,7 +26,9 @@
 #include "core/data_render/vnode/vnode_render_manager.h"
 #include "core/manager/weex_core_manager.h"
 #include "core/render/manager/render_manager.h"
+#include "wson/wson_parser.h"
 #ifdef OS_ANDROID
+#include <base/time_calculator.h>
 #include "android/weex_extend_js_api.h"
 #endif
 
@@ -125,6 +127,14 @@ void CoreSideInScript::CallNativeComponent(const char 
*page_id, const char *ref,
 void CoreSideInScript::AddElement(const char *page_id, const char *parent_ref,
                                   const char *dom_str, int dom_str_length,
                                   const char *index_str) {
+
+  
+//  std::string msg = "AddElement :";
+//  wson_parser parser(dom_str);
+//  msg.append(parser.toStringUTF8().c_str());
+//
+//  weex::base::TimeCalculator 
timeCalculator(weex::base::TaskPlatform::WEEXCORE, msg.c_str(), page_id);
+
   const char *indexChar = index_str == nullptr ? "\0" : index_str;
   int index = atoi(indexChar);
   if (page_id == nullptr || parent_ref == nullptr || dom_str == nullptr ||
@@ -432,7 +442,7 @@ void CoreSideInScript::ReportException(const char *page_id, 
const char *func,
 }
 
 void CoreSideInScript::SetJSVersion(const char *js_version) {
-  LOGA("init JSFrm version %s", js_version);
+  LOGD("init JSFrm version %s", js_version);
 
   //  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
   //      weex::base::MakeCopyable(

Reply via email to