You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by ky...@apache.org on 2018/05/10 07:40:21 UTC

[3/3] incubator-weex git commit: [WEEX-349][jsengine] Make weex core can run on single process mode

[WEEX-349][jsengine] Make weex core can run on single process mode

Since Weex core may fork multi process failed, so we make it can run
in single process when failed to run multi process.

Bug: WEEX-349


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

Branch: refs/heads/master
Commit: 547da26af5e3afd5af24a21f37fb89d5d7b4f0ed
Parents: c4a204e
Author: 东煜 <ya...@alibaba-inc.com>
Authored: Wed May 9 11:38:03 2018 +0800
Committer: YorkShen <sh...@gmail.com>
Committed: Thu May 10 15:39:51 2018 +0800

----------------------------------------------------------------------
 android/sdk/libs/armeabi/libweexjsc.so          |  Bin 1748292 -> 939976 bytes
 android/sdk/libs/armeabi/libweexjss.so          |  Bin 6801432 -> 3758900 bytes
 .../java/com/taobao/weex/WXSDKInstance.java     |    8 +
 .../weex/adapter/IWXUserTrackAdapter.java       |    8 +
 .../java/com/taobao/weex/bridge/WXBridge.java   |   30 +
 .../com/taobao/weex/bridge/WXBridgeManager.java |   27 +
 .../com/taobao/weex/bridge/WXModuleManager.java |   12 +-
 .../java/com/taobao/weex/bridge/WXParams.java   |   14 +
 .../java/com/taobao/weex/common/IWXBridge.java  |    1 +
 .../com/taobao/weex/common/WXErrorCode.java     |   18 +
 weex_core/Source/CMakeLists.txt                 |    3 +
 .../Source/android/base/string/string_utils.h   |    6 +
 .../jsengine/multiprocess/ExtendJSApi.cpp       |  182 +-
 .../android/jsengine/multiprocess/WeexProxy.cpp | 2402 +++++++++++-------
 .../android/jsengine/multiprocess/WeexProxy.h   |    9 +-
 weex_core/Source/core/api/WeexJSCoreApi.cpp     |  292 +++
 weex_core/Source/core/api/WeexJSCoreApi.h       |   86 +
 weex_core/Source/include/WeexApiHeader.h        |  214 ++
 18 files changed, 2241 insertions(+), 1071 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
index fb1b9a6..6fb838d 100644
Binary files a/android/sdk/libs/armeabi/libweexjsc.so and b/android/sdk/libs/armeabi/libweexjsc.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/libs/armeabi/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjss.so b/android/sdk/libs/armeabi/libweexjss.so
index dcd78cc..042e336 100755
Binary files a/android/sdk/libs/armeabi/libweexjss.so and b/android/sdk/libs/armeabi/libweexjss.so differ

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index d54d23c..682e9f2 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -182,6 +182,14 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
   }
 
   /**
+   * set make weexCore run in single process mode
+   * @param flag true means weexCore run in single process mode or multi process mode
+   */
+  public void setUseSingleProcess(boolean flag) {
+    WXBridgeManager.getInstance().setUseSingleProcess(flag);
+  }
+
+  /**
    * set open SandBox
    * @param flag
    */

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXUserTrackAdapter.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXUserTrackAdapter.java b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXUserTrackAdapter.java
index 604b461..ec6be03 100644
--- a/android/sdk/src/main/java/com/taobao/weex/adapter/IWXUserTrackAdapter.java
+++ b/android/sdk/src/main/java/com/taobao/weex/adapter/IWXUserTrackAdapter.java
@@ -42,6 +42,14 @@ public interface IWXUserTrackAdapter {
   String JS_BRIDGE = "jsBridge";
   String STREAM_MODULE = "streamModule";
   String INVOKE_MODULE = "invokeModule";
+  String INIT_FRAMEWORK = "initFramework";
+
+  /**
+   * monitor keys
+   */
+  String MONITOR_ERROR_CODE = "errCode";
+  String MONITOR_ARG = "arg";
+  String MONITOR_ERROR_MSG = "errMsg";
 
   void commit(Context context, String eventId, String type, WXPerformance perf, Map<String, Serializable> params);
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index a0023f5..667d8e0 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -27,13 +27,18 @@ import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXUserTrackAdapter;
 import com.taobao.weex.common.IWXBridge;
+import com.taobao.weex.common.WXErrorCode;
 import com.taobao.weex.dom.CSSShorthand;
 import com.taobao.weex.layout.ContentBoxMeasurement;
+import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXLogUtils;
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 
 /**
  * Communication interface for Java code and JavaScript code.
@@ -584,4 +589,29 @@ public class WXBridge implements IWXBridge {
   public void setViewPortWidth(String instanceId, float value) {
     nativeSetViewPortWidth(instanceId, value);
   }
+
+  public void reportNativeInitStatus(String statusCode, String errorMsg) {
+    if (WXErrorCode.WX_JS_FRAMEWORK_INIT_SINGLE_PROCESS_SUCCESS.getErrorCode().equals(statusCode)
+            || WXErrorCode.WX_JS_FRAMEWORK_INIT_FAILED.getErrorCode().equals(statusCode)) {
+      IWXUserTrackAdapter userTrackAdapter = WXSDKManager.getInstance().getIWXUserTrackAdapter();
+      if (userTrackAdapter != null) {
+        Map<String, Serializable> params = new HashMap<>(3);
+        params.put(IWXUserTrackAdapter.MONITOR_ERROR_CODE, statusCode);
+        params.put(IWXUserTrackAdapter.MONITOR_ARG, "InitFrameworkNativeError");
+        params.put(IWXUserTrackAdapter.MONITOR_ERROR_MSG, errorMsg);
+        Log.e("Dyy", "reportNativeInitStatus is running and errorCode is " + statusCode + " And errorMsg is " + errorMsg);
+        userTrackAdapter.commit(null, null, IWXUserTrackAdapter.INIT_FRAMEWORK, null, params);
+      }
+
+      return;
+    }
+
+    for (WXErrorCode e : WXErrorCode.values()) {
+      if (e.getErrorType().equals(WXErrorCode.ErrorType.NATIVE_ERROR)
+              && e.getErrorCode().equals(statusCode)) {
+        WXExceptionUtils.commitCriticalExceptionRT(null, e, "initFramework", errorMsg, null);
+        break;
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index 219ad11..ea27602 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -30,6 +30,7 @@ import android.support.annotation.Nullable;
 import android.support.annotation.UiThread;
 import android.support.v4.util.ArrayMap;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -37,6 +38,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKEngine;
 import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.WXSDKManager;
 import com.taobao.weex.adapter.IWXJSExceptionAdapter;
@@ -71,6 +73,7 @@ import com.taobao.weex.ui.action.GraphicActionUpdateAttr;
 import com.taobao.weex.ui.action.GraphicActionUpdateStyle;
 import com.taobao.weex.ui.action.GraphicPosition;
 import com.taobao.weex.ui.action.GraphicSize;
+import com.taobao.weex.ui.component.WXComponent;
 import com.taobao.weex.ui.module.WXDomModule;
 import com.taobao.weex.utils.WXExceptionUtils;
 import com.taobao.weex.utils.WXFileUtils;
@@ -174,6 +177,10 @@ public class WXBridgeManager implements Callback, BactchExecutor {
   // if true will open weex sandbox for multi context
   private volatile static boolean isSandBoxContext = true;
 
+  // add for cloud setting, default value is false.
+  // weexcore use single process or not
+  private static boolean isUseSingleProcess = false;
+
   private enum BundType {
     Vue,
     Rax,
@@ -234,6 +241,25 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     return mBridgeManager;
   }
 
+  public void setUseSingleProcess(final boolean flag) {
+    if (flag != isUseSingleProcess) {
+      isUseSingleProcess = flag;
+//      //we should reinit framework if js framework has been initialized
+//      if (isJSFrameworkInit()) {
+//        if (isJSThread()) {
+//          WXSDKEngine.reload();
+//        } else {
+//          post(new Runnable() {
+//            @Override
+//            public void run() {
+//              WXSDKEngine.reload();
+//            }
+//          });
+//        }
+//      }
+    }
+  }
+
   public void setSandBoxContext(final boolean flag) {
     if (flag != isSandBoxContext) {
       isSandBoxContext = flag;
@@ -1793,6 +1819,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     wxParams.setDeviceModel(config.get(WXConfig.sysModel));
     wxParams.setShouldInfoCollect(config.get("infoCollect"));
     wxParams.setLogLevel(config.get(WXConfig.logLevel));
+    wxParams.setUseSingleProcess(isUseSingleProcess ? "true" : "false");
     String appName = config.get(WXConfig.appName);
     if (!TextUtils.isEmpty(appName)) {
       wxParams.setAppName(appName);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
index 3ee0b87..c13a442 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXModuleManager.java
@@ -59,12 +59,6 @@ public class WXModuleManager {
   private static Map<String, WXModule> sGlobalModuleMap = new HashMap<>();
   private static Map<String, WXDomModule> sDomModuleMap = new HashMap<>();
 
-  /**
-   * monitor keys
-   */
-  private static String MONITOR_ERROR_CODE = "errCode";
-  private static String MONITOR_ARG = "arg";
-  private static String MONITOR_ERROR_MSG = "errMsg";
 
   /**
    * module object dictionary
@@ -168,9 +162,9 @@ public class WXModuleManager {
         IWXUserTrackAdapter userTrackAdapter = WXSDKManager.getInstance().getIWXUserTrackAdapter();
         if(userTrackAdapter != null) {
           HashMap<String, Serializable> data = new HashMap<String, Serializable>();
-          data.put(MONITOR_ERROR_CODE, "101");
-          data.put(MONITOR_ARG, moduleStr + "." + methodStr);
-          data.put(MONITOR_ERROR_MSG, instance.getBundleUrl());
+          data.put(IWXUserTrackAdapter.MONITOR_ERROR_CODE, "101");
+          data.put(IWXUserTrackAdapter.MONITOR_ARG, moduleStr + "." + methodStr);
+          data.put(IWXUserTrackAdapter.MONITOR_ERROR_MSG, instance.getBundleUrl());
           userTrackAdapter.commit(instance.getContext(), null, IWXUserTrackAdapter.INVOKE_MODULE, null, data);
         }
         return dispatchCallModuleMethod(instance,wxModule,args,invoker);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
index 6f964ce..495cdab 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXParams.java
@@ -18,6 +18,10 @@
  */
 package com.taobao.weex.bridge;
 
+import android.util.Log;
+
+import com.taobao.weex.utils.WXLogUtils;
+
 import java.util.Map;
 
 public class WXParams {
@@ -34,6 +38,7 @@ public class WXParams {
   private String logLevel;
   private String needInitV8;
   private String cacheDir;
+  private String useSingleProcess;
 
   private Map<String, String> options;
 
@@ -139,6 +144,15 @@ public class WXParams {
     return logLevel;
   }
 
+  public String getUseSingleProcess() {
+    WXLogUtils.e("getUseSingleProcess is running");
+    return useSingleProcess;
+  }
+
+  public void setUseSingleProcess(String useSingleProcess) {
+    this.useSingleProcess = useSingleProcess;
+  }
+
   public void setLogLevel(String logLevel) {
     this.logLevel = logLevel;
   }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index 05e2907..5213854 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -185,4 +185,5 @@ public interface IWXBridge extends IWXObject {
 
   void setViewPortWidth(String instanceId, float value);
 
+  void reportNativeInitStatus(String statusCode, String errorMsg);
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
index 838b42f..e18a075 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXErrorCode.java
@@ -155,6 +155,24 @@ public enum WXErrorCode {
   WX_ERR_JS_FRAMEWORK("-1002", "js framework error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
   WX_ERR_JS_REINIT_FRAMEWORK("-1003", "js reinit framework error",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+  /**
+   * Single progress init error
+   */
+  WX_ERR_SINGLE_PROCESS_DLOPEN_FILE_NOT_EXIST("-1004", "so file is not exist",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_ERR_SINGLE_PROCESS_DLOPEN_FLAIED("-1005", "dlopen so file failed",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_ERR_SINGLE_PROCESS_DLSYM_FAILED("-1006", "find function from so file failed",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_ERR_SINGLE_PROCESS_JS_FRAMEWORK("-1007", "js framework  init singleProcess failed",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_JS_FRAMEWORK_INIT_MULPROCESS_FAILED("-1008", "js framework init multiProcess failed",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_JS_FRAMEWORK_REINIT_MULPROCESS_FAILED("-1009", "js framework reinit multiProcess failed",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_JS_FRAMEWORK_INIT_FAILED("-1010", "js framework init  failed",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
+
+  WX_JS_FRAMEWORK_INIT_SINGLE_PROCESS_SUCCESS("-1011", "js framework init success in single process",ErrorType.NATIVE_ERROR,ErrorGroup.NATIVE),
 
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/weex_core/Source/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index 5c7d379..478680a 100644
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -20,6 +20,7 @@ add_subdirectory(${CMAKE_SOURCE_DIR}/Source/IPC)
 ## include_directories for include head file
 ## include_directories(${CMAKE_SOURCE_DIR}/Source/IPC)
 
+include_directories("include")
 
 add_library(weexjsc SHARED
 
@@ -41,6 +42,8 @@ add_library(weexjsc SHARED
     ./android/jsengine/multiprocess/WeexProxy.cpp
     ./android/jsengine/multiprocess/ExtendJSApi.cpp
 
+    ./core/api/WeexJSCoreApi.cpp
+
     ./core/render/manager/render_manager.cpp
     ./core/render/page/render_page.cpp
     ./core/render/node/render_object.cpp

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/weex_core/Source/android/base/string/string_utils.h
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/base/string/string_utils.h b/weex_core/Source/android/base/string/string_utils.h
index bc45361..aeda0c5 100644
--- a/weex_core/Source/android/base/string/string_utils.h
+++ b/weex_core/Source/android/base/string/string_utils.h
@@ -26,6 +26,7 @@
 #include <IPC/IPCByteArray.h>
 #include <malloc.h>
 #include "scoped_jstring.h"
+#include "scoped_jstring_utf8.h"
 #include <iostream>
 #include <sstream>
 #include <string>
@@ -154,6 +155,11 @@ static inline void addString(JNIEnv *env, IPCSerializer *serializer, jstring str
   size_t charsLength = scopedString.getCharsLength();
   serializer->add(chars, charsLength);
 }
+static inline void addByteArrayString(JNIEnv *env, IPCSerializer *serializer, jstring str) {
+  ScopedJStringUTF8 scopedJStringUTF8(env,str);
+  const char *string = scopedJStringUTF8.getChars();
+  serializer->add(string,strlen(string));
+}
 
 static inline void addJSONString(JNIEnv *env, IPCSerializer *serializer, jstring str) {
   ScopedJString scopedString(env, str);

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/547da26a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
----------------------------------------------------------------------
diff --git a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp b/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
index 13c88d3..6cd9dce 100644
--- a/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
+++ b/weex_core/Source/android/jsengine/multiprocess/ExtendJSApi.cpp
@@ -18,13 +18,14 @@
  */
 #include <android/base/string/string_utils.h>
 #include <base/ViewUtils.h>
+#include <core/api/WeexJSCoreApi.h>
 #include "ExtendJSApi.h"
 
 using namespace WeexCore;
 
-static WeexCore::FunType gCanvasFunc = nullptr;
+WeexCore::FunType gCanvasFunc = nullptr;
 
-static WeexCore::FunTypeT3d t3dFunc = nullptr;
+WeexCore::FunTypeT3d t3dFunc = nullptr;
 
 /**
 * This class aim to extend JS Api
@@ -85,14 +86,10 @@ void ExtendJSApi::initFunction(IPCHandler *handler) {
 
 std::unique_ptr<IPCResult> handleSetJSVersion(IPCArguments *arguments) {
   const char* version = getArumentAsCStr(arguments, 0);
-  LOGA("init JSFrm version %s", version);
-  Bridge_Impl_Android::getInstance()->setJSVersion(version);
+  _setJSVersion(version);
   return createVoidResult();
 }
 
-void reportException(const char* pageId, const char *func, const char *exception_string) {
-  Bridge_Impl_Android::getInstance()->reportException(pageId, func, exception_string);
-}
 
 std::unique_ptr<IPCResult> handleReportException(IPCArguments *arguments) {
   const char *pageId = nullptr;
@@ -115,7 +112,7 @@ std::unique_ptr<IPCResult> handleReportException(IPCArguments *arguments) {
   }
 
   LOGE(" ReportException : %s", exceptionInfo);
-  reportException(pageId, func, exceptionInfo);
+  _reportException(pageId, func, exceptionInfo);
   return createVoidResult();
 }
 
@@ -127,7 +124,7 @@ std::unique_ptr<IPCResult> handle(IPCArguments *arguments) {
 
 std::unique_ptr<IPCResult> handleCallNativeLog(IPCArguments *arguments) {
   const char* str_array = getArumentAsCStr(arguments, 0);
-  Bridge_Impl_Android::getInstance()->callNativeLog(str_array);
+  _callNativeLog(str_array);
   return createInt32Result(static_cast<int32_t>(true));
 }
 
@@ -138,7 +135,7 @@ std::unique_ptr<IPCResult> handleSetTimeout(IPCArguments *arguments) {
   if (callbackID == nullptr || time == nullptr)
     return createInt32Result(static_cast<int32_t>(false));
 
-  Bridge_Impl_Android::getInstance()->setTimeout(callbackID, time);
+  _setTimeout(callbackID,time);
 
   if (callbackID != nullptr) {
     delete[]callbackID;
@@ -159,7 +156,7 @@ std::unique_ptr<IPCResult> handleSetInterval(IPCArguments *arguments) {
     return createInt32Result(-1);
 
   long time_ = atoi(_time);
-  int _timerId = (atoi(pageId) << 16) | (atoi(callbackID));
+  int _timerId = _setInterval(pageId,callbackID,_time);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -197,17 +194,7 @@ std::unique_ptr<IPCResult> handleCallNative(IPCArguments *arguments) {
   char* task = getArumentAsCStr(arguments, 1);
   char* callback = getArumentAsCStr(arguments, 2);
 
-  if (pageId != nullptr && task != nullptr) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] handleCallNative >>>> pageId: %s, task: %s", pageId, task);
-#endif
-
-    if (strcmp(task, "[{\"module\":\"dom\",\"method\":\"createFinish\",\"args\":[]}]") == 0) {
-      RenderManager::GetInstance()->CreateFinish(pageId) ? 0 : -1;
-    } else {
-      Bridge_Impl_Android::getInstance()->callNative(pageId, task, callback);
-    }
-  }
+    _callNative(pageId, task, callback);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -236,10 +223,7 @@ static std::unique_ptr<IPCResult> handleCallGCanvasLinkNative(IPCArguments *argu
   LOGD("[ExtendJSApi] handleCallGCanvasLinkNative >>>> pageId: %s, type: %d, args: %s", pageId, type, args);
 #endif
 
-  const char *retVal = NULL;
-  if (gCanvasFunc) {
-    retVal = callGCanvasFun(gCanvasFunc, pageId, type, args);
-  }
+  const char *retVal = _callGCanvasLinkNative(pageId,type,args);
 
   std::unique_ptr<IPCResult> ret = createVoidResult();
   if (retVal) {
@@ -264,12 +248,7 @@ static std::unique_ptr<IPCResult> handleT3DLinkNative(IPCArguments* arguments)
   LOGD("[ExtendJSApi] handleT3DLinkNative >>>> type: %d, args: %s", type, args);
 #endif
 
-  const char* retVal = NULL;
-  if (t3dFunc) {
-    retVal = WeexCore::weexCallT3dFunc(t3dFunc, type, args);
-  }
-
-
+  const char*retVal = _t3dLinkNative(type, args);
 
   std::unique_ptr<IPCResult> ret = createVoidResult();
   if (retVal) {
@@ -289,45 +268,7 @@ std::unique_ptr<IPCResult> handleCallNativeModule(IPCArguments *arguments) {
   char* argString = getArumentAsCStr(arguments, 3);
   char* optString = getArumentAsCStr(arguments, 4);
 
-  std::unique_ptr<IPCResult> ret = createInt32Result(-1);
-
-  if (pageId != nullptr && module != nullptr && method != nullptr) {
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] handleCallNativeModule >>>> pageId: %s, module: %s, method: %s, arg: %s, opt: %s",
-         pageId, module, method, argString, optString);
-#endif
-
-    // add for android support
-    jobject result;
-    result = Bridge_Impl_Android::getInstance()->callNativeModule(pageId, module, method,
-                                                                  argString, optString);
-
-    if (result == nullptr)
-      return ret;
-
-    JNIEnv *env = getJNIEnv();
-    jfieldID jTypeId = env->GetFieldID(jWXJSObject, "type", "I");
-    jint jTypeInt = env->GetIntField(result, jTypeId);
-    jfieldID jDataId = env->GetFieldID(jWXJSObject, "data", "Ljava/lang/Object;");
-    jobject jDataObj = env->GetObjectField(result, jDataId);
-    if (jTypeInt == 1) {
-      if (jDoubleValueMethodId == NULL) {
-        jclass jDoubleClazz = env->FindClass("java/lang/Double");
-        jDoubleValueMethodId = env->GetMethodID(jDoubleClazz, "doubleValue", "()D");
-        env->DeleteLocalRef(jDoubleClazz);
-      }
-      jdouble jDoubleObj = env->CallDoubleMethod(jDataObj, jDoubleValueMethodId);
-      ret = std::move(createDoubleResult(jDoubleObj));
-
-    } else if (jTypeInt == 2) {
-      jstring jDataStr = (jstring) jDataObj;
-      ret = std::move(createStringResult(env, jDataStr));
-    } else if (jTypeInt == 3) {
-      jstring jDataStr = (jstring) jDataObj;
-      ret = std::move(createJSONStringResult(env, jDataStr));
-    }
-    env->DeleteLocalRef(jDataObj);
-  }
+  std::unique_ptr<IPCResult> ret = _callNativeModule(pageId,module,method,argString,optString);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -359,15 +300,7 @@ std::unique_ptr<IPCResult> handleCallNativeComponent(IPCArguments *arguments) {
   char* argString = getArumentAsCStr(arguments, 3);
   char* optString = getArumentAsCStr(arguments, 4);
 
-  if (pageId != nullptr && ref != nullptr && method != nullptr) {
-
-#if JSAPI_LOG
-    LOGD("[ExtendJSApi] handleCallNativeComponent >>>> pageId: %s, ref: %s, method: %s, arg: %s, opt: %s",
-         pageId, ref, method, argString, optString);
-#endif
-
-    Bridge_Impl_Android::getInstance()->callNativeComponent(pageId, ref, method, argString, optString);
-  }
+    _callNativeComponent(pageId, ref, method, argString, optString);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -400,11 +333,7 @@ std::unique_ptr<IPCResult> functionCallCreateBody(IPCArguments *arguments) {
   if (pageId == nullptr || domStr == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallCreateBody >>>> pageId: %s, domStr: %s", pageId, domStr);
-#endif
-
-  RenderManager::GetInstance()->CreatePage(pageId, domStr) ? 0 : -1;
+  _callCreateBody(pageId,domStr);
 
   delete[]pageId;
   delete[]domStr;
@@ -417,37 +346,8 @@ std::unique_ptr<IPCResult> handleCallAddElement(IPCArguments *arguments) {
   char *parentRef = getArumentAsCStr(arguments, 1);
   char *domStr = getArumentAsCStr(arguments, 2);
   char *index_cstr = getArumentAsCStr(arguments, 3);
-  int index = atoi(index_cstr);
-
-  if (pageId == nullptr || parentRef == nullptr || domStr == nullptr || index_cstr == nullptr ||
-      index < -1)
-    return createInt32Result(0);
-
-#if JSAPI_LOG
 
-  std::string log = "";
-  log.append("pageId: ").append(pageId).append(", parentRef: ").append(parentRef).append(", domStr: ").append(domStr);
-  int log_index = 0;
-  int maxLength = 800;
-  std::string sub;
-  while (log_index < log.length()) {
-    if (log.length() <= log_index + maxLength) {
-      sub = log.substr(log_index);
-    } else {
-      sub = log.substr(log_index, maxLength);
-    }
-
-
-    if (log_index == 0)
-      LOGD("[ExtendJSApi] functionCallAddElement >>>> %s", sub.c_str());
-    else
-      LOGD("      [ExtendJSApi] functionCallAddElement >>>> %s", sub.c_str());
-
-    log_index += maxLength;
-  }
-#endif
-
-  RenderManager::GetInstance()->AddRenderObject(pageId, parentRef, index, domStr);
+    _callAddElement(pageId,parentRef,domStr,index_cstr);
 
   delete[]pageId;
   delete[]parentRef;
@@ -464,12 +364,7 @@ std::unique_ptr<IPCResult> functionCallRemoveElement(IPCArguments *arguments) {
   if (pageId == nullptr || ref == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallRemoveElement >>>> pageId: %s, ref: %s", pageId,
-       ref);
-#endif
-
-  RenderManager::GetInstance()->RemoveRenderObject(pageId, ref);
+ _callRemoveElement(pageId,ref);
 
   delete[]pageId;
   delete[]ref;
@@ -488,12 +383,7 @@ std::unique_ptr<IPCResult> functionCallMoveElement(IPCArguments *arguments) {
       index < -1)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallRemoveElement >>>> pageId: %s, ref: %s, parentRef: %s, index: %d",
-       pageId, ref, parentRef, index);
-#endif
-
-  RenderManager::GetInstance()->MoveRenderObject(pageId, ref, parentRef, index);
+  _callMoveElement(pageId, ref, parentRef, index);
 
   delete[]pageId;
   delete[]ref;
@@ -511,12 +401,7 @@ std::unique_ptr<IPCResult> functionCallAddEvent(IPCArguments *arguments) {
   if (pageId == nullptr || ref == nullptr || event == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallAddEvent >>>> pageId: %s, ref: %s, event: %s", pageId,
-       ref, event);
-#endif
-
-  RenderManager::GetInstance()->AddEvent(pageId, ref, event);
+  _callAddEvent(pageId,ref,event);
 
   delete[]pageId;
   delete[]ref;
@@ -533,12 +418,7 @@ std::unique_ptr<IPCResult> functionCallRemoveEvent(IPCArguments *arguments) {
   if (pageId == nullptr || ref == nullptr || event == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallRemoveEvent >>>> pageId: %s, ref: %s, event: %s", pageId,
-       ref, event);
-#endif
-
-  RenderManager::GetInstance()->RemoveEvent(pageId, ref, event);
+ _callRemoveEvent(pageId,ref,event);
 
   delete[]pageId;
   delete[]ref;
@@ -555,12 +435,7 @@ std::unique_ptr<IPCResult> functionCallUpdateStyle(IPCArguments *arguments) {
   if (pageId == nullptr || ref == nullptr || data == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallUpdateStyle >>>> pageId: %s, ref: %s, data: %s", pageId,
-       ref, data);
-#endif
-
-  RenderManager::GetInstance()->UpdateStyle(pageId, ref, data);
+  _callUpdateStyle(pageId,ref,data);
 
   delete[] pageId;
   delete[] ref;
@@ -577,12 +452,7 @@ std::unique_ptr<IPCResult> functionCallUpdateAttrs(IPCArguments *arguments) {
   if (pageId == nullptr || ref == nullptr || data == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallUpdateAttrs >>>> pageId: %s, ref: %s, data: %s", pageId,
-       ref, data);
-#endif
-
-  RenderManager::GetInstance()->UpdateAttr(pageId, ref, data);
+ _callUpdateAttrs(pageId, ref,data);
 
   delete[] pageId;
   delete[] ref;
@@ -597,11 +467,7 @@ std::unique_ptr<IPCResult> functionCallCreateFinish(IPCArguments *arguments) {
   if (pageId == nullptr)
     return createInt32Result(0);
 
-#if JSAPI_LOG
-  LOGD("[ExtendJSApi] functionCallCreateFinish >>>> pageId: %s", pageId);
-#endif
-
-  RenderManager::GetInstance()->CreateFinish(pageId);
+ _callCreateFinish(pageId);
 
   delete[]pageId;
   return createInt32Result(0);
@@ -617,7 +483,7 @@ std::unique_ptr<IPCResult> functionCallUpdateFinish(IPCArguments *arguments) {
   if (pageId == nullptr || task == nullptr)
     return createInt32Result(flag);
 
-  flag = Bridge_Impl_Android::getInstance()->callUpdateFinish(pageId, task, callback);
+  flag = _callUpdateFinish(pageId,task,callback);
 
   if (pageId != nullptr) {
     delete[]pageId;
@@ -644,7 +510,7 @@ std::unique_ptr<IPCResult> functionCallRefreshFinish(IPCArguments *arguments) {
   if (pageId == nullptr)
     return createInt32Result(flag);
 
-  flag = Bridge_Impl_Android::getInstance()->callRefreshFinish(pageId, task, callback);
+  flag = _callRefreshFinish(pageId, task, callback);
 
   if (pageId != nullptr) {
     delete[]pageId;