You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by lu...@apache.org on 2019/08/01 04:04:25 UTC

[incubator-weex] branch master updated: Feature/new log branch (#2768)

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

luckychen 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 10ddece  Feature/new log branch (#2768)
10ddece is described below

commit 10ddeced10668b26ea5c73b072b3fc9b12708e73
Author: darin <dy...@qq.com>
AuthorDate: Thu Aug 1 12:04:19 2019 +0800

    Feature/new log branch (#2768)
    
    * Add TimeCalculator
    
    * Fix All Log Problem
    
    * Add for cal initJsc
    
    * Add Tlog Type
    
    * Refine log Utils
    
    * add jni setLogType
    
    to Make weexcore and jss know log type
    
    * add Debug & perf flag for log utils
    
    * Add logType interface
    
    * add setLogLevel interface
    
    * add  Tlog level
    
    * Log Api jss <-> weexcore Done
    
    * performance Log api Done
    
    * Scan to set log level dynamicly
    
    * All Log Api is fine
    
    * Only Add time calculator in performance mode
    
    * Refine Log Print logic
    
    * Support all cpu type
    
    * Add For test
    
    * Fix jni type
    
    * modify for ios
    
    * Add CreateInstance tlog
    
    * remove debug log
    
    * Do nothing for performance
    
    * clear  unuse log
    
    * Support "wx" in  Transform.translate
    
    * remove useless log
    
    *  [Android] record performance detail cost (#2769)
    
    * [iOS] fix multi jsthread error
    
    * [Android] Avoid duplicated call of setViewPort (#2764)
    
    * [iOS] Protect animation argument missing which cause crash on iOS. (#2771)
    
    * [iOS] fix compile error
    
    * Remove Useles log
---
 android/sdk/build.gradle                           |    8 +-
 .../main/java/com/taobao/weex/WXEnvironment.java   |    2 +-
 .../main/java/com/taobao/weex/WXHttpListener.java  |   12 +-
 .../src/main/java/com/taobao/weex/WXSDKEngine.java |    4 +-
 .../main/java/com/taobao/weex/WXSDKInstance.java   |   16 +-
 .../main/java/com/taobao/weex/bridge/WXBridge.java |   11 +-
 .../com/taobao/weex/bridge/WXBridgeManager.java    |   86 +-
 .../com/taobao/weex/bridge/WXModuleManager.java    |    8 +-
 .../java/com/taobao/weex/common/IWXBridge.java     |    2 +
 .../main/java/com/taobao/weex/common/WXThread.java |   49 +-
 .../taobao/weex/ui/module/ConsoleLogModule.java    |   10 +
 .../main/java/com/taobao/weex/utils/LogLevel.java  |    5 +-
 .../java/com/taobao/weex/utils/WXLogUtils.java     |   24 +
 .../java/com/taobao/weex/utils/tools/Info.java     |   47 +-
 .../com/taobao/weex/utils/tools/LogDetail.java     |   85 +
 .../com/taobao/weex/utils/tools/LogSwitch.java     |   41 +-
 .../java/com/taobao/weex/utils/tools/TaskInfo.java |   28 +-
 .../java/com/taobao/weex/utils/tools/Time.java     |   83 +
 .../taobao/weex/utils/tools/TimeCalculator.java    |   67 +
 ios/sdk/WeexSDK.xcodeproj/project.pbxproj          |   12 +
 ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm     |   16 +-
 weex_core/Source/CMakeLists.txt                    |    1 +
 weex_core/Source/WXBridge_jni.h                    |    3 +
 .../bridge/script/script_side_in_multi_process.cpp |   21 +-
 .../bridge/script/script_side_in_multi_process.h   |    1 +
 .../bridge/script/script_side_in_multi_so.cpp      |    9 +
 .../bridge/script/script_side_in_multi_so.h        |    1 +
 .../bridge/script_bridge_in_multi_process.cpp      |   39 +-
 .../android/bridge/script_bridge_in_multi_so.cpp   |  229 ++-
 .../platform/platform_bridge_in_multi_so.cpp       |    4 +
 .../bridge/platform/platform_bridge_in_multi_so.h  |    3 +-
 .../bridge/script/core_side_in_multi_process.cpp   |  938 ++++-----
 .../bridge/script/core_side_in_multi_process.h     |  135 +-
 .../bridge/script/core_side_in_multi_so.cpp        |   18 +-
 .../jsengine/bridge/script/core_side_in_multi_so.h |    5 +
 .../script/script_bridge_in_multi_process.cpp      |   17 +-
 .../bridge/script/script_bridge_in_multi_process.h |    1 +
 .../bridge/script/script_bridge_in_multi_so.cpp    |    6 +-
 .../bridge/script/script_bridge_in_multi_so.h      |    1 +
 .../bridge/script/script_side_in_queue.cpp         |   13 +-
 .../jsengine/bridge/script/script_side_in_queue.h  |    2 +-
 .../bridge/script/script_side_in_simple.cpp        |    4 +
 .../jsengine/bridge/script/script_side_in_simple.h |    2 +-
 .../object/log_utils_jss.h}                        |   36 +-
 weex_core/Source/android/jsengine/object/tlog.h    |   53 -
 .../jsengine/object/weex_console_object.cpp        |    5 +-
 .../Source/android/jsengine/object/weex_env.cpp    |   80 +-
 .../Source/android/jsengine/object/weex_env.h      |   11 +-
 .../android/jsengine/object/weex_global_object.cpp |   21 +-
 .../Source/android/jsengine/weex_ipc_server.cpp    |    6 +-
 weex_core/Source/android/jsengine/weex_runtime.cpp |   46 +-
 weex_core/Source/android/utils/jni_load.cc         |    1 +
 weex_core/Source/android/utils/params_utils.cpp    |    9 +-
 weex_core/Source/android/wrap/log_utils.cpp        |   98 +-
 weex_core/Source/android/wrap/log_utils.h          |   20 +-
 weex_core/Source/android/wrap/wx_bridge.cpp        |   19 +-
 weex_core/Source/base/CMakeLists.txt               |    1 +
 .../Source/base/android/jni/scoped_java_ref.cpp    |    5 +-
 .../Source/base/android/jni/scoped_java_ref.h      |    1 +
 .../android/jniprebuild/jniheader/WXBridge_jni.h   | 2034 ++++++++++----------
 weex_core/Source/base/log_defines.cpp              |  224 +--
 weex_core/Source/base/log_defines.h                |  182 +-
 weex_core/Source/base/time_calculator.cpp          |  117 ++
 weex_core/Source/base/time_calculator.h            |  130 +-
 weex_core/Source/base/utils/log_utils.cpp          |   60 +-
 .../core/bridge/platform/core_side_in_platform.cpp |    7 +
 .../core/bridge/platform/core_side_in_platform.h   |    2 +-
 weex_core/Source/core/bridge/platform_bridge.h     |    2 +
 .../core/bridge/script/core_side_in_script.cpp     |   13 +-
 .../core/bridge/script/core_side_in_script.h       |    5 +
 weex_core/Source/core/bridge/script_bridge.h       |   10 +
 weex_core/Source/core/config/core_environment.cpp  |    3 +-
 weex_core/Source/core/manager/weex_core_manager.h  |    9 -
 .../network/android/default_request_handler.cc     |   14 +-
 weex_core/Source/include/WeexApiHeader.h           |   10 +
 .../weex/bridge/script/script_side_in_queue.cpp    |    5 +
 .../weex/bridge/script/script_side_in_simple.cpp   |    3 +
 .../weex/object/weex_global_object_v2.cpp          |    3 +-
 weex_core/Source/third_party/IPC/IPCLog.h          |    1 +
 weex_core/Source/third_party/IPC/IPCMessageJS.h    |    3 +-
 80 files changed, 3122 insertions(+), 2196 deletions(-)

diff --git a/android/sdk/build.gradle b/android/sdk/build.gradle
index f757b04..f80bd7d 100755
--- a/android/sdk/build.gradle
+++ b/android/sdk/build.gradle
@@ -273,10 +273,10 @@ task checkNdkVersion() {
         ndkDir = properties.getProperty('ndk.dir')
     }
 
-    if(null == ndkDir){
-        def errMsg ='please set ndk.dir path in project/local.properties and ndk-16 supported only,example: ndk.dir=/Users/xxx/Library/Android/sdk/ndk-bundle-r16'
-        throw new StopActionException(errMsg)
-    }
+//    if(null == ndkDir){
+//        def errMsg ='please set ndk.dir path in project/local.properties and ndk-16 supported only,example: ndk.dir=/Users/xxx/Library/Android/sdk/ndk-bundle-r16'
+//        throw new StopActionException(errMsg)
+//    }
 }
 
 preBuild.dependsOn checkNdkVersion
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 cac4e2c..519861d 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -124,7 +124,7 @@ public class WXEnvironment {
 
   public static LogLevel sLogLevel = LogLevel.DEBUG;
   private static boolean isApkDebug = true;
-  public static boolean isPerf = true;
+  public static boolean isPerf = false;
   private static boolean sDebugFlagInit = false;
 
   private static boolean openDebugLog = true;
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java b/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java
index 74a9567..d2ffd09 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXHttpListener.java
@@ -30,6 +30,7 @@ import com.taobao.weex.common.WXResponse;
 import com.taobao.weex.performance.WXInstanceApm;
 import com.taobao.weex.tracing.WXTracing;
 import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.tools.LogDetail;
 
 import java.util.HashMap;
 import java.util.List;
@@ -54,10 +55,14 @@ public class WXHttpListener implements IWXHttpAdapter.OnHttpListener {
     private boolean isInstanceReady =false;
     private boolean isResponseHasWait = false;
     private WXResponse mResponse;
+    private LogDetail mLogDetail;
 
     private String mBundleUrl;
 
     public WXHttpListener(WXSDKInstance instance) {
+        if(instance != null) {
+            mLogDetail = instance.mTimeCalculator.createLogDetail("downloadBundleJS");
+        }
         this.instance = instance;
         this.traceId = WXTracing.nextId();
         this.mWXPerformance = instance.getWXPerformance();
@@ -102,6 +107,9 @@ public class WXHttpListener implements IWXHttpAdapter.OnHttpListener {
         if (this.instance != null
                 && this.instance.getWXStatisticsListener() != null) {
             this.instance.getWXStatisticsListener().onHttpStart();
+            if(mLogDetail != null) {
+                mLogDetail.taskStart();
+            }
         }
     }
 
@@ -131,7 +139,9 @@ public class WXHttpListener implements IWXHttpAdapter.OnHttpListener {
 
     @Override
     public void onHttpFinish(WXResponse response) {
-
+        if(mLogDetail != null) {
+            mLogDetail.taskEnd();
+        }
         if (this.instance != null
                 && this.instance.getWXStatisticsListener() != null) {
             this.instance.getWXStatisticsListener().onHttpFinish();
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
index 62e8896..959eab3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKEngine.java
@@ -209,7 +209,7 @@ public class WXSDKEngine implements Serializable {
     }
     WXEnvironment.JsFrameworkInit = false;
 
-    WXBridgeManager.getInstance().post(new Runnable() {
+    WXBridgeManager.getInstance().postWithName(new Runnable() {
       @Override
       public void run() {
         long start = System.currentTimeMillis();
@@ -243,7 +243,7 @@ public class WXSDKEngine implements Serializable {
         WXEnvironment.sSDKInitExecuteTime = System.currentTimeMillis() - start;
         WXLogUtils.renderPerformanceLog("SDKInitExecuteTime", WXEnvironment.sSDKInitExecuteTime);
       }
-    });
+    },null,"doInitWeexSdkInternal");
     WXStateRecord.getInstance().startJSThreadWatchDog();
     register();
   }
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 d07eebd..3802c33 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -91,6 +91,8 @@ import com.taobao.weex.utils.WXReflectionUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXViewUtils;
 import com.taobao.weex.utils.cache.RegisterCache;
+import com.taobao.weex.utils.tools.LogDetail;
+import com.taobao.weex.utils.tools.TimeCalculator;
 import java.io.Serializable;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -205,6 +207,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
 
   private String mRenderType = RenderTypes.RENDER_TYPE_NATIVE;
 
+  public TimeCalculator mTimeCalculator;
   /**
    * Default Width And Viewport is 750,
    * when screen width change, we adjust viewport to adapter screen change
@@ -581,6 +584,8 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
 
     // WXBridgeManager.getInstance().checkJsEngineMultiThread();
     mDisableSkipFrameworkInit = isDisableSkipFrameworkInDataRender();
+
+    mTimeCalculator = new TimeCalculator(this);
   }
 
   /**
@@ -814,6 +819,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
       return;
     }
 
+    LogDetail logDetail = mTimeCalculator.createLogDetail("renderInternal");
     mRenderStrategy = flag;
 
     //some case ,from render(template),but not render (url)
@@ -852,7 +858,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
       return;
     }
 
-
+    TimeCalculator timeCalculator = new TimeCalculator(this);
 
     mWXPerformance.JSTemplateSize = template.length() / 1024f;
     mApmForInstance.addStats(WXInstanceApm.KEY_PAGE_STATS_BUNDLE_SIZE,mWXPerformance.JSTemplateSize);
@@ -880,12 +886,14 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
                             WXViewUtils.getScreenDensity(mContext));
          }
     }
+    logDetail.taskStart();
     if (isPreInitMode()){
       getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_START);
       WXBridgeManager.getInstance().loadJsBundleInPreInitMode(getInstanceId(),template.getContent());
     } else {
       WXSDKManager.getInstance().createInstance(this, template, renderOptions, jsonInitData);
     }
+    logDetail.taskEnd();
     mRendered = true;
 
     final IWXJscProcessManager wxJscProcessManager = WXSDKManager.getInstance().getWXJscProcessManager();
@@ -957,6 +965,9 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
                                    final String jsonInitData,
                                    WXRenderStrategy flag) {
 
+
+    LogDetail logDetail = mTimeCalculator.createLogDetail("renderByUrlInternal");
+    logDetail.taskStart();
     ensureRenderArchor();
     pageName = wrapPageName(pageName, url);
     mBundleUrl = url;
@@ -1018,6 +1029,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
     mHttpListener.setSDKInstance(this);
     mApmForInstance.onStage(WXInstanceApm.KEY_PAGE_STAGES_DOWN_BUNDLE_START);
     adapter.sendRequest(wxRequest, (IWXHttpAdapter.OnHttpListener) mHttpListener);
+    logDetail.taskEnd();
   }
 
   private WXHttpListener mHttpListener = null;
@@ -1436,7 +1448,7 @@ public class WXSDKInstance implements IWXActivityStateListener,View.OnLayoutChan
             WXLogUtils.w("Warning :Component tree has not build completely, onActivityDestroy can not be call!");
         }
     }
-
+    this.mTimeCalculator.println();
     destroy();
   }
 
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 669032f..3020cf6 100755
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -41,6 +41,7 @@ import com.taobao.weex.utils.WXJsonUtils;
 import com.taobao.weex.utils.WXLogUtils;
 import com.taobao.weex.utils.WXUtils;
 import com.taobao.weex.utils.WXWsonJSONSwitch;
+import com.taobao.weex.utils.tools.TimeCalculator;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -51,7 +52,7 @@ import java.util.Map;
  * Communication interface for Java code and JavaScript code.
  */
 
-public class WXBridge implements IWXBridge {
+    public class WXBridge implements IWXBridge {
 
   private native int nativeInitFrameworkEnv(String framework, WXParams params, String cacheDir, boolean pieSupport);
 
@@ -136,6 +137,7 @@ public class WXBridge implements IWXBridge {
   public native void nativeUpdateGlobalConfig(String config);
 
   private native void nativeSetViewPortWidth(String instanceId, float viewPortWidth);
+  private native void nativeSetLogType(float type, float isPerf);
 
   public static final boolean MULTIPROCESS = true;
 
@@ -147,6 +149,12 @@ public class WXBridge implements IWXBridge {
   }
 
   @Override
+  public void setLogType(float type, boolean isPerf) {
+    Log.e("WeexCore", "setLog" + WXEnvironment.sLogLevel.getValue() + "isPerf : " + isPerf);
+    nativeSetLogType(type, isPerf ? 1 : 0);
+  }
+
+  @Override
   public int initFramework(String framework, WXParams params) {
     return nativeInitFramework(framework, params);
   }
@@ -220,6 +228,7 @@ public class WXBridge implements IWXBridge {
 
   @Override
   public int createInstanceContext(String instanceId, String name, String function, WXJSObject[] args) {
+    Log.e(TimeCalculator.TIMELINE_TAG,"createInstance :" + System.currentTimeMillis());
     WXStateRecord.getInstance().recordAction(instanceId,"createInstanceContext:");
     return nativeCreateInstanceContext(instanceId, name, function, args);
   }
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 987d83d..d9d09cc 100755
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -95,6 +95,8 @@ import com.taobao.weex.utils.WXViewUtils;
 import com.taobao.weex.utils.WXWsonJSONSwitch;
 import com.taobao.weex.utils.batch.BactchExecutor;
 import com.taobao.weex.utils.batch.Interceptor;
+import com.taobao.weex.utils.tools.LogDetail;
+import com.taobao.weex.utils.tools.TimeCalculator;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -360,7 +362,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
             WXModuleManager.reload();
             WXComponentRegistry.reload();
           }
-        }, null);
+        });
       }
     }
   }
@@ -521,12 +523,17 @@ public class WXBridgeManager implements Callback, BactchExecutor {
       public void run() {
         mNextTickTasks.setStackTopInstance(instanceId);
       }
-    }, instanceId);
+    },instanceId, null, null);
   }
 
   @Override
   public void post(Runnable r) {
-    if (mInterceptor != null && mInterceptor.take(r)) {
+      postWithName(r,null,null);
+  }
+
+  public void postWithName(Runnable r, WXSDKInstance instance, String runnableName) {
+   Runnable secure = WXThread.secure(r,instance, runnableName);
+    if (mInterceptor != null && mInterceptor.take(secure)) {
       //task is token by the interceptor
       return;
     }
@@ -534,7 +541,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
       return;
     }
 
-    mJSHandler.post(WXThread.secure(r));
+    mJSHandler.post(secure);
   }
 
   @Override
@@ -542,16 +549,20 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     mInterceptor = interceptor;
   }
 
-  public void post(Runnable r, Object token) {
+  public void post(Runnable r, Object token, WXSDKInstance instance, String runnableName) {
     if (mJSHandler == null) {
       return;
     }
 
-    Message m = Message.obtain(mJSHandler, WXThread.secure(r));
+    Message m = Message.obtain(mJSHandler, WXThread.secure(r, instance, runnableName));
     m.obj = token;
     m.sendToTarget();
   }
 
+  public void post(Runnable r, Object token) {
+    post(r, token, null, null);
+  }
+
   public void postDelay(Runnable r,long delayMillis){
     if (mJSHandler == null) {
       return;
@@ -1482,6 +1493,17 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     createInstance(instanceId, new Script(template), options, data);
   }
 
+  public void setLogLevel(final int level, final boolean isPerf) {
+    post(new Runnable() {
+      @Override
+      public void run() {
+        if(mWXBridge != null) {
+          mWXBridge.setLogType(level, isPerf);
+        }
+      }
+    });
+  }
+
   public void createInstance(final String instanceId, final Script template,
                              final Map<String, Object> options, final String data) {
     final WXSDKInstance instance = WXSDKManager.getInstance().getSDKInstance(instanceId);
@@ -1511,7 +1533,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         public void run() {
           initFramework("");
         }
-      }, instanceId);
+      }, instanceId, instance,"initFrameworkInCreateInstance");
       return;
     }
 
@@ -1529,7 +1551,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         instance.getWXPerformance().callCreateInstanceTime = end - start;
         instance.getWXPerformance().communicateTime =  instance.getWXPerformance().callCreateInstanceTime;
       }
-    }, instanceId);
+    }, instanceId, instance,"createInstance");
   }
 
   private void invokeCreateInstance(@NonNull WXSDKInstance instance, Script template,
@@ -1670,6 +1692,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         // others will use invokeExecJS
         if (!isSandBoxContext) {
           instance.getApmForInstance().onStage("!isSandBoxContext,and excute");
+          WXLogUtils.e("Instance " + instance.getInstanceId() + " Did Not Render in SandBox Mode");
           invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
           return;
         }
@@ -1678,11 +1701,15 @@ public class WXBridgeManager implements Callback, BactchExecutor {
                 || instance.getRenderStrategy() == WXRenderStrategy.DATA_RENDER_BINARY
                 || instance.getRenderStrategy() == WXRenderStrategy.JSON_RENDER) {
           instance.getApmForInstance().onStage("wxBeforeInvokeCreateInstanceContext");
+
+          WXLogUtils.d("Instance " + instance.getInstanceId() + " Render in SandBox Mode And Render Type is "
+                  + type + " Render Strategy is " + instance.getRenderStrategy());
+
           int ret = invokeCreateInstanceContext(instance.getInstanceId(), null, "createInstanceContext", args, false);
           instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END);
           if(ret == 0) {
             String err = "[WXBridgeManager] invokeCreateInstance : " + instance.getTemplateInfo();
-
+            WXLogUtils.e("Instance " + instance.getInstanceId() + "Render error : " + err);
             instance.onRenderError(
                     WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
                     WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() + err);
@@ -1697,6 +1724,9 @@ public class WXBridgeManager implements Callback, BactchExecutor {
           //      WXErrorCode.WX_KEY_EXCEPTION_NO_BUNDLE_TYPE.getErrorMsg(),
           //      null
           //);
+
+          WXLogUtils.d("Instance " + instance.getInstanceId() + "Did not Render in SandBox Mode And Render Type is "
+                + type + " Render Strategy is " + instance.getRenderStrategy());
           instance.getApmForInstance().onStage("StartInvokeExecJSBadBundleType");
           invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
           instance.getApmForInstance().onStage(WXInstanceApm.KEY_PAGE_STAGES_LOAD_BUNDLE_END);
@@ -1706,7 +1736,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         String err = "[WXBridgeManager] invokeCreateInstance " + e.getCause()
                 + instance.getTemplateInfo();
         instance.getApmForInstance().onStage("createInstance error :"+e.toString());
-
+        WXLogUtils.e("Instance " + instance.getInstanceId() + "Render error : " + err);
         instance.onRenderError(
                 WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorCode(),
                 WXErrorCode.WX_DEGRAD_ERR_INSTANCE_CREATE_FAILED.getErrorMsg() + err);
@@ -1812,7 +1842,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         removeTaskByInstance(instanceId);
         invokeDestroyInstance(instanceId);
       }
-    }, instanceId);
+    }, instanceId, null, "destroyInstance");
   }
 
   private void removeTaskByInstance(String instanceId) {
@@ -1878,8 +1908,8 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     invokeExecJS(instanceId, namespace, function, args, true);
   }
 
-  public void invokeExecJS(String instanceId, String namespace, String function,
-                           WXJSObject[] args, boolean logTaskDetail) {
+  public void invokeExecJS(final String instanceId, final String namespace, final String function,
+                           final WXJSObject[] args, boolean logTaskDetail) {
     if (WXEnvironment.isOpenDebugLog() && BRIDGE_LOG_SWITCH) {
       mLodBuilder.append("callJS >>>> instanceId:").append(instanceId)
               .append("function:").append(function);
@@ -1901,7 +1931,13 @@ public class WXBridgeManager implements Callback, BactchExecutor {
       }
       callbackJavascriptOnDataRender(instanceId, (String) data.first.first, data.first.second, data.second);
     } else {
-      mWXBridge.execJS(instanceId, namespace, function, args);
+
+      WXThread.secure(new Runnable() {
+        @Override
+        public void run() {
+          mWXBridge.execJS(instanceId, namespace, function, args);
+        }
+      }, instance, "ExecJs").run();
     }
     if (null != instance){
       long diff = System.currentTimeMillis()-start;
@@ -2022,6 +2058,9 @@ public class WXBridgeManager implements Callback, BactchExecutor {
   public static StringBuilder sInitFrameWorkMsg = new StringBuilder();
 
   private void initFramework(String framework) {
+    LogDetail logDetail = new LogDetail();
+    logDetail.name("initFramework");
+    logDetail.taskStart();
     if (WXSDKEngine.isSoInitialized() && !isJSFrameworkInit()) {
       sInitFrameWorkTimeOrigin = System.currentTimeMillis();
       if (TextUtils.isEmpty(framework)) {
@@ -2029,6 +2068,10 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         WXLogUtils.d("weex JS framework from assets");
         // }
 
+        LogDetail logDetail2 = new LogDetail();
+        logDetail2.name("loadJSFramework");
+        logDetail2.taskStart();
+
         IWXJsFileLoaderAdapter wxJsFileLoaderAdapter = WXSDKEngine.getIWXJsFileLoaderAdapter();
 
         if (!isSandBoxContext) {
@@ -2049,6 +2092,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
           }
         }
         sInitFrameWorkMsg.append("| weex JS framework from assets, isSandBoxContext: ").append(isSandBoxContext);
+        logDetail2.taskEnd();
       }
       if (TextUtils.isEmpty(framework)) {
         setJSFrameworkInit(false);
@@ -2092,11 +2136,15 @@ public class WXBridgeManager implements Callback, BactchExecutor {
         sInitFrameWorkMsg.append(" | pieSupport:").append(pieSupport);
         WXLogUtils.d("[WXBridgeManager] initFrameworkEnv crashFile:" + crashFile + " pieSupport:" + pieSupport);
         // extends initFramework
+        LogDetail logDetail3 = new LogDetail();
+        logDetail3.name("native initFrameworkEnv");
+        logDetail3.taskStart();
         if (mWXBridge.initFrameworkEnv(framework, assembleDefaultOptions(), crashFile, pieSupport) == INIT_FRAMEWORK_OK) {
+          logDetail3.taskEnd();
           WXEnvironment.sJSLibInitTime = System.currentTimeMillis() - start;
           WXEnvironment.sSDKInitTime = System.currentTimeMillis() - WXEnvironment.sSDKInitStart;
           setJSFrameworkInit(true);
-
+          logDetail.taskEnd();
           if (WXSDKManager.getInstance().getWXStatisticsListener() != null) {
             WXSDKManager.getInstance().getWXStatisticsListener().onJsFrameworkReady();
           }
@@ -2279,7 +2327,7 @@ public class WXBridgeManager implements Callback, BactchExecutor {
           public void run() {
             invokeRegisterModules(modules, mRegisterModuleFailList);
           }
-        }, null);
+        });
       }
     }
   }
@@ -2302,17 +2350,17 @@ public class WXBridgeManager implements Callback, BactchExecutor {
     if(isJSThread() && isJSFrameworkInit()){
       runnable.run();
     }else{
-      post(runnable, null);
+      post(runnable);
     }
   }
 
   public void execJSService(final String service) {
-    post(new Runnable() {
+    postWithName(new Runnable() {
       @Override
       public void run() {
         invokeExecJSService(service, mRegisterServiceFailList);
       }
-    });
+    },null,"execJSService");
   }
 
   private void invokeExecJSService(String service, List<String> receiver) {
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 650d64e..f544123 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
@@ -74,7 +74,7 @@ public class WXModuleManager {
 
     final Iterator<Entry<String, RegisterCache.ModuleCache>> iterator = moduleCacheMap.entrySet().iterator();
     WXBridgeManager.getInstance()
-            .post(new Runnable() {
+            .postWithName(new Runnable() {
               @Override
               public void run() {
                 Map<String, Object> modules = new HashMap<>();
@@ -117,7 +117,7 @@ public class WXModuleManager {
                 }
                 WXSDKManager.getInstance().registerModules(modules);
               }
-            });
+            },null,"registerModule From Cache");
     return true;
   }
 
@@ -140,7 +140,7 @@ public class WXModuleManager {
 
     //execute task in js thread to make sure register order is same as the order invoke register method.
     WXBridgeManager.getInstance()
-            .post(new Runnable() {
+            .postWithName(new Runnable() {
               @Override
               public void run() {
                 if (sModuleFactoryMap != null && sModuleFactoryMap.containsKey(moduleName)) {
@@ -170,7 +170,7 @@ public class WXModuleManager {
 
                 }
               }
-            });
+            },null,"registerModule");
     return true;
 
   }
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 5e69b5c..da33222 100755
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -59,6 +59,8 @@ public interface IWXBridge extends IWXObject {
   void updateInitFrameworkParams(String key, String value, String desc);
 
 
+  void setLogType(float type, boolean isPerf);
+
   void refreshInstance(String instanceId, String namespace, String function, WXJSObject[] args);
 
   /**
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXThread.java b/android/sdk/src/main/java/com/taobao/weex/common/WXThread.java
index 7cec9e9..f8afc56 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXThread.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXThread.java
@@ -23,7 +23,13 @@ import android.os.Handler.Callback;
 import android.os.HandlerThread;
 import android.os.Message;
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
 import com.taobao.weex.utils.WXLogUtils;
+import com.taobao.weex.utils.tools.LogDetail;
+
+import java.lang.ref.WeakReference;
+
+import static com.taobao.weex.utils.tools.TimeCalculator.PLATFORM_ANDROID;
 
 /**
  * Thread used in weex
@@ -35,17 +41,37 @@ public class WXThread extends HandlerThread {
   static class SafeRunnable implements Runnable {
 
     static final String TAG = "SafeRunnable";
-
+    private LogDetail mTimelineLog = null;
+    private WeakReference<WXSDKInstance> mInstance;
     final Runnable mTask;
     SafeRunnable(Runnable task){
-      mTask = task;
+      this(task,null);
+    }
+
+    SafeRunnable(Runnable task, String taskName){
+      this(task,null, taskName);
+    }
+
+    SafeRunnable(Runnable runnable, WXSDKInstance instance, String taskName) {
+      mTask = runnable;
+      if(taskName != null) {
+        mTimelineLog = new LogDetail();
+        mTimelineLog.info.platform = PLATFORM_ANDROID;
+        mTimelineLog.name(taskName);
+        mInstance = new WeakReference<>(instance);
+      }
     }
 
     @Override
     public void run() {
       try {
-        if(mTask != null)
+        if(mTask != null) {
+          if (mTimelineLog != null)
+            mTimelineLog.taskStart();
           mTask.run();
+          if (mTimelineLog != null)
+            mTimelineLog.taskEnd();
+        }
       }catch (Throwable e){
         //catch everything may throw from exection.
         if(WXEnvironment.isApkDebugable()){
@@ -54,6 +80,16 @@ public class WXThread extends HandlerThread {
         }
         WXLogUtils.w(TAG, e);
       }
+
+      if (mTimelineLog != null) {
+        if(mInstance != null) {
+          WXSDKInstance wxsdkInstance = mInstance.get();
+          if(wxsdkInstance != null) {
+            wxsdkInstance.mTimeCalculator.addLog(mTimelineLog);
+          }
+        }
+      }
+
     }
   }
 
@@ -90,10 +126,15 @@ public class WXThread extends HandlerThread {
    * @return
    */
   public static Runnable secure(Runnable runnable){
+    return secure(runnable, null, null);
+  }
+
+
+  public static Runnable secure(Runnable runnable, WXSDKInstance instance, String runnableName){
     if(runnable == null || runnable instanceof SafeRunnable){
       return runnable;
     }
-    return new SafeRunnable(runnable);
+    return new SafeRunnable(runnable,instance, runnableName);
   }
 
   public static Callback secure(Callback callback){
diff --git a/android/sdk/src/main/java/com/taobao/weex/ui/module/ConsoleLogModule.java b/android/sdk/src/main/java/com/taobao/weex/ui/module/ConsoleLogModule.java
index e34dd81..3db7cef 100644
--- a/android/sdk/src/main/java/com/taobao/weex/ui/module/ConsoleLogModule.java
+++ b/android/sdk/src/main/java/com/taobao/weex/ui/module/ConsoleLogModule.java
@@ -21,9 +21,12 @@ package com.taobao.weex.ui.module;
 import android.support.annotation.Nullable;
 import android.support.v4.util.ArrayMap;
 import android.text.TextUtils;
+import android.util.Log;
+
 import com.taobao.weex.WXEnvironment;
 import com.taobao.weex.annotation.JSMethod;
 import com.taobao.weex.bridge.JSCallback;
+import com.taobao.weex.bridge.WXBridgeManager;
 import com.taobao.weex.common.WXModule;
 import com.taobao.weex.utils.LogLevel;
 import java.util.Map;
@@ -37,6 +40,7 @@ public class ConsoleLogModule extends WXModule {
     Map<String, String> ret = new ArrayMap<>();
     if (logLevelEnum != null) {
       WXEnvironment.sLogLevel = logLevelEnum;
+      WXBridgeManager.getInstance().setLogLevel(WXEnvironment.sLogLevel.getValue(),WXEnvironment.isPerf());
       ret.put("status", "success");
     } else {
       ret.put("status", "failure");
@@ -48,6 +52,12 @@ public class ConsoleLogModule extends WXModule {
 
   }
 
+  @JSMethod(uiThread = false)
+  public void setPerfMode(@Nullable String on) {
+    WXEnvironment.isPerf = "true".equals(on);
+    WXBridgeManager.getInstance().setLogLevel(WXEnvironment.sLogLevel.getValue(),WXEnvironment.isPerf());
+  }
+
   private @Nullable LogLevel getLogLevel(@Nullable String logLevel) {
     LogLevel logLevelEnum = null;
     if(!TextUtils.isEmpty(logLevel)){
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/LogLevel.java b/android/sdk/src/main/java/com/taobao/weex/utils/LogLevel.java
index e96ce3f..a590820 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/LogLevel.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/LogLevel.java
@@ -24,8 +24,9 @@ import android.util.Log;
  * Created by lixinke on 16/5/11.
  */
 public enum LogLevel {
-  OFF("off",7, Log.ASSERT),
-  WTF("wtf", 6, Log.ASSERT),
+  OFF("off",8, Log.ASSERT),
+  WTF("wtf", 7, Log.ASSERT),
+  TLOG("tlog",6,Log.ERROR), //Add For Son Process
   ERROR("error", 5, Log.ERROR),
   WARN("warn", 4, Log.WARN),
   INFO("info", 3, Log.INFO),
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
index b4f4326..2560777 100644
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXLogUtils.java
@@ -21,7 +21,13 @@ package com.taobao.weex.utils;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.util.Log;
+
+import com.alibaba.fastjson.JSON;
 import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.utils.tools.LogDetail;
+
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
@@ -30,6 +36,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
+import static com.taobao.weex.utils.tools.TimeCalculator.TIMELINE_TAG;
+
 public class WXLogUtils {
 
   public static final String WEEX_TAG = "weex";
@@ -131,6 +139,22 @@ public class WXLogUtils {
     e(tag, new String(msg));
   }
 
+  public static void performance(String instanceId, byte[]msg) {
+//    String s = new String(msg);
+//    if(!TextUtils.isEmpty(instanceId)) {
+//      WXSDKInstance sdkInstance = WXSDKManager.getInstance().getSDKInstance(instanceId);
+//      if(sdkInstance != null) {
+//        int i = s.indexOf(",");
+//        if(i >=0 && i < s.length()) {
+//          String substring = s.substring(s.indexOf(",") + 1);
+//          LogDetail logDetail = JSON.parseObject(substring,LogDetail.class);
+//          sdkInstance.mTimeCalculator.addLog(logDetail);
+//        }
+//      }
+//    }
+//    Log.e(TIMELINE_TAG, "from WeexCore" + s);
+  }
+
   public static void wtf(String msg){
     wtf(WEEX_TAG, msg);
   }
diff --git a/weex_core/Source/android/wrap/log_utils.h b/android/sdk/src/main/java/com/taobao/weex/utils/tools/Info.java
similarity index 53%
copy from weex_core/Source/android/wrap/log_utils.h
copy to android/sdk/src/main/java/com/taobao/weex/utils/tools/Info.java
index 5bdf164..a9dd401 100644
--- a/weex_core/Source/android/wrap/log_utils.h
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/tools/Info.java
@@ -16,21 +16,40 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package com.taobao.weex.utils.tools;
 
-#ifndef WEEX_PROJECT_LOG_UTILS_H
-#define WEEX_PROJECT_LOG_UTILS_H
+import com.alibaba.fastjson.annotation.JSONField;
 
-#include <jni.h>
-#include "base/log_defines.h"
-#include "core/bridge/log_bridge.h"
+public class Info{
 
-namespace WeexCore {
-class LogUtils : public LogBridge {
- public:
-  static bool RegisterJNIUtils(JNIEnv* env);
-  static void NativeLog(JNIEnv* env, const char* str_array);
-  void log(LogLevel level, const char* tag,  const char* file, unsigned long line, const char* log) override;
-};
-}  // namespace WeexCore
+	public Info() {
+		taskInfo = new TaskInfo();
+	}
 
-#endif  // WEEX_PROJECT_LOG_UTILS_H
+	@JSONField(name="instanceId")
+	public String instanceId;
+
+	@JSONField(name="taskName")
+	public String taskName;
+
+	@JSONField(name="taskInfo")
+	public TaskInfo taskInfo;
+
+	@JSONField(name="platform")
+	public String platform;
+
+	@JSONField(name="taskId")
+	public int taskId;
+
+	@Override
+ 	public String toString(){
+		return 
+			"Info : {" +
+			"instanceId = '" + instanceId + '\'' + 
+			",taskName = '" + taskName + '\'' + 
+			",taskInfo = '" + taskInfo + '\'' + 
+			",platform = '" + platform + '\'' + 
+			",taskId = '" + taskId + '\'' + 
+			"}";
+		}
+}
\ No newline at end of file
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/tools/LogDetail.java b/android/sdk/src/main/java/com/taobao/weex/utils/tools/LogDetail.java
new file mode 100644
index 0000000..d7b3211
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/tools/LogDetail.java
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.utils.tools;
+
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.taobao.weex.WXEnvironment;
+
+public class LogDetail {
+    public static final String KeyWrod_Init = "Weex_Init";
+    public static final String KeyWords_Render = "Weex_Render";
+
+    public LogDetail() {
+        time = new Time();
+        info = new Info();
+    }
+
+    @JSONField(name = "time")
+    public Time time;
+
+    @JSONField(name = "Info")
+    public Info info;
+
+    @Override
+    public String toString() {
+        return
+                "taskName : " + info.taskName + " - LogDetail : {" +
+                        "time = '" + time + '\'' +
+                        ", info = '" + info + '\'' +
+                        "}";
+    }
+
+
+    public String keyWords = KeyWords_Render;
+
+    public void println() {
+        if(WXEnvironment.isPerf())
+        Log.e(TimeCalculator.TIMELINE_TAG," timeline " + this.keyWords + " java LogDetail: " + this.toString());
+    }
+
+    public void name(String name) {
+        time.constructor();
+        info.taskName = name;
+        if(!TextUtils.isEmpty(name)) {
+            String s = name.toLowerCase();
+            if(s.contains("module")
+            || s.contains("component")
+                    || s.contains("framework")) {
+                this.keyWords = KeyWrod_Init;
+            }
+        }
+    }
+
+    public void keyWorkds(String keyWords) {
+        this.keyWords = keyWords;
+    }
+
+    public void taskStart() {
+        time.taskStart();
+    }
+
+    public void taskEnd() {
+        time.taskEnd();
+        println();
+    }
+
+}
\ No newline at end of file
diff --git a/weex_core/Source/core/bridge/log_bridge.h b/android/sdk/src/main/java/com/taobao/weex/utils/tools/LogSwitch.java
similarity index 53%
copy from weex_core/Source/core/bridge/log_bridge.h
copy to android/sdk/src/main/java/com/taobao/weex/utils/tools/LogSwitch.java
index 91ad11e..8dc4c4a 100644
--- a/weex_core/Source/core/bridge/log_bridge.h
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/tools/LogSwitch.java
@@ -16,16 +16,39 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package com.taobao.weex.utils.tools;
 
-#pragma once
+public class LogSwitch {
+
+    private int low_level = 4;
+    private int medium_level = 2;
+    private int high_level = 1;
+    private int log_switch = 0;
+    private boolean showLowLevelLog = false;
+    private boolean showMediumLevelLog = false;
+    private boolean showHighLevelLog = true;
+
+
+    public void setLog_switch() {
+        // Todo
+        // read prop
+
+        if (showLowLevelLog)
+            log_switch |= low_level;
+
+        if (showMediumLevelLog) {
+            log_switch |= medium_level;
+        }
+
+        if (showHighLevelLog) {
+            log_switch |= high_level;
+        }
+    }
+
+
+    public int getLog_switch() {
+        return log_switch;
+    }
 
-namespace WeexCore {
 
-    class LogBridge {
-    public:
-        LogBridge() {}
-        
-        virtual void log(LogLevel level, const char* tag, const char* file, unsigned long line, const char* log) {};
-    };
-    
 }
diff --git a/weex_core/Source/core/bridge/log_bridge.h b/android/sdk/src/main/java/com/taobao/weex/utils/tools/TaskInfo.java
similarity index 68%
rename from weex_core/Source/core/bridge/log_bridge.h
rename to android/sdk/src/main/java/com/taobao/weex/utils/tools/TaskInfo.java
index 91ad11e..67bae84 100644
--- a/weex_core/Source/core/bridge/log_bridge.h
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/tools/TaskInfo.java
@@ -16,16 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package com.taobao.weex.utils.tools;
 
-#pragma once
+import com.alibaba.fastjson.annotation.JSONField;
 
-namespace WeexCore {
+public class TaskInfo{
 
-    class LogBridge {
-    public:
-        LogBridge() {}
-        
-        virtual void log(LogLevel level, const char* tag, const char* file, unsigned long line, const char* log) {};
-    };
-    
-}
+	@JSONField(name="args")
+	public String args;
+
+	@JSONField(name="relateTaskId")
+	public int relateTaskId;
+
+	@Override
+ 	public String toString(){
+		return 
+			"TaskInfo{" + 
+			"args = '" + args + '\'' + 
+			",relateTaskId = '" + relateTaskId + '\'' + 
+			"}";
+		}
+}
\ No newline at end of file
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/tools/Time.java b/android/sdk/src/main/java/com/taobao/weex/utils/tools/Time.java
new file mode 100644
index 0000000..edeab93
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/tools/Time.java
@@ -0,0 +1,83 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.utils.tools;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+public class Time {
+
+    @JSONField(name = "taskStart")
+    public long taskStart;
+
+    @JSONField(name = "execTime")
+    public long execTime;
+
+    @JSONField(name = "constructor")
+    public long constructor;
+
+    @JSONField(name = "destructor")
+    public long destructor;
+
+    @JSONField(name = "taskEnd")
+    public long taskEnd;
+
+    @JSONField(name = "waitTime")
+    public long waitTime;
+
+    @Override
+    public String toString() {
+        return
+                "time : {" +
+                        "constructor = '" + constructor + '\'' +
+                        ",taskStart = '" + taskStart + '\'' +
+                        ",execTime = '" + execTime + '\'' +
+                        ",waitTime = '" + waitTime + '\'' +
+                        ",destructor = '" + destructor + '\'' +
+                        ",taskEnd = '" + taskEnd + '\'' +
+                        "}";
+    }
+
+
+    protected void constructor() {
+        constructor = System.currentTimeMillis();
+    }
+
+    public void execTime() {
+        execTime = taskEnd - taskStart;
+    }
+
+    public void taskStart() {
+        taskStart = System.currentTimeMillis();
+    }
+
+    public void taskEnd() {
+        taskEnd = System.currentTimeMillis();
+        execTime();
+        destructor();
+    }
+
+    private void destructor() {
+        waitTime();
+        destructor = System.currentTimeMillis();
+    }
+
+    public void waitTime() {
+        waitTime = taskStart - constructor;
+    }
+}
\ No newline at end of file
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/tools/TimeCalculator.java b/android/sdk/src/main/java/com/taobao/weex/utils/tools/TimeCalculator.java
new file mode 100644
index 0000000..1e3eb2d
--- /dev/null
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/tools/TimeCalculator.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package com.taobao.weex.utils.tools;
+
+import android.util.Log;
+
+import com.alibaba.fastjson.JSON;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKInstance;
+
+import java.util.concurrent.CopyOnWriteArrayList;
+
+public class TimeCalculator {
+
+    public static final String TIMELINE_TAG = "timeline";
+
+    public static final String PLATFORM_ANDROID = "Android";
+
+    private CopyOnWriteArrayList<LogDetail> logRecorder;
+    public TimeCalculator(WXSDKInstance instance) {
+        logRecorder = new CopyOnWriteArrayList<LogDetail>();
+    }
+
+    public void addLog(LogDetail logDetail) {
+        if(!WXEnvironment.isPerf()) {
+            return;
+        }
+        logRecorder.add(logDetail);
+    }
+
+    public LogDetail createLogDetail(String name) {
+        LogDetail logDetail = new LogDetail();
+        logDetail.name(name);
+        addLog(logDetail);
+        return logDetail;
+    }
+
+    public void println() {
+        if(!WXEnvironment.isPerf()) {
+            return;
+        }
+
+        for (LogDetail l: logRecorder) {
+            Log.e(TIMELINE_TAG, JSON.toJSONString(l));
+        }
+
+    }
+
+
+    private String test = "{\"time\":{\"execTime\":0,\"constructor\":0,\"destructor\":0,\"taskStart\":0,\"taskEnd\":0,\"waitTime\":0},\"Info\":{\"taskInfo\":{\"relateTaskId\":0,\"args\":\"stringReplace\"},\"taskName\":\"stringReplace\",\"instanceId\":\"1\",\"platform\":\"stringReplace\",\"taskId\":0}}";
+}
diff --git a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
index ef98925..de22be0 100644
--- a/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
+++ b/ios/sdk/WeexSDK.xcodeproj/project.pbxproj
@@ -570,6 +570,10 @@
 		BD9205F82236518700EDF93D /* WXDataRenderHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = BD9205F72236518700EDF93D /* WXDataRenderHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		BD9205FB223651D900EDF93D /* eagle_bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = BD9205F9223651D800EDF93D /* eagle_bridge.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		BD9205FC223651D900EDF93D /* eagle_bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BD9205FA223651D800EDF93D /* eagle_bridge.cpp */; };
+		BDEEADBA22F2902E0099F1D7 /* time_calculator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BDEEADB822F2902D0099F1D7 /* time_calculator.cpp */; };
+		BDEEADBB22F2902E0099F1D7 /* time_calculator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BDEEADB822F2902D0099F1D7 /* time_calculator.cpp */; };
+		BDEEADBC22F2902E0099F1D7 /* time_calculator.h in Headers */ = {isa = PBXBuildFile; fileRef = BDEEADB922F2902E0099F1D7 /* time_calculator.h */; };
+		BDEEADBD22F2902E0099F1D7 /* time_calculator.h in Headers */ = {isa = PBXBuildFile; fileRef = BDEEADB922F2902E0099F1D7 /* time_calculator.h */; };
 		C401945E1E344E8300D19C31 /* WXFloatCompareTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C401945D1E344E8300D19C31 /* WXFloatCompareTests.m */; };
 		C41E1A971DC1FD15009C7F90 /* WXDatePickerManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C41E1A951DC1FD15009C7F90 /* WXDatePickerManager.h */; };
 		C41E1A981DC1FD15009C7F90 /* WXDatePickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = C41E1A961DC1FD15009C7F90 /* WXDatePickerManager.m */; };
@@ -1306,6 +1310,8 @@
 		BD9205F72236518700EDF93D /* WXDataRenderHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXDataRenderHandler.h; sourceTree = "<group>"; };
 		BD9205F9223651D800EDF93D /* eagle_bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eagle_bridge.h; sourceTree = "<group>"; };
 		BD9205FA223651D800EDF93D /* eagle_bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = eagle_bridge.cpp; sourceTree = "<group>"; };
+		BDEEADB822F2902D0099F1D7 /* time_calculator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time_calculator.cpp; sourceTree = "<group>"; };
+		BDEEADB922F2902E0099F1D7 /* time_calculator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = time_calculator.h; sourceTree = "<group>"; };
 		C401945D1E344E8300D19C31 /* WXFloatCompareTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXFloatCompareTests.m; sourceTree = "<group>"; };
 		C41E1A951DC1FD15009C7F90 /* WXDatePickerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WXDatePickerManager.h; sourceTree = "<group>"; };
 		C41E1A961DC1FD15009C7F90 /* WXDatePickerManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WXDatePickerManager.m; sourceTree = "<group>"; };
@@ -2340,6 +2346,8 @@
 				D735F1AA22D761F800B53CDF /* utils */,
 				77E349F6229FE67900B1CDAB /* log_defines.cpp */,
 				77CF6A5421E6E47D00BA8634 /* core_constants.h */,
+				BDEEADB822F2902D0099F1D7 /* time_calculator.cpp */,
+				BDEEADB922F2902E0099F1D7 /* time_calculator.h */,
 				77CF6A5521E6E47D00BA8634 /* log_defines.h */,
 				B8F3323B2141A4C500701BA0 /* string_util.h */,
 				B8D66B892125572F003960BD /* make_copyable.h */,
@@ -2523,6 +2531,7 @@
 				74CFDD451F459443007A1A66 /* WXRecycleListUpdateManager.h in Headers */,
 				74A4BA9A1CB3BAA100195969 /* WXThreadSafeMutableDictionary.h in Headers */,
 				741DFE021DDD7D18009B020F /* WXRoundedRect.h in Headers */,
+				BDEEADBC22F2902E0099F1D7 /* time_calculator.h in Headers */,
 				17C74F0F2072147B00AB4CAB /* WXAnalyzerProtocol.h in Headers */,
 				7423899B1C3174EB00D748CA /* WXWeakObjectWrapper.h in Headers */,
 				74BF19F81F5139BB00AEE3D7 /* WXJSASTParser.h in Headers */,
@@ -2769,6 +2778,7 @@
 				DCA445E31EFA59DA00D0CFA8 /* WXEmbedComponent.h in Headers */,
 				DCA445DF1EFA59BC00D0CFA8 /* WXLoadingComponent.h in Headers */,
 				B8D66C2E21255730003960BD /* render_manager.h in Headers */,
+				BDEEADBD22F2902E0099F1D7 /* time_calculator.h in Headers */,
 				C42E8FAD1F3C7C3F001EBE9D /* WXExtendCallNativeManager.h in Headers */,
 				DCA445CB1EFA590600D0CFA8 /* WXComponent+Layout.h in Headers */,
 				DCA4460F1EFA5A8100D0CFA8 /* WXDiffUtil.h in Headers */,
@@ -3308,6 +3318,7 @@
 				74D205211E091B8000128F44 /* WXCallJSMethod.m in Sources */,
 				BD88C14522F02120004467AA /* render_action_update_richtext_child_attr.cpp in Sources */,
 				C41E1A981DC1FD15009C7F90 /* WXDatePickerManager.m in Sources */,
+				BDEEADBA22F2902E0099F1D7 /* time_calculator.cpp in Sources */,
 				77D1614C1C02E3790010B15B /* WXConvert.m in Sources */,
 				749DC27C1D40827B009E1C91 /* WXMonitor.m in Sources */,
 				C4B834271DE69B09007AD27E /* WXPickerModule.m in Sources */,
@@ -3498,6 +3509,7 @@
 				DCA445951EFA55B300D0CFA8 /* WXRuleManager.m in Sources */,
 				BD88C14622F02120004467AA /* render_action_update_richtext_child_attr.cpp in Sources */,
 				DCA445961EFA55B300D0CFA8 /* WXMonitor.m in Sources */,
+				BDEEADBB22F2902E0099F1D7 /* time_calculator.cpp in Sources */,
 				DCA445971EFA55B300D0CFA8 /* WXComponent+Navigation.m in Sources */,
 				DCA445981EFA55B300D0CFA8 /* WXSDKInstance.m in Sources */,
 				DCA445991EFA55B300D0CFA8 /* WXJSExceptionInfo.m in Sources */,
diff --git a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
index b7bddd1..c8d68d7 100644
--- a/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
+++ b/ios/sdk/WeexSDK/Sources/Bridge/WXCoreBridge.mm
@@ -38,6 +38,7 @@
 #import "WXRichText.h"
 #include "base/core_constants.h"
 #include "base/time_utils.h"
+#include "base/log_defines.h"
 #include "core/manager/weex_core_manager.h"
 #include "core/render/manager/render_manager.h"
 #include "core/render/target/render_target.h"
@@ -1052,9 +1053,9 @@ break; \
     
 #pragma mark - Log Bridge
     
-    class LogBridgeIOS: public LogBridge {
+    class LogBridgeIOS: public weex::base::LogBase {
     public:
-        virtual void log(LogLevel level, const char* tag, const char* file, unsigned long line, const char* log) override {
+        virtual bool log(LogLevel level, const char* tag, const char* file, unsigned long line, const char* log) override {
 #ifdef DEBUG
             switch (level) {
                 case LogLevel::Error:
@@ -1091,6 +1092,7 @@ break; \
             
             [WXLog devLog:wxLogLevel file:file line:line format:@"<%s> %s", tag, log];
 #endif
+            return true;
         }
     };
 }
@@ -1542,7 +1544,15 @@ static WeexCore::ScriptBridge* jsBridge = nullptr;
         env->AddOption("screen_width_pixels", std::to_string(screenSize.width));
         env->AddOption("screen_height_pixels", std::to_string(screenSize.height));
         
-        WeexCore::WeexCoreManager::Instance()->set_log_bridge(new WeexCore::LogBridgeIOS());
+        weex::base::LogImplement::getLog()->setLogImplement(new WeexCore::LogBridgeIOS());
+        
+#ifdef DEBUG
+        weex::base::LogImplement::getLog()->setDebugMode(true);
+#else
+        weex::base::LogImplement::getLog()->setDebugMode(false);
+#endif
+        
+        
         
         platformBridge = new WeexCore::PlatformBridge();
         platformBridge->set_platform_side(new WeexCore::IOSSide());
diff --git a/weex_core/Source/CMakeLists.txt b/weex_core/Source/CMakeLists.txt
index 5016d66..d1bb5fe 100755
--- a/weex_core/Source/CMakeLists.txt
+++ b/weex_core/Source/CMakeLists.txt
@@ -39,6 +39,7 @@ add_definitions(-DPERFORMANCE_LOG=0)
 add_definitions(-DLAYOUT_LOG=0)
 add_definitions(-DJSAPI_LOG=0)
 add_definitions(-DDOM_PARSER_LOG=0)
+add_definitions(-DDEBUG=1)
 
 message("ANDROID_PROJECT_DIR:"${ANDROID_PROJECT_DIR})
 set(LOCAL_LIBRARIES_DIR ${ANDROID_PROJECT_DIR}/libs/${ANDROID_ABI})
diff --git a/weex_core/Source/WXBridge_jni.h b/weex_core/Source/WXBridge_jni.h
index c0ad73f..685f9f5 100644
--- a/weex_core/Source/WXBridge_jni.h
+++ b/weex_core/Source/WXBridge_jni.h
@@ -189,6 +189,9 @@ static void RemoveInstanceRenderType(JNIEnv* env, jobject jcaller,
 static void UpdateGlobalConfig(JNIEnv* env, jobject jcaller,
     jstring config);
 
+static void SetLogType(JNIEnv* env, jobject jcaller, jfloat logLevel,
+                       jfloat isPerf);
+
 // Step 2: method stubs.
 
 static intptr_t g_WXBridge_onReceivedResult = 0;
diff --git a/weex_core/Source/android/bridge/script/script_side_in_multi_process.cpp b/weex_core/Source/android/bridge/script/script_side_in_multi_process.cpp
index af017e1..9958f21 100644
--- a/weex_core/Source/android/bridge/script/script_side_in_multi_process.cpp
+++ b/weex_core/Source/android/bridge/script/script_side_in_multi_process.cpp
@@ -461,7 +461,7 @@ int ScriptSideInMultiProcess::CreateInstance(
     }
     return result->get<jint>();
   } catch (IPCException &e) {
-    LOGE("%s", e.msg());
+    LOGE("%s %s","Create Instance is failed and Error msg is", e.msg());
     // report crash here
     WeexCoreManager::Instance()
         ->getPlatformBridge()
@@ -556,7 +556,6 @@ int ScriptSideInMultiProcess::UpdateGlobalConfig(const char *config) {
 int ScriptSideInMultiProcess::UpdateInitFrameworkParams(const std::string &key,
                                                         const std::string &value,
                                                         const std::string &desc) {
-
   try {
     if(sender_ == nullptr) {
       LOGE("UpdateGlobalConfig sender is null");
@@ -576,6 +575,24 @@ int ScriptSideInMultiProcess::UpdateInitFrameworkParams(const std::string &key,
 
 }
 
+void ScriptSideInMultiProcess::SetLogType(const int logLevel, const bool isPerf) {
+  try {
+    if(sender_ == nullptr) {
+      LOGE("SetLogType sender is null");
+      return;
+    }
+    std::unique_ptr<IPCSerializer> serializer(createIPCSerializer());
+    serializer->setMsg(static_cast<uint32_t>(IPCJSMsg::SETLOGLEVEL));
+    serializer->add(logLevel);
+    serializer->add(isPerf ? 1 : 0);
+    std::unique_ptr<IPCBuffer> buffer = serializer->finish();
+    std::unique_ptr<IPCResult> result = sender_->send(buffer.get());
+  } catch (IPCException &e) {
+    LOGE("%s", e.msg());
+  }
+  return;
+}
+
 }  // namespace script
 }  // namespace bridge
 }  // namespace WeexCore
diff --git a/weex_core/Source/android/bridge/script/script_side_in_multi_process.h b/weex_core/Source/android/bridge/script/script_side_in_multi_process.h
index 341dac1..b4793be 100644
--- a/weex_core/Source/android/bridge/script/script_side_in_multi_process.h
+++ b/weex_core/Source/android/bridge/script/script_side_in_multi_process.h
@@ -72,6 +72,7 @@ class ScriptSideInMultiProcess : public ScriptBridge::ScriptSide {
 
   int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc) override;
 
+  void SetLogType(const int logLevel, const bool isPerf) override;
 
     ScriptSideInMultiProcess();
 
diff --git a/weex_core/Source/android/bridge/script/script_side_in_multi_so.cpp b/weex_core/Source/android/bridge/script/script_side_in_multi_so.cpp
index b84da7d..73c4e0c 100644
--- a/weex_core/Source/android/bridge/script/script_side_in_multi_so.cpp
+++ b/weex_core/Source/android/bridge/script/script_side_in_multi_so.cpp
@@ -184,6 +184,15 @@ int ScriptSideInMultiSo::UpdateInitFrameworkParams(const std::string &key, const
   return script_side_functions_->funcUpdateInitFrameworkParams(key, value, desc);
 }
 
+void ScriptSideInMultiSo::SetLogType(const int logLevel, const bool isPerf) {
+  if(script_side_functions_ == nullptr) {
+    LOGE("ScriptSideInMultiSo::UpdateInitFrameworkParams script_side_functions_ is null");
+    return;
+  }
+  return script_side_functions_->funcSetLogType(logLevel, isPerf);
+
+}
+
 }  // namespace script
 }  // namespace bridge
 }  // namespace WeexCore
diff --git a/weex_core/Source/android/bridge/script/script_side_in_multi_so.h b/weex_core/Source/android/bridge/script/script_side_in_multi_so.h
index e6fa9b0..bd7faa0 100644
--- a/weex_core/Source/android/bridge/script/script_side_in_multi_so.h
+++ b/weex_core/Source/android/bridge/script/script_side_in_multi_so.h
@@ -71,6 +71,7 @@ class ScriptSideInMultiSo : public ScriptBridge::ScriptSide {
 
   int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc)override;
 
+  void SetLogType(const int logLevel, const bool isPerf)override ;
 
     ScriptSideInMultiSo();
 
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 ece6adb..524a9e6 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
@@ -16,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+#include "base/log_defines.h"
 #include "script_bridge_in_multi_process.h"
 
 #include "android/utils/params_utils.h"
@@ -952,16 +953,6 @@ std::unique_ptr<IPCResult> UpdateComponentData(IPCArguments *arguments) {
 }
 
 
-std::unique_ptr<IPCResult> Tlog(IPCArguments *arguments) {
-  auto arg1 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
-  auto arg2 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
-  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
-          weex::base::MakeCopyable(
-                  [tag = std::move(arg1), log = std::move(arg2)]() {
-                      LOGE_TAG(tag.get(),"%s",log.get());
-                  }));
-  return createInt32Result(static_cast<int32_t>(true));
-}
 
 
 std::unique_ptr<IPCResult> HeartBeat(IPCArguments *arguments) {
@@ -980,6 +971,30 @@ std::unique_ptr<IPCResult> HeartBeat(IPCArguments *arguments) {
   return createInt32Result(static_cast<int32_t>(true));
 }
 
+std::unique_ptr<IPCResult> HandleLogDetail(IPCArguments *arguments) {
+  auto arg1 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 0));
+  auto arg2 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 1));
+  auto arg3 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 2));
+  auto arg4 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 3));
+  auto arg5 = std::unique_ptr<char[]>(getArumentAsCStr(arguments, 4));
+
+  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
+      weex::base::MakeCopyable(
+          [level_str = std::move(arg1), tag_ptr = std::move(arg2),
+              file_ptr = std::move(arg3), line_ptr = std::move(arg4), log_ptr = std::move(arg5)]() {
+            int level = (level_str == nullptr || level_str.get() == nullptr)
+                        ? ((int) (WeexCore::LogLevel::Debug)) : atoi(level_str.get());
+            long line =
+                (line_ptr == nullptr || line_ptr.get() == nullptr) ? 0 : atol(line_ptr.get());
+            weex::base::LogImplement::getLog()->log((WeexCore::LogLevel) level,
+                                                    tag_ptr.get(),
+                                                    file_ptr.get(),
+                                                    line,
+                                                    log_ptr.get());
+          }));
+  return createInt32Result(static_cast<int32_t>(true));
+}
+
 ScriptBridgeInMultiProcess::ScriptBridgeInMultiProcess() {
   set_script_side(new bridge::script::ScriptSideInMultiProcess);
   set_core_side(new CoreSideInScript);
@@ -1073,10 +1088,10 @@ void ScriptBridgeInMultiProcess::RegisterIPCCallback(IPCHandler *handler) {
                            OnReceivedResult);
   handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::UPDATECOMPONENTDATA),
                            UpdateComponentData);
-  handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::TLOGMSG),
-                           Tlog);
   handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::HEARTBEAT),
                            HeartBeat);
+  handler->registerHandler(static_cast<uint32_t>(IPCProxyMsg::POSTLOGDETAIL),
+                           HandleLogDetail);
 }
 
 }  // namespace WeexCore
diff --git a/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp b/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
index 706686f..a41d725 100644
--- a/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
+++ b/weex_core/Source/android/bridge/script_bridge_in_multi_so.cpp
@@ -20,6 +20,7 @@
 #include "script_bridge_in_multi_so.h"
 #include <dlfcn.h>
 #include <malloc.h>
+#include "base/log_defines.h"
 
 #include "android/bridge/multi_so_initializer.h"
 #include "android/bridge/script/script_side_in_multi_so.h"
@@ -54,8 +55,8 @@ ScriptBridgeInMultiSo::ScriptBridgeInMultiSo() {
         typedef FunctionsExposedByJS *(*ExchangeJSBridgeFunctions)(
             FunctionsExposedByCore *);
         auto exchange_script_bridge_functions =
-            (ExchangeJSBridgeFunctions)dlsym(handle,
-                                             "ExchangeJSBridgeFunctions");
+            (ExchangeJSBridgeFunctions) dlsym(handle,
+                                              "ExchangeJSBridgeFunctions");
         if (!exchange_script_bridge_functions) {
           return false;
         }
@@ -87,8 +88,8 @@ static void CallNative(const char *page_id, const char *task,
 
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                task = std::string(task),
-                                callback = std::string(callback)] {
+                                   task = std::string(task),
+                                   callback = std::string(callback)] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->CallNative(
             page_id.c_str(), task.c_str(), callback.c_str());
       }));
@@ -109,23 +110,23 @@ static std::unique_ptr<ValueWithType> CallNativeModule(
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable(
           [page_id = std::string(page_id), module = std::string(module),
-           method = std::string(method),
-           arguments =
-               std::unique_ptr<char[]>(copyStr(arguments, arguments_length)),
-           arguments_length = arguments_length,
-           options = std::unique_ptr<char[]>(copyStr(options, options_length)),
-           options_length = options_length, e = &event, ret = &ret] {
+              method = std::string(method),
+              arguments =
+              std::unique_ptr<char[]>(copyStr(arguments, arguments_length)),
+              arguments_length = arguments_length,
+              options = std::unique_ptr<char[]>(copyStr(options, options_length)),
+              options_length = options_length, e = &event, ret = &ret] {
             *ret = WeexCoreManager::Instance()
-                       ->script_bridge()
-                       ->core_side()
-                       ->CallNativeModule(page_id.c_str(), module.c_str(),
-                                          method.c_str(), arguments.get(),
-                                          arguments_length, options.get(),
-                                          options_length);
+                ->script_bridge()
+                ->core_side()
+                ->CallNativeModule(page_id.c_str(), module.c_str(),
+                                   method.c_str(), arguments.get(),
+                                   arguments_length, options.get(),
+                                   options_length);
             e->Signal();
           }));
   event.Wait();
-    return ret;
+  return ret;
 }
 
 static void CallNativeComponent(const char *page_id, const char *ref,
@@ -142,12 +143,12 @@ static void CallNativeComponent(const char *page_id, const char *ref,
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable(
           [page_id = std::string(page_id), ref = std::string(ref),
-           method = std::string(method),
-           arguments =
-               std::unique_ptr<char[]>(copyStr(arguments, arguments_length)),
-           arguments_length = arguments_length,
-           options = std::unique_ptr<char[]>(copyStr(options, options_length)),
-           options_length = options_length] {
+              method = std::string(method),
+              arguments =
+              std::unique_ptr<char[]>(copyStr(arguments, arguments_length)),
+              arguments_length = arguments_length,
+              options = std::unique_ptr<char[]>(copyStr(options, options_length)),
+              options_length = options_length] {
             WeexCoreManager::Instance()
                 ->script_bridge()
                 ->core_side()
@@ -165,11 +166,11 @@ static void AddElement(const char *page_id, const char *parent_ref,
 
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                parent_ref = std::string(parent_ref),
-                                dom_str = std::unique_ptr<char[]>(
-                                    copyStr(dom_str, domLen)),
-                                dom_len = domLen,
-                                index_str = std::string(index_str)] {
+                                   parent_ref = std::string(parent_ref),
+                                   dom_str = std::unique_ptr<char[]>(
+                                       copyStr(dom_str, domLen)),
+                                   dom_len = domLen,
+                                   index_str = std::string(index_str)] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->AddElement(
             page_id.c_str(), parent_ref.c_str(), dom_str.get(), dom_len,
             index_str.c_str());
@@ -182,7 +183,7 @@ static void SetTimeout(const char *callback_id, const char *time) {
 
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([callback_id = std::string(callback_id),
-                                time = std::string(time)] {
+                                   time = std::string(time)] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->SetTimeout(
             callback_id.c_str(), time.c_str());
       }));
@@ -205,9 +206,9 @@ static void CreateBody(const char *page_id, const char *dom_str, int domLen) {
 
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                dom_str = std::unique_ptr<char[]>(
-                                    copyStr(dom_str, domLen)),
-                                dom_len = domLen] {
+                                   dom_str = std::unique_ptr<char[]>(
+                                       copyStr(dom_str, domLen)),
+                                   dom_len = domLen] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->CreateBody(
             page_id.c_str(), dom_str.get(), dom_len);
       }));
@@ -225,15 +226,15 @@ static int UpdateFinish(const char *page_id, const char *task, int taskLen,
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable(
           [page_id = std::string(page_id),
-           task = std::unique_ptr<char[]>(copyStr(task, taskLen)),
-           task_len = taskLen,
-           callback = std::unique_ptr<char[]>(copyStr(callback, callbackLen)),
-           callback_len = callbackLen, event = &event, result = &result] {
+              task = std::unique_ptr<char[]>(copyStr(task, taskLen)),
+              task_len = taskLen,
+              callback = std::unique_ptr<char[]>(copyStr(callback, callbackLen)),
+              callback_len = callbackLen, event = &event, result = &result] {
             *result = WeexCoreManager::Instance()
-                          ->script_bridge()
-                          ->core_side()
-                          ->UpdateFinish(page_id.c_str(), task.get(), task_len,
-                                         callback.get(), callback_len);
+                ->script_bridge()
+                ->core_side()
+                ->UpdateFinish(page_id.c_str(), task.get(), task_len,
+                               callback.get(), callback_len);
             event->Signal();
           }));
   event.Wait();
@@ -262,7 +263,7 @@ static int RefreshFinish(const char *page_id, const char *task,
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable(
           [page_id = std::string(page_id), task = std::string(task),
-           callback = std::string(callback), event = &event] {
+              callback = std::string(callback), event = &event] {
             WeexCoreManager::Instance()
                 ->script_bridge()
                 ->core_side()
@@ -281,10 +282,10 @@ static void UpdateAttrs(const char *page_id, const char *ref, const char *data,
   //      page_id, ref, data, dataLen);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                ref = std::string(ref),
-                                data = std::unique_ptr<char[]>(
-                                    copyStr(data, dataLen)),
-                                data_len = dataLen] {
+                                   ref = std::string(ref),
+                                   data = std::unique_ptr<char[]>(
+                                       copyStr(data, dataLen)),
+                                   data_len = dataLen] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->UpdateAttrs(
             page_id.c_str(), ref.c_str(), data.get(), data_len);
       }));
@@ -296,10 +297,10 @@ static void UpdateStyle(const char *page_id, const char *ref, const char *data,
   //      page_id, ref, data, dataLen);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                ref = std::string(ref),
-                                data = std::unique_ptr<char[]>(
-                                    copyStr(data, dataLen)),
-                                data_len = dataLen] {
+                                   ref = std::string(ref),
+                                   data = std::unique_ptr<char[]>(
+                                       copyStr(data, dataLen)),
+                                   data_len = dataLen] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->UpdateStyle(
             page_id.c_str(), ref.c_str(), data.get(), data_len);
       }));
@@ -324,9 +325,9 @@ static void MoveElement(const char *page_id, const char *ref,
   //      page_id, ref, parent_ref, index);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                ref = std::string(ref),
-                                parent_ref = std::string(parent_ref),
-                                index = index] {
+                                   ref = std::string(ref),
+                                   parent_ref = std::string(parent_ref),
+                                   index = index] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->MoveElement(
             page_id.c_str(), ref.c_str(), parent_ref.c_str(), index);
       }));
@@ -337,8 +338,8 @@ static void AddEvent(const char *page_id, const char *ref, const char *event) {
   //      page_id, ref, event);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                ref = std::string(ref),
-                                event = std::string(event)] {
+                                   ref = std::string(ref),
+                                   event = std::string(event)] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->AddEvent(
             page_id.c_str(), ref.c_str(), event.c_str());
       }));
@@ -350,8 +351,8 @@ static void RemoveEvent(const char *page_id, const char *ref,
   //      page_id, ref, event);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                ref = std::string(ref),
-                                event = std::string(event)] {
+                                   ref = std::string(ref),
+                                   event = std::string(event)] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->RemoveEvent(
             page_id.c_str(), ref.c_str(), event.c_str());
       }));
@@ -359,20 +360,20 @@ static void RemoveEvent(const char *page_id, const char *ref,
 static const char *CallGCanvasLinkNative(const char *context_id, int type,
                                          const char *arg) {
 
-    weex::base::WaitableEvent event;
-    char *ret = nullptr;
-
-    WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
-            weex::base::MakeCopyable([page_id = std::string(context_id),
-                                             t = type,
-                                             args = std::string(arg), e = &event, ret = &ret] {
-                *ret = const_cast<char *>(WeexCoreManager::Instance()
-                                        ->script_bridge()
-                                        ->core_side()
-                                        ->CallGCanvasLinkNative(page_id.c_str(), t, args.c_str()));
-                e->Signal();
-            }));
-    event.Wait();
+  weex::base::WaitableEvent event;
+  char *ret = nullptr;
+
+  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
+      weex::base::MakeCopyable([page_id = std::string(context_id),
+                                   t = type,
+                                   args = std::string(arg), e = &event, ret = &ret] {
+        *ret = const_cast<char *>(WeexCoreManager::Instance()
+            ->script_bridge()
+            ->core_side()
+            ->CallGCanvasLinkNative(page_id.c_str(), t, args.c_str()));
+        e->Signal();
+      }));
+  event.Wait();
 
   return ret;
 }
@@ -389,7 +390,7 @@ static void ClearInterval(const char *page_id, const char *callback_id) {
 
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                callback_id = std::string(callback_id)] {
+                                   callback_id = std::string(callback_id)] {
         WeexCoreManager::Instance()
             ->script_bridge()
             ->core_side()
@@ -399,20 +400,20 @@ static void ClearInterval(const char *page_id, const char *callback_id) {
 
 static const char *CallT3DLinkNative(int type, const char *arg) {
 
-    weex::base::WaitableEvent event;
-    char *ret = nullptr;
-
-    WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
-            weex::base::MakeCopyable([
-                                             t = type,
-                                             args = std::string(arg), e = &event, ret = &ret] {
-                *ret = const_cast<char *>(WeexCoreManager::Instance()
-                        ->script_bridge()
-                        ->core_side()
-                        ->CallT3DLinkNative(t, args.c_str()));
-                e->Signal();
-            }));
-    event.Wait();
+  weex::base::WaitableEvent event;
+  char *ret = nullptr;
+
+  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
+      weex::base::MakeCopyable([
+                                   t = type,
+                                   args = std::string(arg), e = &event, ret = &ret] {
+        *ret = const_cast<char *>(WeexCoreManager::Instance()
+            ->script_bridge()
+            ->core_side()
+            ->CallT3DLinkNative(t, args.c_str()));
+        e->Signal();
+      }));
+  event.Wait();
 
   return ret;
 }
@@ -422,9 +423,9 @@ static void PostMessage(const char *vim_id, const char *data, int dataLength) {
   //                                                                         data);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([vim_id = std::string(vim_id),
-                                data = std::string(data), length = dataLength] {
+                                   data = std::string(data), length = dataLength] {
         WeexCoreManager::Instance()->script_bridge()->core_side()->PostMessage(
-            vim_id.c_str(), data.c_str(),length);
+            vim_id.c_str(), data.c_str(), length);
       }));
 }
 
@@ -435,11 +436,11 @@ static void DispatchMessage(const char *client_id, const char *data, int dataLen
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable(
           [client_id = std::string(client_id), data = std::string(data),
-           callback = std::string(callback), vm_id = std::string(vm_id), length = dataLength] {
+              callback = std::string(callback), vm_id = std::string(vm_id), length = dataLength] {
             WeexCoreManager::Instance()
                 ->script_bridge()
                 ->core_side()
-                ->DispatchMessage(client_id.c_str(), data.c_str(),length,
+                ->DispatchMessage(client_id.c_str(), data.c_str(), length,
                                   callback.c_str(), vm_id.c_str());
           }));
 }
@@ -452,14 +453,14 @@ static std::unique_ptr<WeexJSResult> DispatchMessageSync(const char *client_id,
   std::unique_ptr<WeexJSResult> result;
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([client_id = std::string(client_id),
-                                data = std::string(data),
-                                vm_id = std::string(vm_id), length = dataLength,
-                                e = &event, r = &result]() {
+                                   data = std::string(data),
+                                   vm_id = std::string(vm_id), length = dataLength,
+                                   e = &event, r = &result]() {
         *r = WeexCoreManager::Instance()
-                 ->script_bridge()
-                 ->core_side()
-                 ->DispatchMessageSync(client_id.c_str(), data.c_str(), length,
-                                       vm_id.c_str());
+            ->script_bridge()
+            ->core_side()
+            ->DispatchMessageSync(client_id.c_str(), data.c_str(), length,
+                                  vm_id.c_str());
         e->Signal();
       }));
   event.Wait();
@@ -479,12 +480,13 @@ static void OnReceivedResult(long callback_id,
       }));
 }
 
-static void UpdateComponentData(const char* page_id,
-                                const char* cid,
-                                const char* json_data) {
+static void UpdateComponentData(const char *page_id,
+                                const char *cid,
+                                const char *json_data) {
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable(
-          [page_id = std::string(page_id), cid = std::string(cid), json_data = std::string(json_data)]() {
+          [page_id = std::string(page_id), cid = std::string(cid),
+              json_data = std::string(json_data)]() {
             WeexCoreManager::Instance()
                 ->script_bridge()
                 ->core_side()
@@ -492,14 +494,32 @@ static void UpdateComponentData(const char* page_id,
           }));
 }
 
+static bool Log(int level, const char *tag,
+                const char *file,
+                unsigned long line,
+                const char *log) {
+  WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
+      weex::base::MakeCopyable(
+          [l = level, t = std::string(tag), f = std::string(file), li = line,
+              log_str = std::string(log)]() {
+            weex::base::LogImplement::getLog()->log((LogLevel) l,
+                                                    t.c_str(),
+                                                    f.c_str(),
+                                                    li,
+                                                    log_str.c_str());
+          }));
+
+  return true;
+}
+
 static void ReportException(const char *page_id, const char *func,
                             const char *exception_string) {
   //  WeexCoreManager::Instance()->script_bridge()->core_side()->ReportException(
   //      page_id, func, exception_string);
   WeexCoreManager::Instance()->script_thread()->message_loop()->PostTask(
       weex::base::MakeCopyable([page_id = std::string(page_id),
-                                func = std::string(func),
-                                exception = std::string(exception_string)] {
+                                   func = std::string(func),
+                                   exception = std::string(exception_string)] {
         WeexCoreManager::Instance()
             ->script_bridge()
             ->core_side()
@@ -544,9 +564,10 @@ FunctionsExposedByCore *ScriptBridgeInMultiSo::GetExposedFunctions() {
                                  DispatchMessage,
                                  DispatchMessageSync,
                                  OnReceivedResult,
-                                 UpdateComponentData};
+                                 UpdateComponentData,
+                                 Log};
   auto functions =
-      (FunctionsExposedByCore *)malloc(sizeof(FunctionsExposedByCore));
+      (FunctionsExposedByCore *) malloc(sizeof(FunctionsExposedByCore));
   memset(functions, 0, sizeof(FunctionsExposedByCore));
   memcpy(functions, &temp, sizeof(FunctionsExposedByCore));
   return functions;
diff --git a/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.cpp b/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.cpp
index 4f26bc6..a8c2f8d 100644
--- a/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.cpp
+++ b/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.cpp
@@ -302,5 +302,9 @@ int PlatformBridgeInMultiSo::UpdateInitFrameworkParams(const std::string& key, c
     return Instance()->core_side()->UpdateInitFrameworkParams(key, value, desc);
 }
 
+void PlatformBridgeInMultiSo::SetLogType(const int logLevel, const bool isPerf) {
+  return Instance()->core_side()->SetLogType(logLevel, isPerf);
+}
+
 
 }  // namespace weex
diff --git a/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.h b/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.h
index 72580dc..74c6f2d 100644
--- a/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.h
+++ b/weex_core/Source/android/jsengine/bridge/platform/platform_bridge_in_multi_so.h
@@ -107,8 +107,7 @@ class PlatformBridgeInMultiSo : public WeexCore::PlatformBridge {
   static int DestroyInstance(const char *instanceId);
   static int UpdateGlobalConfig(const char *config);
   static int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc);
-
-
+  static void SetLogType(const int logLevel, const bool isPerf);
 
  private:
   PlatformBridgeInMultiSo();
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 6c0f0d8..d339960 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
@@ -36,477 +36,489 @@
 #include "third_party/IPC/IPCMessageJS.h"
 
 namespace weex {
-    namespace bridge {
-        namespace js {
-            CoreSideInMultiProcess::CoreSideInMultiProcess(WeexIPCClient *client)
-                    : client_(client) {}
-
-            CoreSideInMultiProcess::CoreSideInMultiProcess() : client_(NULL) {}
-
-            CoreSideInMultiProcess::~CoreSideInMultiProcess() {}
-
-            void CoreSideInMultiProcess::CallNative(const char *page_id, const char *task,
-                                                    const char *callback) {
-                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) {
-                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);
-
-                switch (ipc_result->getType()) {
-                    case IPCType::DOUBLE:
-                        ret->type = ParamsType::DOUBLE;
-                        ret->value.doubleValue = ipc_result->get<double>();
-                        break;
-                    case IPCType::STRING:
-                        ret->type = ParamsType::STRING;
-                        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());
-                        break;
-                    case IPCType::BYTEARRAY: {
-                        ret->type = ParamsType::BYTEARRAY;
-                        ret->value.byteArray = genWeexByteArraySS(ipc_result->getByteArrayContent(),
-                                                                  ipc_result->getByteArrayLength());
-                    }
-                        break;
-                    default:
-                        ret->type = ParamsType::JSUNDEFINED;
-                }
-                return ret;
-            }
-
-            void CoreSideInMultiProcess::CallNativeComponent(
-                    const char *page_id, const char *ref, const char *method,
-                    const char *arguments, int arguments_length, const char *options,
-                    int options_length) {
-
-                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);
+namespace bridge {
+namespace js {
+CoreSideInMultiProcess::CoreSideInMultiProcess(WeexIPCClient *client)
+    : client_(client) {}
+
+CoreSideInMultiProcess::CoreSideInMultiProcess() : client_(NULL) {}
+
+CoreSideInMultiProcess::~CoreSideInMultiProcess() {}
+
+void CoreSideInMultiProcess::CallNative(const char *page_id, const char *task,
+                                        const char *callback) {
+  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) {
+  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);
+
+  switch (ipc_result->getType()) {
+    case IPCType::DOUBLE:ret->type = ParamsType::DOUBLE;
+      ret->value.doubleValue = ipc_result->get<double>();
+      break;
+    case IPCType::STRING:ret->type = ParamsType::STRING;
+      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());
+      break;
+    case IPCType::BYTEARRAY: {
+      ret->type = ParamsType::BYTEARRAY;
+      ret->value.byteArray = genWeexByteArraySS(ipc_result->getByteArrayContent(),
+                                                ipc_result->getByteArrayLength());
+    }
+      break;
+    default:ret->type = ParamsType::JSUNDEFINED;
+  }
+  return ret;
+}
+
+void CoreSideInMultiProcess::CallNativeComponent(
+    const char *page_id, const char *ref, const char *method,
+    const char *arguments, int arguments_length, const char *options,
+    int options_length) {
+
+  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) {
-
-                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) {
-
-                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) {
-
-                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) {
-
-                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) {
-
-
-                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 ipc_result->get<int32_t>();
-            }
-
-            void CoreSideInMultiProcess::CreateFinish(const char *page_id) {
-
-
-                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) {
-
-
-                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 ipc_result->get<int32_t>();
-            }
-
-            void CoreSideInMultiProcess::UpdateAttrs(const char *page_id, const char *ref,
-                                                     const char *data, int data_length) {
-
-                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) {
-
-
-                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) {
-
-
-                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) {
-
-                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) {
-
-                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) {
-
-                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) {
-
-                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 {
-                    // LOGE("weexjsc functionGCanvasLinkNative");
-                    // if (result->getType() == IPCType::VOID) {
-                    //     return JSValue::encode(ret);
-                    // } else if (result->getStringLength() > 0) {
-                    //     WTF::String retWString = jString2String(result->getStringContent(),
-                    //     result->getStringLength()); LOGE("weexjsc functionGCanvasLinkNative
-                    //     result length > 1 retWString:%s", retWString.utf8().data()); ret =
-                    //     String2JSValue(state, retWString);
-
-                    // }
-                    if (result->getType() != IPCType::VOID) {
-                        if (result->getStringLength() > 0) {
+}
+
+void CoreSideInMultiProcess::AddElement(const char *page_id,
+                                        const char *parent_ref,
+                                        const char *dom_str, int dom_str_length,
+                                        const char *index_str) {
+
+  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) {
+
+  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) {
+
+  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) {
+
+  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) {
+
+  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 ipc_result->get<int32_t>();
+}
+
+void CoreSideInMultiProcess::CreateFinish(const char *page_id) {
+
+  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) {
+
+  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 ipc_result->get<int32_t>();
+}
+
+void CoreSideInMultiProcess::UpdateAttrs(const char *page_id, const char *ref,
+                                         const char *data, int data_length) {
+
+  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) {
+
+  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) {
+
+  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) {
+
+  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) {
+
+  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) {
+
+  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) {
+
+  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 {
+    // LOGE("weexjsc functionGCanvasLinkNative");
+    // if (result->getType() == IPCType::VOID) {
+    //     return JSValue::encode(ret);
+    // } else if (result->getStringLength() > 0) {
+    //     WTF::String retWString = jString2String(result->getStringContent(),
+    //     result->getStringLength()); LOGE("weexjsc functionGCanvasLinkNative
+    //     result length > 1 retWString:%s", retWString.utf8().data()); ret =
+    //     String2JSValue(state, retWString);
+
+    // }
+    if (result->getType() != IPCType::VOID) {
+      if (result->getStringLength() > 0) {
 #ifdef USE_JS_RUNTIME
-                            return jString2String(result->getStringContent(),
-                                                  result->getStringLength()).c_str();
+        return jString2String(result->getStringContent(),
+                              result->getStringLength()).c_str();
 #else
-                            return jString2String(result->getStringContent(),
-                                                  result->getStringLength())
-                                    .utf8()
-                                    .data();
+        return jString2String(result->getStringContent(),
+                              result->getStringLength())
+            .utf8()
+            .data();
 #endif
-                        }
-                    }
-                } catch (IPCException &e) {
-                    LOGE("functionGCanvasLinkNative exception: %s", e.msg());
-                    _exit(1);
-                }
-                return NULL;
-            }
-
-            int CoreSideInMultiProcess::SetInterval(const char *page_id,
-                                                    const char *callback_id,
-                                                    const char *time) {
-
-                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 result->get<int32_t>();
-            }
-
-            void CoreSideInMultiProcess::ClearInterval(const char *page_id,
-                                                       const char *callback_id) {
-
-                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) {
-
-
-                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) {
+      }
+    }
+  } catch (IPCException &e) {
+    LOGE("functionGCanvasLinkNative exception: %s", e.msg());
+    _exit(1);
+  }
+  return NULL;
+}
+
+int CoreSideInMultiProcess::SetInterval(const char *page_id,
+                                        const char *callback_id,
+                                        const char *time) {
+
+  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 result->get<int32_t>();
+}
+
+void CoreSideInMultiProcess::ClearInterval(const char *page_id,
+                                           const char *callback_id) {
+
+  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) {
+
+  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) {
 #ifdef USE_JS_RUNTIME
-                        return jString2String(result->getStringContent(),
-                                              result->getStringLength()).c_str();
+      return jString2String(result->getStringContent(),
+                            result->getStringLength()).c_str();
 #else
-                        return jString2String(result->getStringContent(),
-                                              result->getStringLength())
-                                .utf8()
-                                .data();
+      return jString2String(result->getStringContent(),
+                            result->getStringLength())
+          .utf8()
+          .data();
 #endif
-                    }
-                }
-                return nullptr;
-            }
-
-            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,
-                                                         const char *data,
-                                                         int dataLength,
-                                                         const char *callback,
-                                                         const char *vm_id) {
-
-                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>
-            CoreSideInMultiProcess::DispatchMessageSync(const char *client_id,
-                                                        const char *data,
-                                                        int dataLength,
-                                                        const char *vm_id) {
-
-                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) {
-
-                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) {
-
-                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) {
-                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) {
-                    ipc_task->addParams(result->data.get(), result->length);
-                }
-                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) {
-
-
-                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
+    }
+  }
+  return nullptr;
+}
+
+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,
+                                             const char *data,
+                                             int dataLength,
+                                             const char *callback,
+                                             const char *vm_id) {
+
+  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>
+CoreSideInMultiProcess::DispatchMessageSync(const char *client_id,
+                                            const char *data,
+                                            int dataLength,
+                                            const char *vm_id) {
+
+  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) {
+
+  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) {
+
+  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) {
+  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) {
+    ipc_task->addParams(result->data.get(), result->length);
+  }
+  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) {
+
+  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);
+}
+
+bool CoreSideInMultiProcess::Log(int level, const char *tag,
+         const char *file,
+         unsigned long line,
+         const char *log) {
+
+  if (WeexEnv::getEnv()->m_back_to_weex_core_thread == nullptr
+      || WeexEnv::getEnv()->m_back_to_weex_core_thread->isInitOk == 0) {
+    return false;
+  }
+
+  BackToWeexCoreQueue::IPCTask *ipc_task = new BackToWeexCoreQueue::IPCTask(
+      IPCProxyMsg::POSTLOGDETAIL);
+  auto level_str = std::to_string(level);
+  ipc_task->addParams(level_str.c_str(), level_str.length());
+  ipc_task->addParams(tag);
+  ipc_task->addParams(file);
+  auto line_str = std::to_string(line);
+  ipc_task->addParams(line_str.c_str(), line_str.length());
+  ipc_task->addParams(log);
+  WeexEnv::getEnv()->m_back_to_weex_core_thread->addTask(ipc_task);
+  return true;
+}
+
+}  // namespace js
+}  // namespace bridge
 }  // namespace weex
diff --git a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.h b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.h
index 6cab646..ac0a150 100644
--- a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.h
+++ b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_process.h
@@ -23,105 +23,110 @@
 #ifndef WEEXV8_MULTI_PROCESS_CORE_SIDE_H
 #define WEEXV8_MULTI_PROCESS_CORE_SIDE_H
 
- #include <memory>
+#include <memory>
 #include "android/jsengine/weex_ipc_client.h"
 #include "core/bridge/script_bridge.h"
 
 class WeexJSServer;
 namespace weex {
-    namespace bridge {
-        namespace js {
-            class CoreSideInMultiProcess : public WeexCore::ScriptBridge::CoreSide {
-            public:
-                explicit CoreSideInMultiProcess(WeexIPCClient *client);
-                explicit CoreSideInMultiProcess();
+namespace bridge {
+namespace js {
+class CoreSideInMultiProcess : public WeexCore::ScriptBridge::CoreSide {
+ public:
+  explicit CoreSideInMultiProcess(WeexIPCClient *client);
+  explicit CoreSideInMultiProcess();
 
-                ~CoreSideInMultiProcess() override;
+  ~CoreSideInMultiProcess() override;
 
-                inline void set_ipc_client(WeexIPCClient *client) { client_ = client; };
+  inline void set_ipc_client(WeexIPCClient *client) { client_ = client; };
 
-                void CallNative(const char *page_id, const char *task,
-                                const char *callback) override;
+  void CallNative(const char *page_id, const char *task,
+                  const char *callback) override;
 
-                std::unique_ptr<ValueWithType> CallNativeModule(
-                        const char *page_id, const char *module, const char *method,
-                        const char *arguments, int arguments_length, const char *options,
-                        int options_length) override;
+  std::unique_ptr<ValueWithType> CallNativeModule(
+      const char *page_id, const char *module, const char *method,
+      const char *arguments, int arguments_length, const char *options,
+      int options_length) override;
 
-                void CallNativeComponent(const char *page_id, const char *ref,
-                                         const char *method, const char *arguments,
-                                         int arguments_length, const char *options,
-                                         int options_length) override;
+  void CallNativeComponent(const char *page_id, const char *ref,
+                           const char *method, const char *arguments,
+                           int arguments_length, const char *options,
+                           int options_length) override;
 
-                void AddElement(const char *page_id, const char *parent_ref,
-                                const char *dom_str, int dom_str_length,
-                                const char *index_str) override;
+  void AddElement(const char *page_id, const char *parent_ref,
+                  const char *dom_str, int dom_str_length,
+                  const char *index_str) override;
 
-                void SetTimeout(const char *callback_id, const char *time) override;
+  void SetTimeout(const char *callback_id, const char *time) override;
 
-                void NativeLog(const char *str_array) override;
+  void NativeLog(const char *str_array) override;
 
-                void CreateBody(const char *page_id, const char *dom_str,
-                                int dom_str_length) override;
+  void CreateBody(const char *page_id, const char *dom_str,
+                  int dom_str_length) override;
 
-                int UpdateFinish(const char *page_id, const char *task, int task_length,
-                                 const char *callback, int callback_length) override;
+  int UpdateFinish(const char *page_id, const char *task, int task_length,
+                   const char *callback, int callback_length) override;
 
-                void CreateFinish(const char *page_id) override;
+  void CreateFinish(const char *page_id) override;
 
-                int RefreshFinish(const char *page_id, const char *task,
-                                  const char *callback) override;
+  int RefreshFinish(const char *page_id, const char *task,
+                    const char *callback) override;
 
-                void UpdateAttrs(const char *page_id, const char *ref, const char *data,
-                                 int data_length) override;
+  void UpdateAttrs(const char *page_id, const char *ref, const char *data,
+                   int data_length) override;
 
-                void UpdateStyle(const char *page_id, const char *ref, const char *data,
-                                 int data_length) override;
+  void UpdateStyle(const char *page_id, const char *ref, const char *data,
+                   int data_length) override;
 
-                void RemoveElement(const char *page_id, const char *ref) override;
+  void RemoveElement(const char *page_id, const char *ref) override;
 
-                void MoveElement(const char *page_id, const char *ref, const char *parent_ref,
-                                 int index) override;
+  void MoveElement(const char *page_id, const char *ref, const char *parent_ref,
+                   int index) override;
 
-                void AddEvent(const char *page_id, const char *ref,
-                              const char *event) override;
+  void AddEvent(const char *page_id, const char *ref,
+                const char *event) override;
 
-                void RemoveEvent(const char *page_id, const char *ref,
-                                 const char *event) override;
+  void RemoveEvent(const char *page_id, const char *ref,
+                   const char *event) override;
 
-                const char *CallGCanvasLinkNative(const char *context_id, int type,
-                                                  const char *arg) override;
+  const char *CallGCanvasLinkNative(const char *context_id, int type,
+                                    const char *arg) override;
 
-                int SetInterval(const char *page_id, const char *callback_id,
-                                const char *time) override;
+  int SetInterval(const char *page_id, const char *callback_id,
+                  const char *time) override;
 
-                void ClearInterval(const char *page_id, const char *callback_id) override;
+  void ClearInterval(const char *page_id, const char *callback_id) override;
 
-                const char *CallT3DLinkNative(int type, const char *arg) override;
+  const char *CallT3DLinkNative(int type, const char *arg) override;
 
-                void PostMessage(const char *vim_id, const char *data, int dataLength) override;
+  void PostMessage(const char *vim_id, const char *data, int dataLength) override;
 
-                void DispatchMessage(const char *client_id, const char *data, int dataLength,
-                                     const char *callback, const char *vm_id) override;
+  void DispatchMessage(const char *client_id, const char *data, int dataLength,
+                       const char *callback, const char *vm_id) override;
 
-                std::unique_ptr<WeexJSResult> DispatchMessageSync(
-                    const char *client_id, const char *data, int dataLength,
-                    const char *vm_id) override;
+  std::unique_ptr<WeexJSResult> DispatchMessageSync(
+      const char *client_id, const char *data, int dataLength,
+      const char *vm_id) override;
 
-                void ReportException(const char *page_id, const char *func,
-                                     const char *exception_string) override;
+  void ReportException(const char *page_id, const char *func,
+                       const char *exception_string) override;
 
-                void SetJSVersion(const char *js_version) override;
+  void SetJSVersion(const char *js_version) override;
 
-                void OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& result);
-                void UpdateComponentData(const char* page_id, const char* cid, const char* json_data);
+  void OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult> &result) override;;
+  void UpdateComponentData(const char *page_id, const char *cid, const char *json_data) override;;
 
-            private:
-                WeexIPCClient *client_;
-                DISALLOW_COPY_AND_ASSIGN(CoreSideInMultiProcess);
-            };
-        }  // namespace js
-    }  // namespace bridge
+  bool Log(int level, const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log) override;
+
+ private:
+  WeexIPCClient *client_;
+  DISALLOW_COPY_AND_ASSIGN(CoreSideInMultiProcess);
+};
+}  // namespace js
+}  // namespace bridge
 }  // namespace weex
 
 #endif  // WEEXV8_MULTI_PROCESS_CORE_SIDE_H
diff --git a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.cpp b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.cpp
index b18270a..019d2d0 100644
--- a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.cpp
@@ -152,7 +152,7 @@ void CoreSideInMultiSo::PostMessage(const char *vim_id, const char *data, int da
 void CoreSideInMultiSo::DispatchMessage(const char *client_id, const char *data, int dataLength,
                                         const char *callback,
                                         const char *vm_id) {
-  functions_exposed_by_core_->funcCallDIspatchMessage(client_id, data,dataLength, callback,
+  functions_exposed_by_core_->funcCallDIspatchMessage(client_id, data, dataLength, callback,
                                                       vm_id);
 }
 
@@ -160,7 +160,7 @@ std::unique_ptr<WeexJSResult> CoreSideInMultiSo::DispatchMessageSync(
     const char *client_id, const char *data, int dataLength,
     const char *vm_id) {
   return functions_exposed_by_core_->funcCallDispatchMessageSync(client_id, data,
-                                                          dataLength, vm_id);
+                                                                 dataLength, vm_id);
 }
 
 void CoreSideInMultiSo::ReportException(const char *page_id, const char *func,
@@ -173,13 +173,23 @@ void CoreSideInMultiSo::SetJSVersion(const char *js_version) {
   functions_exposed_by_core_->funcSetJSVersion(js_version);
 }
 
-void CoreSideInMultiSo::OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& result) {
+void CoreSideInMultiSo::OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult> &result) {
   functions_exposed_by_core_->funcOnReceivedResult(callback_id, result);
 }
 
-void CoreSideInMultiSo::UpdateComponentData(const char* page_id, const char* cid, const char* json_data) {
+void CoreSideInMultiSo::UpdateComponentData(const char *page_id,
+                                            const char *cid,
+                                            const char *json_data) {
   functions_exposed_by_core_->funcUpdateComponentData(page_id, cid, json_data);
 }
+
+bool CoreSideInMultiSo::Log(int level, const char *tag,
+                            const char *file,
+                            unsigned long line,
+                            const char *log) {
+  return functions_exposed_by_core_->funcLog(level, tag, file, line, log);
+}
+
 }  // namespace js
 }  // namespace bridge
 }  // namespace weex
diff --git a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.h b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.h
index 625a975..2f0821f 100644
--- a/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.h
+++ b/weex_core/Source/android/jsengine/bridge/script/core_side_in_multi_so.h
@@ -91,6 +91,11 @@ class CoreSideInMultiSo : public WeexCore::ScriptBridge::CoreSide {
   void OnReceivedResult(long callback_id, std::unique_ptr<WeexJSResult>& result);
   void UpdateComponentData(const char* page_id, const char* cid, const char* json_data);
 
+  bool Log(int level, const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log)override;
+
  private:
   FunctionsExposedByCore *functions_exposed_by_core_;
   DISALLOW_COPY_AND_ASSIGN(CoreSideInMultiSo);
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 c1615fe..fa4cb02 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
@@ -220,6 +220,9 @@ namespace weex {
                                          UpdateGlobalConfig);
                 handler->registerHandler(static_cast<uint32_t>(IPCJSMsg::UpdateInitFrameworkParams),
                                          UpdateInitFrameworkParams);
+
+                handler->registerHandler(static_cast<uint32_t>(IPCJSMsg::SETLOGLEVEL),
+                                         setLogType);
             }
 
             std::unique_ptr<IPCResult> ScriptBridgeInMultiProcess::InitFramework(
@@ -424,8 +427,6 @@ namespace weex {
 
             std::unique_ptr<IPCResult> ScriptBridgeInMultiProcess::CreateInstance(
                     IPCArguments *arguments) {
-                LOGD("ScriptBridgeInMultiProcess::CreateInstance");
-
                 const char *instanceID = GetUTF8StringFromIPCArg(arguments, 0);
                 const char *func = GetUTF8StringFromIPCArg(arguments, 1);
                 const char *script = GetUTF8StringFromIPCArg(arguments, 2);
@@ -454,6 +455,7 @@ namespace weex {
                     init_framework_params->value = IPCByteArrayToWeexByteArray(ba);
                     params.push_back(init_framework_params);
                 }
+                LOG_TLOG("jsEngine","ScriptBridgeInMultiProcess::CreateInstance and Id is : %s", instanceID);
                 auto result = createInt32Result(Instance()->script_side()->CreateInstance(
                                         instanceID, func, script, opts, initData, extendsApi,params));
                 freeInitFrameworkParams(params);
@@ -504,6 +506,17 @@ namespace weex {
                 return createVoidResult();
             }
 
+        std::unique_ptr<IPCResult> ScriptBridgeInMultiProcess::setLogType(
+            IPCArguments *arguments) {
+            LOGD("ScriptBridgeInMultiProcess::setLogType");
+            int type = arguments->get<int32_t>(0);
+            int perf = arguments->get<int32_t>(1);
+            Instance()->script_side()->SetLogType(type, perf == 1);
+
+            return createVoidResult();
+        }
+
+
             std::unique_ptr<IPCResult> ScriptBridgeInMultiProcess::TakeHeapSnapshot(
                     IPCArguments *arguments) {
                 return createVoidResult();
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h
index fcf17fc..c0163c8 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h
+++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_process.h
@@ -66,6 +66,7 @@ class ScriptBridgeInMultiProcess : public WeexCore::ScriptBridge {
   IPC_METHOD(ExecJSOnInstance)
   IPC_METHOD(UpdateGlobalConfig)
   IPC_METHOD(UpdateInitFrameworkParams)
+  IPC_METHOD(setLogType)
 
  private:
   static ScriptBridgeInMultiProcess* g_instance;
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.cpp b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.cpp
index 1b52af7..972cd16 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.cpp
@@ -60,7 +60,7 @@ FunctionsExposedByJS *ScriptBridgeInMultiSo::GetExposedFunctions() {
       ExecJSOnAppWithResult, CallJSOnAppContext, DestroyAppContext,
       ExecJSService,         ExecTimeCallback,   ExecJS,
       ExecJSWithResult,      ExecJSWithCallback, CreateInstance,     ExecJSOnInstance,
-      DestroyInstance,       UpdateGlobalConfig,  UpdateInitFrameworkParams};
+      DestroyInstance,       UpdateGlobalConfig,  UpdateInitFrameworkParams, SetLogType};
   auto functions = (FunctionsExposedByJS *)malloc(sizeof(FunctionsExposedByJS));
   memset(functions, 0, sizeof(FunctionsExposedByJS));
   memcpy(functions, &temp, sizeof(FunctionsExposedByJS));
@@ -157,6 +157,10 @@ int ScriptBridgeInMultiSo::UpdateInitFrameworkParams(const std::string& key, con
     return Instance()->script_side()->UpdateInitFrameworkParams(key, value, desc);
 }
 
+void ScriptBridgeInMultiSo::SetLogType(const int logLevel, const bool isPerf) {
+  return Instance()->script_side()->SetLogType(logLevel, isPerf);
+}
+
 
 }  // namespace js
 }  // namespace bridge
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.h b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.h
index 6e2d272..1700fee 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.h
+++ b/weex_core/Source/android/jsengine/bridge/script/script_bridge_in_multi_so.h
@@ -77,6 +77,7 @@ class ScriptBridgeInMultiSo : public WeexCore::ScriptBridge {
   static int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc);
 
 
+  static void SetLogType(const int logLevel, const bool isPerf);
 
  private:
   static ScriptBridgeInMultiSo *g_instance;
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 4383fc9..ea0f6ac 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
@@ -21,7 +21,6 @@
 //
 
 #include <object/weex_env.h>
-#include <object/tlog.h>
 #include "script_side_in_queue.h"
 
 #include "android/jsengine/task/impl/init_framework_task.h"
@@ -245,7 +244,7 @@ int ScriptSideInQueue::CreateInstance(const char *instanceId,
 
   auto string = String::fromUTF8(script);
   if (string.isEmpty()) {
-    Weex::TLog::tlog("%s id CreateInstance's script is null", instanceId);
+    LOG_TLOG("jsEngine","%s id CreateInstance's script is null", instanceId);
     return 0;
   }
   CreateInstanceTask *task = new CreateInstanceTask(String::fromUTF8(instanceId),
@@ -263,6 +262,12 @@ int ScriptSideInQueue::CreateInstance(const char *instanceId,
   return 1;
 }
 
+void ScriptSideInQueue::SetLogType(const int logLevel, const bool isPerf) {
+  LOGE("jsEngine setLog Level %d in Performance mode %s", logLevel, isPerf ? "true" :"false");
+  weex::base::LogImplement::getLog()->setPrintLevel((WeexCore::LogLevel)logLevel);
+  weex::base::LogImplement::getLog()->setPerfMode(isPerf);
+};
+
 std::unique_ptr<WeexJSResult> ScriptSideInQueue::ExecJSOnInstance(const char *instanceId,
                                                                   const char *script,int type) {
   LOGD("ScriptSideInQueue::ExecJSOnInstance type:%d",type);
@@ -358,12 +363,12 @@ WeexTaskQueue *ScriptSideInQueue::taskQueue(const char *id, bool log) {
       WeexEnv::getEnv()->m_task_cache_.clear();
     }
     if (log) {
-      LOGE("dyyLog instance %s use back up thread time is %lld", id, microTime());
+      LOGE("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());
+    LOGE("instance %s use main thread time is %lld", id, microTime());
   }
   return weexTaskQueue_;
 }
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 d71ca76..2b7ecd1 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
@@ -98,7 +98,7 @@ namespace weex {
                 int UpdateGlobalConfig(const char *config) override;
 
                 int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc) override;
-
+                void SetLogType(const int logLevel, const bool isPerf) override;
 
             private:
                 std::vector<std::string> usingBackThreadId;
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.cpp b/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.cpp
index 41a7784..aba1f51 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.cpp
+++ b/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.cpp
@@ -143,6 +143,10 @@ int ScriptSideInSimple::UpdateInitFrameworkParams(const std::string& key, const
   return runtime_->UpdateInitFrameworkParams(key ,value, desc);
 }
 
+void ScriptSideInSimple::SetLogType(const int logLevel, const bool isPerf) {
+  //do nothing
+}
+
 
 
 }  // namespace js
diff --git a/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.h b/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.h
index af6d2ac..ebea353 100644
--- a/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.h
+++ b/weex_core/Source/android/jsengine/bridge/script/script_side_in_simple.h
@@ -75,7 +75,7 @@ class ScriptSideInSimple : public WeexCore::ScriptBridge::ScriptSide {
 
   int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc) override;
 
-
+  void SetLogType(const int logLevel, const bool isPerf) override;
 
   inline void set_runtime(WeexRuntime *runtime) { runtime_ = runtime; }
 
diff --git a/weex_core/Source/android/wrap/log_utils.h b/weex_core/Source/android/jsengine/object/log_utils_jss.h
similarity index 54%
copy from weex_core/Source/android/wrap/log_utils.h
copy to weex_core/Source/android/jsengine/object/log_utils_jss.h
index 5bdf164..5cfbb13 100644
--- a/weex_core/Source/android/wrap/log_utils.h
+++ b/weex_core/Source/android/jsengine/object/log_utils_jss.h
@@ -16,21 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+//
+// Created by Darin on 2019-06-24.
+//
 
-#ifndef WEEX_PROJECT_LOG_UTILS_H
-#define WEEX_PROJECT_LOG_UTILS_H
+#ifndef WEEX_PROJECT_LOG_UTILS_JSS_H
+#define WEEX_PROJECT_LOG_UTILS_JSS_H
 
-#include <jni.h>
 #include "base/log_defines.h"
-#include "core/bridge/log_bridge.h"
-
-namespace WeexCore {
-class LogUtils : public LogBridge {
+#include "weex_env.h"
+class LogUtilsJSS : public weex::base::LogBase {
  public:
-  static bool RegisterJNIUtils(JNIEnv* env);
-  static void NativeLog(JNIEnv* env, const char* str_array);
-  void log(LogLevel level, const char* tag,  const char* file, unsigned long line, const char* log) override;
-};
-}  // namespace WeexCore
+  bool log(WeexCore::LogLevel level,
+           const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log) override {
 
-#endif  // WEEX_PROJECT_LOG_UTILS_H
+    //Please do not add Any LOGE in this function.
+
+    // for performance, only send TLog & performance Log to main process
+    if (level == WeexCore::LogLevel::Performance
+        || level == WeexCore::LogLevel::Tlog) {
+      return WeexEnv::getEnv()->sendLog((int) level, tag, file, line, log);
+    }
+    return false;
+  }
+};
+#endif //WEEX_PROJECT_LOG_UTILS_JSS_H
diff --git a/weex_core/Source/android/jsengine/object/tlog.h b/weex_core/Source/android/jsengine/object/tlog.h
deleted file mode 100644
index 62c9f1e..0000000
--- a/weex_core/Source/android/jsengine/object/tlog.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-//
-// Created by Darin on 2019-07-01.
-//
-
-#ifndef WEEX_PROJECT_TLOG_H
-#define WEEX_PROJECT_TLOG_H
-
-#include "weex_env.h"
-
-namespace Weex {
-    class TLog {
-    public: static void tlog(const char* fmt, ...) {
-            va_list arg_list;
-            int size;
-            va_start(arg_list, fmt);
-            size = vsnprintf(nullptr, 0, fmt, arg_list);
-            int byte_count = size + 1;
-            char * buffer = (char*)malloc(byte_count);
-            memset(buffer, 0, byte_count);
-            va_end(arg_list);
-            if (size > 0) {
-                va_start(arg_list, fmt);
-                vsnprintf(const_cast<char*>(buffer), byte_count, fmt, arg_list);
-                va_end(arg_list);
-            }
-            WeexEnv::getEnv()->sendTLog("JSEngine", buffer);
-
-            free(buffer);
-        }
-    };
-
-
-}
-
-#endif //WEEX_PROJECT_TLOG_H
diff --git a/weex_core/Source/android/jsengine/object/weex_console_object.cpp b/weex_core/Source/android/jsengine/object/weex_console_object.cpp
index 010593b..8614a8a 100644
--- a/weex_core/Source/android/jsengine/object/weex_console_object.cpp
+++ b/weex_core/Source/android/jsengine/object/weex_console_object.cpp
@@ -126,8 +126,7 @@ static void printConsoleLog(ExecState *exec, MessageLevel level) {
     JSValue val = exec->argument(0);
     if (val.isString()) {
         String s = val.toWTFString(exec);
-        Weex::LogUtil::ConsoleLogPrint((int) level, "jsLog", s.utf8().data());
-         LOGE("consoleLogWithLevel level: %d log:%s", level, s.utf8().data());
+        Weex::LogUtil::ConsoleLogPrint((int) level, "jsLog timeline", s.utf8().data());
         return;
     } else if (val.isObject()) {
         VM &vm_catch = exec->vm();
@@ -139,13 +138,11 @@ static void printConsoleLog(ExecState *exec, MessageLevel level) {
             return;
         }
         Weex::LogUtil::ConsoleLogPrint((int)level, "jsLog", str.utf8().data());
-         LOGE("consoleLogWithLevel level: %d log:%s", level, str.utf8().data());
     }
     Weex::LogUtil::ConsoleLogPrint((int) level, "jsLog", "[object]");
 }
 
 static EncodedJSValue consoleLogWithLevel(ExecState *exec, MessageLevel level) {
-    LOGE("consoleLogWithLevel");
     printConsoleLog(exec, level);
 //    ConsoleClient *client = exec->lexicalGlobalObject()->consoleClient();
 //    if (!client)
diff --git a/weex_core/Source/android/jsengine/object/weex_env.cpp b/weex_core/Source/android/jsengine/object/weex_env.cpp
index 89b7688..b229e8f 100644
--- a/weex_core/Source/android/jsengine/object/weex_env.cpp
+++ b/weex_core/Source/android/jsengine/object/weex_env.cpp
@@ -21,8 +21,11 @@
 //
 
 #include "weex_env.h"
-#include "tlog.h"
+#include "core/bridge/script_bridge.h"
 
+namespace WeexCore {
+class ScriptBridge;
+}
 WeexEnv *WeexEnv::env_ = nullptr;
 
 WeexCore::ScriptBridge *WeexEnv::scriptBridge() { return scriptBridge_; }
@@ -31,39 +34,44 @@ bool WeexEnv::useWson() { return isUsingWson; }
 
 void WeexEnv::setUseWson(bool useWson) { isUsingWson = useWson; }
 
-void WeexEnv::setScriptBridge(WeexCore::ScriptBridge *scriptBridge) { scriptBridge_ = scriptBridge; }
+void WeexEnv::setScriptBridge(WeexCore::ScriptBridge *scriptBridge) {
+  scriptBridge_ = scriptBridge;
+}
 
 void WeexEnv::initIPC() {
-    // init IpcClient in io Thread
-    isMultiProcess = true;
-    m_ipc_client_.reset(new WeexIPCClient(ipcClientFd_));
+  // init IpcClient in io Thread
+  isMultiProcess = true;
+  m_ipc_client_.reset(new WeexIPCClient(ipcClientFd_));
 }
 WeexEnv::WeexEnv() {
-    this->enableBackupThread__ = false;
-    this->isUsingWson = true;
-    this->isJscInitOk_ = false;
-    this->m_cache_task_ = true;
+  this->enableBackupThread__ = false;
+  this->isUsingWson = true;
+  this->isJscInitOk_ = false;
+  this->m_cache_task_ = true;
 }
 
 void WeexEnv::initJSC(bool isMultiProgress) {
-    static std::once_flag initJSCFlag;
-    std::call_once(initJSCFlag, [isMultiProgress]{
-      if (!WEEXICU::initICUEnv(isMultiProgress)) {
-          LOGE("failed to init ICUEnv single process");
-          // return false;
-      }
+  weex::base::TimeCalculator
+      timeCalculator(weex::base::TaskPlatform::JSS_ENGINE, "initJSC", "initJSC");
+  static std::once_flag initJSCFlag;
+  std::call_once(initJSCFlag, [isMultiProgress] {
+    if (!WEEXICU::initICUEnv(isMultiProgress)) {
+      LOGE("failed to init ICUEnv single process");
+      // return false;
+    }
 
 #ifndef USE_JS_RUNTIME
-      Options::enableRestrictedOptions(true);
+    Options::enableRestrictedOptions(true);
 // Initialize JSC before getting VM.
-      WTF::initializeMainThread();
-      initHeapTimer();
-      JSC::initializeThreading();
+    WTF::initializeMainThread();
+    initHeapTimer();
+    JSC::initializeThreading();
 #if ENABLE(WEBASSEMBLY)
-      JSC::Wasm::enableFastMemory();
+    JSC::Wasm::enableFastMemory();
 #endif
 #endif
-    });
+  });
+  timeCalculator.taskEnd();
 }
 void WeexEnv::init_crash_handler(std::string crashFileName) {
   // initialize signal handler
@@ -72,13 +80,13 @@ void WeexEnv::init_crash_handler(std::string crashFileName) {
   crashHandler->initializeCrashHandler();
 }
 bool WeexEnv::is_app_crashed() {
-  if(!isMultiProcess)
+  if (!isMultiProcess)
     return false;
-    bool crashed = crashHandler->is_crashed();
-    if(crashed) {
-        Weex::TLog::tlog("%s", "AppCrashed");
-    }
-    return crashed;
+  bool crashed = crashHandler->is_crashed();
+  if (crashed) {
+    LOG_TLOG("jsEngine", "%s", "AppCrashed");
+  }
+  return crashed;
 }
 volatile bool WeexEnv::can_m_cache_task_() const {
   return m_cache_task_;
@@ -92,12 +100,14 @@ WeexEnv::~WeexEnv() {
 #endif
 }
 
-void WeexEnv::sendTLog(const char *tag, const char *log) {
-    if(m_back_to_weex_core_thread.get()) {
-        BackToWeexCoreQueue::IPCTask *ipc_task = new BackToWeexCoreQueue::IPCTask(
-                IPCProxyMsg::TLOGMSG);
-        ipc_task->addParams(tag);
-        ipc_task->addParams(log);
-        m_back_to_weex_core_thread->addTask(ipc_task);
-    }
+bool WeexEnv::sendLog(int level,
+                      const char *tag,
+                      const char *file,
+                      unsigned long line,
+                      const char *log) {
+
+  if (scriptBridge_ == nullptr) {
+    return false;
+  }
+  return scriptBridge_->core_side()->Log(level, tag, file, line, log);
 }
diff --git a/weex_core/Source/android/jsengine/object/weex_env.h b/weex_core/Source/android/jsengine/object/weex_env.h
index 2f1e376..4793735 100644
--- a/weex_core/Source/android/jsengine/object/weex_env.h
+++ b/weex_core/Source/android/jsengine/object/weex_env.h
@@ -24,15 +24,14 @@
 #define WEEXV8_WEEXENV_H
 
 #include <mutex>
-
 #ifdef USE_JS_RUNTIME
 #include "js_runtime/weex/task/weex_task.h"
 #include "js_runtime/weex/task/back_to_weex_core_queue.h"
 #include "js_runtime/weex/task/timer_queue.h"
 #include "base/crash/crash_handler.h"
-
 #else
 #include <task/weex_task.h>
+#include <android/jsengine/task/weex_task.h>
 #include "android/jsengine/task/back_to_weex_core_queue.h"
 #include "android/jsengine/task/timer_queue.h"
 #endif
@@ -108,10 +107,12 @@ public:
     void init_crash_handler(std::string crashFileName);
 
     bool is_app_crashed();
+    bool sendLog(int level, const char *tag,
+                 const char *file,
+                 unsigned long line,
+                 const char *log);
 
-    void sendTLog(const char *tag, const char *log);
-
-public:
+ public:
     std::unique_ptr<BackToWeexCoreQueue> m_back_to_weex_core_thread;
     volatile bool isMultiProcess = false;
     std::unique_ptr<WeexIPCClient> m_ipc_client_;
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 4f3bbbd..68cd2bb 100644
--- a/weex_core/Source/android/jsengine/object/weex_global_object.cpp
+++ b/weex_core/Source/android/jsengine/object/weex_global_object.cpp
@@ -186,12 +186,16 @@ void WeexGlobalObject::initWxEnvironment(std::vector<INIT_FRAMEWORK_PARAMS *> &p
             }
             isGlobalConfigStartUpSet = true;
         }
-
         // --------------------------------------------------------
         // add for debug mode
-        if (String("debugMode") == type && String("true") == value) {
-            WeexCore::DebugMode = true;
-            LOGE("jss use %s"," jsc");
+        static bool hasSet = false;
+        if(!hasSet) {
+            if (String("debugMode") == type && String("true") == value) {
+                __android_log_print(ANDROID_LOG_ERROR,"WeexCore","setDebugMode  1 ");
+                weex::base::LogImplement::getLog()->setDebugMode(true);
+                hasSet = true;
+                LOGE("jss use %s"," jsc");
+            }
         }
         // --------------------------------------------------------
 
@@ -418,14 +422,6 @@ JSFUNCTION functionCallNativeModule(ExecState *state) {
     getStringArgsFromState(state, 2, methodChar);
     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(),
@@ -433,7 +429,6 @@ JSFUNCTION functionCallNativeModule(ExecState *state) {
                                                                            arguments.getLength(),
                                                                            options.getValue(),
                                                                            options.getLength());
-//    timeCalculator.taskEnd();
     JSValue ret;
     switch (result->type) {
         case ParamsType::DOUBLE:
diff --git a/weex_core/Source/android/jsengine/weex_ipc_server.cpp b/weex_core/Source/android/jsengine/weex_ipc_server.cpp
index 8e09a6f..7db52e0 100644
--- a/weex_core/Source/android/jsengine/weex_ipc_server.cpp
+++ b/weex_core/Source/android/jsengine/weex_ipc_server.cpp
@@ -17,13 +17,14 @@
  * under the License.
  */
 #include "android/jsengine/weex_ipc_server.h"
-
 #include "android/jsengine/bridge/platform/platform_side_multi_process.h"
 #include "android/jsengine/bridge/platform/platform_bridge_in_multi_process.h"
 #include "android/jsengine/object/weex_env.h"
 #include "android/jsengine/weex_runtime.h"
 #include "core/manager/weex_core_manager.h"
 #include "android/jsengine/weex_jsc_utils.h"
+#include "base/log_defines.h"
+#include "android/jsengine/object/log_utils_jss.h"
 #ifdef USE_JS_RUNTIME
 #include "base/crash/crash_handler.h"
 #include <unistd.h>
@@ -49,7 +50,6 @@ WeexJSServer::WeexJSServerImpl::WeexJSServerImpl(int serverFd, int clientFd, boo
     WeexEnv::getEnv()->setIpcServerFd(serverFd);
     WeexEnv::getEnv()->setIpcClientFd(clientFd);
     WeexEnv::getEnv()->setEnableTrace(enableTrace);
-
     int _fd = serverFd;
     void *base = mmap(nullptr, IPCFutexPageQueue::ipc_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0);
     if (base == MAP_FAILED) {
@@ -63,7 +63,7 @@ WeexJSServer::WeexJSServerImpl::WeexJSServerImpl(int serverFd, int clientFd, boo
     sender = std::move(createIPCSender(futexPageQueue.get(), handler.get()));
     listener = std::move(createIPCListener(futexPageQueue.get(), handler.get()));
     serializer = std::move(createIPCSerializer());
-
+    weex::base::LogImplement::getLog()->setLogImplement(new LogUtilsJSS());
     WeexEnv::getEnv()->init_crash_handler(crashFileName);
 
     WeexEnv::getEnv()->m_back_to_weex_core_thread.reset(new BackToWeexCoreQueue());
diff --git a/weex_core/Source/android/jsengine/weex_runtime.cpp b/weex_core/Source/android/jsengine/weex_runtime.cpp
index 14d2a61..eb1b3dd 100644
--- a/weex_core/Source/android/jsengine/weex_runtime.cpp
+++ b/weex_core/Source/android/jsengine/weex_runtime.cpp
@@ -20,7 +20,6 @@
 // Created by Darin on 28/04/2018.
 //
 
-#include <object/tlog.h>
 #include "android/jsengine/weex_runtime.h"
 
 #include "android/jsengine/bridge/script/script_bridge_in_multi_so.h"
@@ -319,7 +318,7 @@ 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("dyyLog EXECJS func:%s and params size is %d", func.utf8().data(), params.size());
+//    LOGE("EXECJS func:%s and params size is %d", func.utf8().data(), params.size());
 
     String runFunc = func;
     JSGlobalObject *globalObject;
@@ -607,8 +606,7 @@ int WeexRuntime::createInstance(const String &instanceId, const String &func, co
                                 const String &initData,
                                 const String &extendsApi,
                                 std::vector<INIT_FRAMEWORK_PARAMS*>& params) {
-    LOGE("test-> : start createInstance");
-    Weex::TLog::tlog("id --> %s CreateInstance start", instanceId.utf8().data());
+    LOG_TLOG("jsEngine","id --> %s CreateInstance start", instanceId.utf8().data());
 
     JSGlobalObject *impl_globalObject = weexObjectHolder->m_globalObject.get();
     JSGlobalObject *globalObject;
@@ -680,13 +678,13 @@ int WeexRuntime::createInstance(const String &instanceId, const String &func, co
             for (size_t i = 0; i < keyCount; ++i) {
                 auto propertyName_ = JSPropertyNameArrayGetNameAtIndex(pArray, i);
                 if(propertyName_ == nullptr) {
-                    Weex::TLog::tlog("id --> %s CreateInstance's propertyName_ is null", instanceId.utf8().data());
+                    LOG_TLOG("jsEngine","id --> %s CreateInstance's propertyName_ is null", instanceId.utf8().data());
                     continue;
                 }
 
                 auto propertyValue_ = JSObjectGetProperty(globalContextRef, ref, propertyName_, NULL);
                 if(propertyValue_ == nullptr) {
-                    Weex::TLog::tlog("id --> %s CreateInstance's propertyValue_ is null", instanceId.utf8().data());
+                    LOG_TLOG("jsEngine","id --> %s CreateInstance's propertyValue_ is null", instanceId.utf8().data());
                     continue;
                 }
 
@@ -728,25 +726,24 @@ int WeexRuntime::createInstance(const String &instanceId, const String &func, co
 
     VM &vm = globalObject->vm();
     JSLockHolder locker(&vm);
-
-    // if extend api is not null should exec befor createInstanceContext, such as rax-api
+    weex::base::TimeCalculator timeCalculator(weex::base::TaskPlatform::JSS_ENGINE, "weex run raxApi", instanceId.utf8().data());
+    timeCalculator.taskStart();
+    // if extend api is not null should exec before createInstanceContext, such as rax-api
     if (!extendsApi.isEmpty() && extendsApi.length() > 0) {
         if (!ExecuteJavaScript(globalObject, extendsApi, ("weex run raxApi"), true,
                                "runRaxApi", instanceId.utf8().data())) {
-            Weex::TLog::tlog("id --> %s CreateInstance's weex run raxApi failed", instanceId.utf8().data());
+            LOG_TLOG("jsEngine","id --> %s CreateInstance's weex run raxApi failed", instanceId.utf8().data());
             return static_cast<int32_t>(false);
         }
     }
-
-    LOGE("test-> : after run extendsApi");
+    timeCalculator.taskEnd();
 
     if (!ExecuteJavaScript(globalObject, script, ("weex createInstanceContext"), true,
                            "createInstanceContext", instanceId.utf8().data())) {
         LOGE("createInstanceContext and ExecuteJavaScript Error");
-        Weex::TLog::tlog("id --> %s CreateInstance's createInstanceContext failed", instanceId.utf8().data());
+        LOG_TLOG("jsEngine","id --> %s CreateInstance's createInstanceContext failed", instanceId.utf8().data());
         return static_cast<int32_t>(false);
     }
-    LOGE("test-> : after ExecuteJavaScript");
     return static_cast<int32_t>(true);
 }
 
@@ -766,9 +763,10 @@ int WeexRuntime::_initFramework(const String &source) {
 
 void WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *state,
                                           std::vector<VALUE_WITH_TYPE *> &params) {
-
-    //dyyLog delete
-//    String msg = "exejs Args ";
+    //delete
+    String msg = "exejs Args ";
+    weex::base::TimeCalculator timeCalculator(weex::base::TaskPlatform::JSS_ENGINE, "exejs Args", "exec js");
+    timeCalculator.taskStart();
 
     for (unsigned int i = 0; i < params.size(); i++) {
         VALUE_WITH_TYPE *paramsObject = params[i];
@@ -783,8 +781,8 @@ void WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *
                 const String &string2String = weexString2String(ipcstr);
                 obj->append(jString2JSValue(state, ipcstr->content, ipcstr->length));
 
-//                msg.append(":");
-//                msg.append(string2String.utf8().data());
+                msg.append(":");
+                msg.append(string2String.utf8().data());
             }
                 break;
             case ParamsType::JSONSTRING: {
@@ -794,8 +792,8 @@ void WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *
                 JSValue o = parseToObject(state, str);
                 obj->append(o);
 
-//                msg.append(":");
-//                msg.append(str.utf8().data());
+                msg.append(":");
+                msg.append(str.utf8().data());
             }
                 break;
             case ParamsType::BYTEARRAY: {
@@ -804,8 +802,8 @@ void WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *
 
                 obj->append(o);
 
-//                msg.append(":");
-//                msg.append(JSONStringify(state, o, 0).utf8().data());
+                msg.append(":");
+                msg.append(JSONStringify(state, o, 0).utf8().data());
             }
                 break;
             default:
@@ -813,8 +811,8 @@ void WeexRuntime::_getArgListFromJSParams(MarkedArgumentBuffer *obj, ExecState *
                 break;
         }
     }
-
-//    LOGE("dyyLog exejs Args is %s", msg.utf8().data());
+    timeCalculator.taskEnd();
+    timeCalculator.setArgs(msg.utf8().data());
 }
 
 WeexObjectHolder *WeexRuntime::getLightAppObjectHolder(const String &instanceId) {
diff --git a/weex_core/Source/android/utils/jni_load.cc b/weex_core/Source/android/utils/jni_load.cc
index 58129c3..624a1ae 100644
--- a/weex_core/Source/android/utils/jni_load.cc
+++ b/weex_core/Source/android/utils/jni_load.cc
@@ -56,6 +56,7 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved) {
   }
   PlatformBridge* bridge = new AndroidBridgeInSimple;
   WeexCoreManager::Instance()->set_platform_bridge(bridge);
+  weex::base::LogImplement::getLog()->setLogImplement(new LogUtilsWeexCore());
   return result ? JNI_VERSION_1_4 : JNI_FALSE;
 }
 
diff --git a/weex_core/Source/android/utils/params_utils.cpp b/weex_core/Source/android/utils/params_utils.cpp
index b4226a4..e79ed1a 100644
--- a/weex_core/Source/android/utils/params_utils.cpp
+++ b/weex_core/Source/android/utils/params_utils.cpp
@@ -127,7 +127,7 @@ std::vector<INIT_FRAMEWORK_PARAMS*> initFromParam(
     JNIEnv* env, jobject params,
     const std::function<void(const char*, const char*)>&
         ReportNativeInitStatus) {
-  LOGE("initFromParam is running ");
+  LOGD("initFromParam is running ");
   std::vector<INIT_FRAMEWORK_PARAMS*> initFrameworkParams;
 
 #define ADDSTRING(name)                                                     \
@@ -472,8 +472,13 @@ std::vector<INIT_FRAMEWORK_PARAMS*> initFromParam(
             genInitFrameworkParams(c_key_chars, c_value_chars));
         const std::string& key = jString2Str(env, jkey);
         if (key != "") {
+          const std::string &value = jString2Str(env, jvalue);
           WXCoreEnvironment::getInstance()->AddOption(key,
-                                                      jString2Str(env, jvalue));
+                                                      value);
+          if(key == "debugMode" && value == "true"){
+            __android_log_print(ANDROID_LOG_ERROR,"WeexCore","setDebugMode  2 ");
+            weex::base::LogImplement::getLog()->setDebugMode(true);
+          }
         }
       }
     }
diff --git a/weex_core/Source/android/wrap/log_utils.cpp b/weex_core/Source/android/wrap/log_utils.cpp
index da6b7c0..1942259 100644
--- a/weex_core/Source/android/wrap/log_utils.cpp
+++ b/weex_core/Source/android/wrap/log_utils.cpp
@@ -18,18 +18,20 @@
  */
 
 #include <sstream>
+#include <android/log.h>
 #include "android/wrap/log_utils.h"
 
 #include "android/base/string/string_utils.h"
 #include "base/android/jni/android_jni.h"
+#include "log_utils.h"
 
 namespace WeexCore {
 
 const char kWXLogUtilsClassPath[] = "com/taobao/weex/utils/WXLogUtils";
-jclass g_WXLogUtils_clazz = nullptr;
+static jclass g_WXLogUtils_clazz = nullptr;
 
 static intptr_t g_WXLogUtils_d = 0;
-static void Java_WXLogUtils_d(JNIEnv* env, jstring tag, jbyteArray msg) {
+static void Java_WXLogUtils_d(JNIEnv *env, jstring tag, jbyteArray msg) {
   jmethodID method_id = base::android::GetMethod(
       env, g_WXLogUtils_clazz, base::android::STATIC_METHOD, "d",
       "(Ljava/lang/String;[B)V", &g_WXLogUtils_d);
@@ -39,7 +41,7 @@ static void Java_WXLogUtils_d(JNIEnv* env, jstring tag, jbyteArray msg) {
 }
 
 static intptr_t g_WXLogUtils_i = 0;
-static void Java_WXLogUtils_i(JNIEnv* env, jstring tag, jbyteArray msg) {
+static void Java_WXLogUtils_i(JNIEnv *env, jstring tag, jbyteArray msg) {
   jmethodID method_id = base::android::GetMethod(
       env, g_WXLogUtils_clazz, base::android::STATIC_METHOD, "i",
       "(Ljava/lang/String;[B)V", &g_WXLogUtils_i);
@@ -49,7 +51,7 @@ static void Java_WXLogUtils_i(JNIEnv* env, jstring tag, jbyteArray msg) {
 }
 
 static intptr_t g_WXLogUtils_w = 0;
-static void Java_WXLogUtils_w(JNIEnv* env, jstring tag, jbyteArray msg) {
+static void Java_WXLogUtils_w(JNIEnv *env, jstring tag, jbyteArray msg) {
   jmethodID method_id = base::android::GetMethod(
       env, g_WXLogUtils_clazz, base::android::STATIC_METHOD, "w",
       "(Ljava/lang/String;[B)V", &g_WXLogUtils_w);
@@ -59,7 +61,7 @@ static void Java_WXLogUtils_w(JNIEnv* env, jstring tag, jbyteArray msg) {
 }
 
 static intptr_t g_WXLogUtils_e = 0;
-static void Java_WXLogUtils_e(JNIEnv* env, jstring tag, jbyteArray msg) {
+static void Java_WXLogUtils_e(JNIEnv *env, jstring tag, jbyteArray msg) {
   jmethodID method_id = base::android::GetMethod(
       env, g_WXLogUtils_clazz, base::android::STATIC_METHOD, "e",
       "(Ljava/lang/String;[B)V", &g_WXLogUtils_e);
@@ -68,13 +70,23 @@ static void Java_WXLogUtils_e(JNIEnv* env, jstring tag, jbyteArray msg) {
   base::android::CheckException(env);
 }
 
-bool LogUtils::RegisterJNIUtils(JNIEnv* env) {
+static intptr_t g_WXLogUtils_Msg = 0;
+static void Java_WXLogUtils_Performance(JNIEnv *env, jstring tag, jbyteArray msg) {
+  jmethodID method_id = base::android::GetMethod(
+      env, g_WXLogUtils_clazz, base::android::STATIC_METHOD, "performance",
+      "(Ljava/lang/String;[B)V", &g_WXLogUtils_Msg);
+
+  env->CallStaticVoidMethod(g_WXLogUtils_clazz, method_id, tag, msg);
+  base::android::CheckException(env);
+}
+
+bool LogUtils::RegisterJNIUtils(JNIEnv *env) {
   g_WXLogUtils_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
       base::android::GetClass(env, kWXLogUtilsClassPath).Get()));
   return true;
 }
 
-void LogUtils::NativeLog(JNIEnv* env, const char* str_array) {
+void LogUtils::NativeLog(JNIEnv *env, const char *str_array) {
   auto tag = base::android::ScopedLocalJavaRef<jstring>(
       env, env->NewStringUTF("jsLog"));
   auto msg = base::android::ScopedLocalJavaRef<jbyteArray>(
@@ -82,33 +94,59 @@ void LogUtils::NativeLog(JNIEnv* env, const char* str_array) {
   Java_WXLogUtils_d(env, tag.Get(), msg.Get());
 }
 
-void LogUtils::log(LogLevel level, const char* tag,  const char* file, unsigned long line, const char* log){
+bool LogUtilsWeexCore::log(WeexCore::LogLevel level,
+                           const char *tag,
+                           const char *file,
+                           unsigned long line,
+                           const char *log) {
   JNIEnv *env = base::android::AttachCurrentThread();
   if (env == nullptr) {
-    return;
+    return false;
   }
-  else {
-    std::stringstream ss;
-    ss << file << ":" << line << "," << log;
-
-    auto tag_jstring = base::android::ScopedLocalJavaRef<jstring>(
-        env,  env->NewStringUTF(tag));
-    auto msg_jbyteArray = base::android::ScopedLocalJavaRef<jbyteArray>(
-        env, newJByteArray(env, ss.str().c_str()));
-    switch (level) {
-      case LogLevel::Debug:
-        Java_WXLogUtils_d(env, tag_jstring.Get(), msg_jbyteArray.Get());
-        break;
-      case LogLevel::Info:
-        Java_WXLogUtils_i(env, tag_jstring.Get(), msg_jbyteArray.Get());
-        break;
-      case LogLevel::Warn:
-        Java_WXLogUtils_w(env, tag_jstring.Get(), msg_jbyteArray.Get());
-        break;
-      case LogLevel::Error:
-        Java_WXLogUtils_e(env, tag_jstring.Get(), msg_jbyteArray.Get());
-        break;
+
+  if(!weex::base::LogImplement::getLog()->debugMode()) {
+    if(level < WeexCore::LogLevel::Error) {
+      return true;
     }
   }
+
+  std::stringstream ss;
+  ss << file << ":" << line << "," << log;
+  auto tag_jstring = base::android::ScopedLocalJavaRef<jstring>(
+      env, env->NewStringUTF(tag));
+  auto msg_jbyteArray = base::android::ScopedLocalJavaRef<jbyteArray>(
+      env, WeexCore::newJByteArray(env, ss.str().c_str()));
+  switch (level) {
+    case WeexCore::LogLevel::Info:
+      WeexCore::Java_WXLogUtils_i(env,
+                                  tag_jstring.Get(),
+                                  msg_jbyteArray.Get());
+      break;
+    case WeexCore::LogLevel::Warn:
+      WeexCore::Java_WXLogUtils_w(env,
+                                  tag_jstring.Get(),
+                                  msg_jbyteArray.Get());
+      break;
+    case WeexCore::LogLevel::Error:
+    case WeexCore::LogLevel::Tlog:
+    case WeexCore::LogLevel::Wtf:
+      WeexCore::Java_WXLogUtils_e(env,
+                                  tag_jstring.Get(),
+                                  msg_jbyteArray.Get());
+      break;
+    case WeexCore::LogLevel::Performance :
+      WeexCore::Java_WXLogUtils_Performance(env,
+                                            tag_jstring.Get(),
+                                            msg_jbyteArray.Get());
+      break;
+    default:
+      WeexCore::Java_WXLogUtils_d(env,
+                                  tag_jstring.Get(),
+                                  msg_jbyteArray.Get());
+      break;
+  }
+  return true;
 }
+
 }  // namespace WeexCore
+
diff --git a/weex_core/Source/android/wrap/log_utils.h b/weex_core/Source/android/wrap/log_utils.h
index 5bdf164..9b8f0f3 100644
--- a/weex_core/Source/android/wrap/log_utils.h
+++ b/weex_core/Source/android/wrap/log_utils.h
@@ -22,15 +22,25 @@
 
 #include <jni.h>
 #include "base/log_defines.h"
-#include "core/bridge/log_bridge.h"
+#include "base/log_defines.h"
 
 namespace WeexCore {
-class LogUtils : public LogBridge {
+class LogUtils {
+ public:
+  static bool RegisterJNIUtils(JNIEnv *env);
+  static void NativeLog(JNIEnv *env, const char *str_array);
+};
+
+class LogUtilsWeexCore : public weex::base::LogBase {
  public:
-  static bool RegisterJNIUtils(JNIEnv* env);
-  static void NativeLog(JNIEnv* env, const char* str_array);
-  void log(LogLevel level, const char* tag,  const char* file, unsigned long line, const char* log) override;
+  bool log(WeexCore::LogLevel level,
+           const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log) override;
 };
+
 }  // namespace WeexCore
 
+
 #endif  // WEEX_PROJECT_LOG_UTILS_H
diff --git a/weex_core/Source/android/wrap/wx_bridge.cpp b/weex_core/Source/android/wrap/wx_bridge.cpp
index 9cf5ee3..e73bc12 100755
--- a/weex_core/Source/android/wrap/wx_bridge.cpp
+++ b/weex_core/Source/android/wrap/wx_bridge.cpp
@@ -19,7 +19,9 @@
 
 #include "android/wrap/wx_bridge.h"
 #include <fstream>
-#include <core/render/manager/render_manager.h>
+#include "core/render/manager/render_manager.h"
+#include "base/time_calculator.h"
+#include "base/log_defines.h"
 
 #include "android/wrap/log_utils.h"
 #include "android/base/string/string_utils.h"
@@ -270,6 +272,19 @@ static void RemoveInstanceRenderType(JNIEnv* env, jobject jcaller,
           ->RemovePageRenderType(jString2StrFast(env, instanceId));
 }
 
+static void SetLogType(JNIEnv* env, jobject jcaller, jfloat logLevel,
+                       jfloat isPerf){
+  int32_t l = (int32_t)logLevel;
+  weex::base::LogImplement::getLog()->setPrintLevel((WeexCore::LogLevel)l);
+  bool flag = isPerf == 1;
+  weex::base::LogImplement::getLog()->setPerfMode(flag);
+  LOGE("WeexCore setLog Level %d in Performance mode %s debug %d", l, flag ? "true" : "false", (int)WeexCore::LogLevel::Debug);
+  WeexCoreManager::Instance()
+      ->getPlatformBridge()
+      ->core_side()
+      ->SetLogType(l, flag);
+}
+
 static void SetPageArgument(JNIEnv* env, jobject jcaller,
                             jstring instanceId,
                             jstring key,
@@ -377,8 +392,6 @@ static jint InitFramework(JNIEnv* env, jobject object, jstring script,
   auto result =
       bridge->core_side()->InitFramework(c_script.getChars(), params_vector);
   freeParams(params_vector);
-
-  WeexCoreManager::Instance()->set_log_bridge(new LogUtils());
   return result;
 }
 
diff --git a/weex_core/Source/base/CMakeLists.txt b/weex_core/Source/base/CMakeLists.txt
index fceea55..27e60bc 100644
--- a/weex_core/Source/base/CMakeLists.txt
+++ b/weex_core/Source/base/CMakeLists.txt
@@ -27,6 +27,7 @@ set(${BASE_LIBRARY_NAME}_SOURCES
     closure.h
     make_copyable.h
     time_calculator.h
+    time_calculator.cpp
     time_point.h
     time_point.cc
     time_unit.h
diff --git a/weex_core/Source/base/android/jni/scoped_java_ref.cpp b/weex_core/Source/base/android/jni/scoped_java_ref.cpp
index 0b1c208..2bad700 100644
--- a/weex_core/Source/base/android/jni/scoped_java_ref.cpp
+++ b/weex_core/Source/base/android/jni/scoped_java_ref.cpp
@@ -18,6 +18,7 @@
  */
 // Copyright 2017 The Weex Authors. All rights reserved.
 
+#include <base/log_defines.h>
 #include "base/android/jni/scoped_java_ref.h"
 
 #include "base/android/jni/android_jni.h"
@@ -27,7 +28,8 @@ namespace android {
 
 JavaRef::JavaRef() : obj_(nullptr) {}
 
-JavaRef::JavaRef(JNIEnv *env, jobject obj) : obj_(obj) {}
+JavaRef::JavaRef(JNIEnv *env, jobject obj) : obj_(obj) {
+}
 
 void JavaRef::ResetNewLocalRef(JNIEnv *env, jobject obj) {
   if (!env) {
@@ -44,6 +46,7 @@ void JavaRef::ResetNewLocalRef(JNIEnv *env, jobject obj) {
   if (obj_)
     env->DeleteLocalRef(obj_);
   obj_ = obj;
+
 }
 
 void JavaRef::ReleaseLocalRef(JNIEnv *env) {
diff --git a/weex_core/Source/base/android/jni/scoped_java_ref.h b/weex_core/Source/base/android/jni/scoped_java_ref.h
index 408452e..d900cbe 100644
--- a/weex_core/Source/base/android/jni/scoped_java_ref.h
+++ b/weex_core/Source/base/android/jni/scoped_java_ref.h
@@ -21,6 +21,7 @@
 #define WeexCore_BASE_ANDROID_SCOPED_JAVA_REF_H_
 
 #include <jni.h>
+#include <log_defines.h>
 
 namespace base {
 namespace android {
diff --git a/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h b/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h
index f8e04ce..c059a6f 100755
--- a/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h
+++ b/weex_core/Source/base/android/jniprebuild/jniheader/WXBridge_jni.h
@@ -39,1348 +39,1366 @@ jclass g_WXBridge_clazz = NULL;
 
 }  // namespace
 
-static jint InitFrameworkEnv(JNIEnv* env, jobject jcaller,
-    jstring framework,
-    jobject params,
-    jstring cacheDir,
-    jboolean pieSupport);
-
-static jint InitFramework(JNIEnv* env, jobject jcaller,
-    jstring framework,
-    jobject params);
-
-static void RefreshInstance(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring _namespace,
-    jstring function,
-    jobjectArray args);
-
-static jint ExecJS(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring name,
-    jstring function,
-    jobjectArray args);
-
-static jint ExecJSService(JNIEnv* env, jobject jcaller,
-    jstring javascript);
-
-static void ExecJSWithCallback(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring _namespace,
-    jstring _function,
-    jobjectArray args,
-    jlong callbackId);
-
-static jint CreateInstanceContext(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring name,
-    jstring function,
-    jobjectArray args);
-
-static jint DestoryInstance(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring name,
-    jstring function,
-    jobjectArray args);
-
-static jstring ExecJSOnInstance(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring script,
-    jint type);
-
-static void onInteractionTimeUpdate(JNIEnv* env, jobject jcaller, jstring instanceId);
-
-static void FireEventOnDataRenderNode(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jstring type,
-    jstring data,
-    jstring domChanges);
-
-static void InvokeCallbackOnDataRender(JNIEnv* env, jobject jcaller,
+static jint InitFrameworkEnv(JNIEnv *env, jobject jcaller,
+                             jstring framework,
+                             jobject params,
+                             jstring cacheDir,
+                             jboolean pieSupport);
+
+static jint InitFramework(JNIEnv *env, jobject jcaller,
+                          jstring framework,
+                          jobject params);
+
+static void RefreshInstance(JNIEnv *env, jobject jcaller,
+                            jstring instanceId,
+                            jstring _namespace,
+                            jstring function,
+                            jobjectArray args);
+
+static jint ExecJS(JNIEnv *env, jobject jcaller,
+                   jstring instanceId,
+                   jstring name,
+                   jstring function,
+                   jobjectArray args);
+
+static jint ExecJSService(JNIEnv *env, jobject jcaller,
+                          jstring javascript);
+
+static void ExecJSWithCallback(JNIEnv *env, jobject jcaller,
+                               jstring instanceId,
+                               jstring _namespace,
+                               jstring _function,
+                               jobjectArray args,
+                               jlong callbackId);
+
+static jint CreateInstanceContext(JNIEnv *env, jobject jcaller,
+                                  jstring instanceId,
+                                  jstring name,
+                                  jstring function,
+                                  jobjectArray args);
+
+static jint DestoryInstance(JNIEnv *env, jobject jcaller,
+                            jstring instanceId,
+                            jstring name,
+                            jstring function,
+                            jobjectArray args);
+
+static jstring ExecJSOnInstance(JNIEnv *env, jobject jcaller,
+                                jstring instanceId,
+                                jstring script,
+                                jint type);
+
+static void onInteractionTimeUpdate(JNIEnv *env, jobject jcaller, jstring instanceId);
+
+static void FireEventOnDataRenderNode(JNIEnv *env, jobject jcaller,
+                                      jstring instanceId,
+                                      jstring ref,
+                                      jstring type,
+                                      jstring data,
+                                      jstring domChanges);
+
+static void InvokeCallbackOnDataRender(JNIEnv *env, jobject jcaller,
                                        jstring instanceId,
                                        jstring callbackId,
                                        jstring data,
                                        jboolean keepAlive);
 
-static void RegisterModuleOnDataRenderNode(JNIEnv* env, jobject jcaller,
-    jstring data);
+static void RegisterModuleOnDataRenderNode(JNIEnv *env, jobject jcaller,
+                                           jstring data);
 
-static void RegisterComponentOnDataRenderNode(JNIEnv* env, jobject jcaller,
+static void RegisterComponentOnDataRenderNode(JNIEnv *env, jobject jcaller,
                                               jstring data);
-static void TakeHeapSnapshot(JNIEnv* env, jobject jcaller,
-    jstring filename);
-
-static void BindMeasurementToRenderObject(JNIEnv* env, jobject jcaller,
-    jlong ptr);
-
-static void SetRenderContainerWrapContent(JNIEnv* env, jobject jcaller,
-    jboolean wrap,
-    jstring instanceId);
-
-static jlongArray GetFirstScreenRenderTime(JNIEnv* env, jobject jcaller,
-    jstring instanceId);
-
-static jlongArray GetRenderFinishTime(JNIEnv* env, jobject jcaller,
-    jstring instanceId);
-
-static void SetDefaultHeightAndWidthIntoRootDom(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jfloat defaultWidth,
-    jfloat defaultHeight,
-    jboolean isWidthWrapContent,
-    jboolean isHeightWrapContent);
-
-static void OnInstanceClose(JNIEnv* env, jobject jcaller,
-    jstring instanceId);
-
-static void ForceLayout(JNIEnv* env, jobject jcaller,
-    jstring instanceId);
-
-static jboolean NotifyLayout(JNIEnv* env, jobject jcaller,
-    jstring instanceId);
-
-static void SetStyleWidth(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jfloat value);
-
-static void SetStyleHeight(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jfloat value);
-
-static void SetMargin(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jint edge,
-    jfloat value);
-
-static void SetPadding(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jint edge,
-    jfloat value);
-
-static void SetPosition(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jint edge,
-    jfloat value);
-
-static void MarkDirty(JNIEnv* env, jobject jcaller,
-    jstring instanceId,
-    jstring ref,
-    jboolean dirty);
-
-static void SetDeviceDisplay(JNIEnv* env, jobject jcaller,
-        jstring instanceId, jfloat width, jfloat height, jfloat scale);
-
-static void RegisterCoreEnv(JNIEnv* env, jobject jcaller,
-    jstring key,
-    jstring value);
-
-static void ResetWXBridge(JNIEnv* env, jobject jcaller,
-    jobject bridge,
-    jstring className);
-
-static void UpdateInitFrameworkParams(JNIEnv* env, jobject jcaller,
+static void TakeHeapSnapshot(JNIEnv *env, jobject jcaller,
+                             jstring filename);
+
+static void BindMeasurementToRenderObject(JNIEnv *env, jobject jcaller,
+                                          jlong ptr);
+
+static void SetRenderContainerWrapContent(JNIEnv *env, jobject jcaller,
+                                          jboolean wrap,
+                                          jstring instanceId);
+
+static jlongArray GetFirstScreenRenderTime(JNIEnv *env, jobject jcaller,
+                                           jstring instanceId);
+
+static jlongArray GetRenderFinishTime(JNIEnv *env, jobject jcaller,
+                                      jstring instanceId);
+
+static void SetDefaultHeightAndWidthIntoRootDom(JNIEnv *env, jobject jcaller,
+                                                jstring instanceId,
+                                                jfloat defaultWidth,
+                                                jfloat defaultHeight,
+                                                jboolean isWidthWrapContent,
+                                                jboolean isHeightWrapContent);
+
+static void OnInstanceClose(JNIEnv *env, jobject jcaller,
+                            jstring instanceId);
+
+static void ForceLayout(JNIEnv *env, jobject jcaller,
+                        jstring instanceId);
+
+static jboolean NotifyLayout(JNIEnv *env, jobject jcaller,
+                             jstring instanceId);
+
+static void SetStyleWidth(JNIEnv *env, jobject jcaller,
+                          jstring instanceId,
+                          jstring ref,
+                          jfloat value);
+
+static void SetStyleHeight(JNIEnv *env, jobject jcaller,
+                           jstring instanceId,
+                           jstring ref,
+                           jfloat value);
+
+static void SetMargin(JNIEnv *env, jobject jcaller,
+                      jstring instanceId,
+                      jstring ref,
+                      jint edge,
+                      jfloat value);
+
+static void SetPadding(JNIEnv *env, jobject jcaller,
+                       jstring instanceId,
+                       jstring ref,
+                       jint edge,
+                       jfloat value);
+
+static void SetPosition(JNIEnv *env, jobject jcaller,
+                        jstring instanceId,
+                        jstring ref,
+                        jint edge,
+                        jfloat value);
+
+static void MarkDirty(JNIEnv *env, jobject jcaller,
+                      jstring instanceId,
+                      jstring ref,
+                      jboolean dirty);
+
+static void SetDeviceDisplay(JNIEnv *env, jobject jcaller,
+                             jstring instanceId, jfloat width, jfloat height, jfloat scale);
+
+static void RegisterCoreEnv(JNIEnv *env, jobject jcaller,
+                            jstring key,
+                            jstring value);
+
+static void ResetWXBridge(JNIEnv *env, jobject jcaller,
+                          jobject bridge,
+                          jstring className);
+
+static void UpdateInitFrameworkParams(JNIEnv *env, jobject jcaller,
                                       jstring key,
                                       jstring value,
                                       jstring desc);
 
-static void UpdateGlobalConfig(JNIEnv* env, jobject jcaller,
-    jstring config);
+static void UpdateGlobalConfig(JNIEnv *env, jobject jcaller,
+                               jstring config);
 
-
-static void SetInstanceRenderType(JNIEnv* env, jobject jcaller,
+static void SetInstanceRenderType(JNIEnv *env, jobject jcaller,
                                   jstring instanceId,
                                   jstring renderType);
 
-static void RemoveInstanceRenderType(JNIEnv* env, jobject jcaller,
+static void RemoveInstanceRenderType(JNIEnv *env, jobject jcaller,
                                      jstring instanceId);
 
-static void SetViewPortWidth(JNIEnv* env, jobject jcaller,
-                             jstring instanceId,jfloat viewPortWidth);
+static void SetViewPortWidth(JNIEnv *env, jobject jcaller,
+                             jstring instanceId, jfloat viewPortWidth);
 
-static void SetPageArgument(JNIEnv* env, jobject jcaller,
+static void SetPageArgument(JNIEnv *env, jobject jcaller,
                             jstring instanceId,
                             jstring key,
                             jstring value);
 
+static void SetLogType(JNIEnv* env, jobject jcaller, jfloat type,
+                       jfloat isPerf);
+
 // Step 2: method stubs.
 
 static intptr_t g_WXBridge_onReceivedResult = 0;
-static void Java_WXBridge_onReceivedResult(JNIEnv* env, jobject obj, jlong
-    callbackId,
-    jbyteArray result) {
+static void Java_WXBridge_onReceivedResult(JNIEnv *env, jobject obj, jlong
+callbackId,
+                                           jbyteArray result) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "onReceivedResult",
-
-"("
-"J"
-"[B"
-")"
-"V",
-      &g_WXBridge_onReceivedResult);
-
-     env->CallVoidMethod(obj,
-          method_id, callbackId, result);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "onReceivedResult",
+
+          "("
+          "J"
+          "[B"
+          ")"
+          "V",
+          &g_WXBridge_onReceivedResult);
+
+  env->CallVoidMethod(obj,
+                      method_id, callbackId, result);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_callNative = 0;
-static jint Java_WXBridge_callNative(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jbyteArray tasks,
-    jstring callback) {
+static jint Java_WXBridge_callNative(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                     jbyteArray tasks,
+                                     jstring callback) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callNative",
-
-"("
-"Ljava/lang/String;"
-"[B"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callNative);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callNative",
+
+          "("
+          "Ljava/lang/String;"
+          "[B"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callNative);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, tasks, callback);
+                         method_id, instanceId, tasks, callback);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_reportJSException = 0;
-static void Java_WXBridge_reportJSException(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring func,
-    jstring exception) {
+static void Java_WXBridge_reportJSException(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                            jstring func,
+                                            jstring exception) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "reportJSException",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"V",
-      &g_WXBridge_reportJSException);
-
-     env->CallVoidMethod(obj,
-          method_id, instanceId, func, exception);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "reportJSException",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "V",
+          &g_WXBridge_reportJSException);
+
+  env->CallVoidMethod(obj,
+                      method_id, instanceId, func, exception);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_callNativeModule = 0;
 static base::android::ScopedLocalJavaRef<jobject>
-    Java_WXBridge_callNativeModule(JNIEnv* env, jobject obj, jstring instanceId,
-    jstring module,
-    jstring method,
-    jbyteArray arguments,
-    jbyteArray options) {
+Java_WXBridge_callNativeModule(JNIEnv *env, jobject obj, jstring instanceId,
+                               jstring module,
+                               jstring method,
+                               jbyteArray arguments,
+                               jbyteArray options) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), NULL);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callNativeModule",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[B"
-"[B"
-")"
-"Ljava/lang/Object;",
-      &g_WXBridge_callNativeModule);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callNativeModule",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "[B"
+          "[B"
+          ")"
+          "Ljava/lang/Object;",
+          &g_WXBridge_callNativeModule);
 
   jobject ret =
       env->CallObjectMethod(obj,
-          method_id, instanceId, module, method, arguments, options);
+                            method_id, instanceId, module, method, arguments, options);
   base::android::CheckException(env);
   return base::android::ScopedLocalJavaRef<jobject>(env, ret);
 }
 
 static intptr_t g_WXBridge_callNativeComponent = 0;
-static void Java_WXBridge_callNativeComponent(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    jstring method,
-    jbyteArray arguments,
-    jbyteArray optionsData) {
+static void Java_WXBridge_callNativeComponent(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                              jstring ref,
+                                              jstring method,
+                                              jbyteArray arguments,
+                                              jbyteArray optionsData) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callNativeComponent",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[B"
-"[B"
-")"
-"V",
-      &g_WXBridge_callNativeComponent);
-
-     env->CallVoidMethod(obj,
-          method_id, instanceId, ref, method, arguments, optionsData);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callNativeComponent",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "[B"
+          "[B"
+          ")"
+          "V",
+          &g_WXBridge_callNativeComponent);
+
+  env->CallVoidMethod(obj,
+                      method_id, instanceId, ref, method, arguments, optionsData);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_setTimeoutNative = 0;
-static void Java_WXBridge_setTimeoutNative(JNIEnv* env, jobject obj, jstring
-    callbackId,
-    jstring time) {
+static void Java_WXBridge_setTimeoutNative(JNIEnv *env, jobject obj, jstring
+callbackId,
+                                           jstring time) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "setTimeoutNative",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"V",
-      &g_WXBridge_setTimeoutNative);
-
-     env->CallVoidMethod(obj,
-          method_id, callbackId, time);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "setTimeoutNative",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "V",
+          &g_WXBridge_setTimeoutNative);
+
+  env->CallVoidMethod(obj,
+                      method_id, callbackId, time);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_setJSFrmVersion = 0;
-static void Java_WXBridge_setJSFrmVersion(JNIEnv* env, jobject obj, jstring
-    version) {
+static void Java_WXBridge_setJSFrmVersion(JNIEnv *env, jobject obj, jstring
+version) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "setJSFrmVersion",
-
-"("
-"Ljava/lang/String;"
-")"
-"V",
-      &g_WXBridge_setJSFrmVersion);
-
-     env->CallVoidMethod(obj,
-          method_id, version);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "setJSFrmVersion",
+
+          "("
+          "Ljava/lang/String;"
+          ")"
+          "V",
+          &g_WXBridge_setJSFrmVersion);
+
+  env->CallVoidMethod(obj,
+                      method_id, version);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_callUpdateFinish = 0;
-static jint Java_WXBridge_callUpdateFinish(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jbyteArray tasks,
-    jstring callback) {
+static jint Java_WXBridge_callUpdateFinish(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                           jbyteArray tasks,
+                                           jstring callback) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callUpdateFinish",
-
-"("
-"Ljava/lang/String;"
-"[B"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callUpdateFinish);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callUpdateFinish",
+
+          "("
+          "Ljava/lang/String;"
+          "[B"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callUpdateFinish);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, tasks, callback);
+                         method_id, instanceId, tasks, callback);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callRefreshFinish = 0;
-static jint Java_WXBridge_callRefreshFinish(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jbyteArray tasks,
-    jstring callback) {
+static jint Java_WXBridge_callRefreshFinish(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                            jbyteArray tasks,
+                                            jstring callback) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callRefreshFinish",
-
-"("
-"Ljava/lang/String;"
-"[B"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callRefreshFinish);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callRefreshFinish",
+
+          "("
+          "Ljava/lang/String;"
+          "[B"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callRefreshFinish);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, tasks, callback);
+                         method_id, instanceId, tasks, callback);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_reportServerCrash = 0;
-static void Java_WXBridge_reportServerCrash(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring crashFile) {
+static void Java_WXBridge_reportServerCrash(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                            jstring crashFile) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "reportServerCrash",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"V",
-      &g_WXBridge_reportServerCrash);
-
-     env->CallVoidMethod(obj,
-          method_id, instanceId, crashFile);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "reportServerCrash",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "V",
+          &g_WXBridge_reportServerCrash);
+
+  env->CallVoidMethod(obj,
+                      method_id, instanceId, crashFile);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_callCreateBody = 0;
-static jint Java_WXBridge_callCreateBody(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring componentType,
-    jstring ref,
-    jobject styles,
-    jobject attributes,
-    jobject events,
-    jfloatArray margins,
-    jfloatArray paddings,
-    jfloatArray borders) {
+static jint Java_WXBridge_callCreateBody(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                         jstring componentType,
+                                         jstring ref,
+                                         jobject styles,
+                                         jobject attributes,
+                                         jobject events,
+                                         jfloatArray margins,
+                                         jfloatArray paddings,
+                                         jfloatArray borders) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callCreateBody",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashSet;"
-"[F"
-"[F"
-"[F"
-")"
-"I",
-      &g_WXBridge_callCreateBody);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callCreateBody",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashSet;"
+          "[F"
+          "[F"
+          "[F"
+          ")"
+          "I",
+          &g_WXBridge_callCreateBody);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, componentType, ref, styles, attributes, events,
-              margins, paddings, borders);
+                         method_id, instanceId, componentType, ref, styles, attributes, events,
+                         margins, paddings, borders);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callAddElement = 0;
-static jint Java_WXBridge_callAddElement(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring componentType,
-    jstring ref,
-    int index,
-    jstring parentRef,
-    jobject styles,
-    jobject attributes,
-    jobject events,
-    jfloatArray margins,
-    jfloatArray paddings,
-    jfloatArray borders,
-    jboolean willLayout) {
+static jint Java_WXBridge_callAddElement(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                         jstring componentType,
+                                         jstring ref,
+                                         int index,
+                                         jstring parentRef,
+                                         jobject styles,
+                                         jobject attributes,
+                                         jobject events,
+                                         jfloatArray margins,
+                                         jfloatArray paddings,
+                                         jfloatArray borders,
+                                         jboolean willLayout) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callAddElement",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-"Ljava/lang/String;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashSet;"
-"[F"
-"[F"
-"[F"
-"Z"
-")"
-"I",
-      &g_WXBridge_callAddElement);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callAddElement",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "I"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashSet;"
+          "[F"
+          "[F"
+          "[F"
+          "Z"
+          ")"
+          "I",
+          &g_WXBridge_callAddElement);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, componentType, ref, int(index), parentRef,
-              styles, attributes, events, margins, paddings, borders,
-              willLayout);
+                         method_id, instanceId, componentType, ref, int(index), parentRef,
+                         styles, attributes, events, margins, paddings, borders,
+                         willLayout);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callRemoveElement = 0;
-static jint Java_WXBridge_callRemoveElement(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref) {
+static jint Java_WXBridge_callRemoveElement(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                            jstring ref) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callRemoveElement",
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callRemoveElement",
 
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callRemoveElement);
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callRemoveElement);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref);
+                         method_id, instanceId, ref);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callMoveElement = 0;
-static jint Java_WXBridge_callMoveElement(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    jstring parentref,
-    int index) {
+static jint Java_WXBridge_callMoveElement(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                          jstring ref,
+                                          jstring parentref,
+                                          int index) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callMoveElement",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-")"
-"I",
-      &g_WXBridge_callMoveElement);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callMoveElement",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "I"
+          ")"
+          "I",
+          &g_WXBridge_callMoveElement);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, parentref, int(index));
+                         method_id, instanceId, ref, parentref, int(index));
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callAddEvent = 0;
-static jint Java_WXBridge_callAddEvent(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    jstring event) {
+static jint Java_WXBridge_callAddEvent(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                       jstring ref,
+                                       jstring event) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callAddEvent",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callAddEvent);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callAddEvent",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callAddEvent);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, event);
+                         method_id, instanceId, ref, event);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callRemoveEvent = 0;
-static jint Java_WXBridge_callRemoveEvent(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    jstring event) {
+static jint Java_WXBridge_callRemoveEvent(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                          jstring ref,
+                                          jstring event) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callRemoveEvent",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callRemoveEvent);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callRemoveEvent",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callRemoveEvent);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, event);
+                         method_id, instanceId, ref, event);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callUpdateStyle = 0;
-static jint Java_WXBridge_callUpdateStyle(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    jobject styles,
-    jobject paddings,
-    jobject margins,
-    jobject borders) {
+static jint Java_WXBridge_callUpdateStyle(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                          jstring ref,
+                                          jobject styles,
+                                          jobject paddings,
+                                          jobject margins,
+                                          jobject borders) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callUpdateStyle",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashMap;"
-"Ljava/util/HashMap;"
-")"
-"I",
-      &g_WXBridge_callUpdateStyle);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callUpdateStyle",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashMap;"
+          ")"
+          "I",
+          &g_WXBridge_callUpdateStyle);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, styles, paddings, margins, borders);
+                         method_id, instanceId, ref, styles, paddings, margins, borders);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callUpdateAttrs = 0;
-static jint Java_WXBridge_callUpdateAttrs(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    jobject attrs) {
+static jint Java_WXBridge_callUpdateAttrs(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                          jstring ref,
+                                          jobject attrs) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callUpdateAttrs",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/util/HashMap;"
-")"
-"I",
-      &g_WXBridge_callUpdateAttrs);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callUpdateAttrs",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          ")"
+          "I",
+          &g_WXBridge_callUpdateAttrs);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, attrs);
+                         method_id, instanceId, ref, attrs);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callAddChildToRichtext = 0;
-static jint Java_WXBridge_callAddChildToRichtext(JNIEnv* env, jobject obj, jstring instanceId, jstring nodeType,
-                                          jstring ref,
-                                          jstring parentRef,
-                                          jstring richtextRef,
-                                          jobject styles,
-                                          jobject attrs) {
-    /* Must call RegisterNativesImpl()  */
-    //CHECK_CLAZZ(env, obj,
-    //    WXBridge_clazz(env), 0);
-    jmethodID method_id =
-            base::android::GetMethod(
-                    env, WXBridge_clazz(env),
-                    base::android::INSTANCE_METHOD,
-                    "callAddChildToRichtext",
-
-                    "("
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/util/HashMap;"
-                    "Ljava/util/HashMap;"
-                    ")"
-                    "I",
-                    &g_WXBridge_callAddChildToRichtext);
-
-    jint ret =
-            env->CallIntMethod(obj,
-                               method_id, instanceId, nodeType, ref,  parentRef, richtextRef, styles, attrs);
-    base::android::CheckException(env);
-    return ret;
-}
-
-static intptr_t g_WXBridge_callRemoveChildFromRichtext = 0;
-static jint Java_WXBridge_callRemoveChildFromRichtext(JNIEnv* env, jobject obj, jstring instanceId,
+static jint Java_WXBridge_callAddChildToRichtext(JNIEnv *env,
+                                                 jobject obj,
+                                                 jstring instanceId,
+                                                 jstring nodeType,
                                                  jstring ref,
                                                  jstring parentRef,
-                                                 jstring richtextRef) {
-    /* Must call RegisterNativesImpl()  */
-    //CHECK_CLAZZ(env, obj,
-    //    WXBridge_clazz(env), 0);
-    jmethodID method_id =
-            base::android::GetMethod(
-                    env, WXBridge_clazz(env),
-                    base::android::INSTANCE_METHOD,
-                    "callRemoveChildFromRichtext",
-
-                    "("
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    ")"
-                    "I",
-                    &g_WXBridge_callRemoveChildFromRichtext);
-
-    jint ret =
-            env->CallIntMethod(obj,
-                               method_id, instanceId, ref,  parentRef, richtextRef);
-    base::android::CheckException(env);
-    return ret;
+                                                 jstring richtextRef,
+                                                 jobject styles,
+                                                 jobject attrs) {
+  /* Must call RegisterNativesImpl()  */
+  //CHECK_CLAZZ(env, obj,
+  //    WXBridge_clazz(env), 0);
+  jmethodID method_id =
+      base::android::GetMethod(
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callAddChildToRichtext",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          "Ljava/util/HashMap;"
+          ")"
+          "I",
+          &g_WXBridge_callAddChildToRichtext);
+
+  jint ret =
+      env->CallIntMethod(obj,
+                         method_id,
+                         instanceId,
+                         nodeType,
+                         ref,
+                         parentRef,
+                         richtextRef,
+                         styles,
+                         attrs);
+  base::android::CheckException(env);
+  return ret;
 }
 
-static intptr_t g_WXBridge_callUpdateRichtextStyle = 0;
-static jint Java_WXBridge_callUpdateRichtextStyle(JNIEnv* env, jobject obj, jstring instanceId,
-                                                 jstring ref,
-                                                 jobject styles,
-                                                 jstring parentRef,
-                                                 jstring richtextRef) {
-    /* Must call RegisterNativesImpl()  */
-    //CHECK_CLAZZ(env, obj,
-    //    WXBridge_clazz(env), 0);
-    jmethodID method_id =
-            base::android::GetMethod(
-                    env, WXBridge_clazz(env),
-                    base::android::INSTANCE_METHOD,
-                    "callUpdateRichtextStyle",
-                    "("
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/util/HashMap;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    ")"
-                    "I",
-                    &g_WXBridge_callUpdateRichtextStyle);
-
-    jint ret =
-            env->CallIntMethod(obj,
-                               method_id, instanceId, ref, styles, parentRef, richtextRef);
-    base::android::CheckException(env);
-    return ret;
+static intptr_t g_WXBridge_callRemoveChildFromRichtext = 0;
+static jint Java_WXBridge_callRemoveChildFromRichtext(JNIEnv *env, jobject obj, jstring instanceId,
+                                                      jstring ref,
+                                                      jstring parentRef,
+                                                      jstring richtextRef) {
+  /* Must call RegisterNativesImpl()  */
+  //CHECK_CLAZZ(env, obj,
+  //    WXBridge_clazz(env), 0);
+  jmethodID method_id =
+      base::android::GetMethod(
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callRemoveChildFromRichtext",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callRemoveChildFromRichtext);
+
+  jint ret =
+      env->CallIntMethod(obj,
+                         method_id, instanceId, ref, parentRef, richtextRef);
+  base::android::CheckException(env);
+  return ret;
 }
 
-static intptr_t g_WXBridge_callUpdateRichtextChildAttr = 0;
-static jint Java_WXBridge_callUpdateRichtextChildAttr(JNIEnv* env, jobject obj, jstring instanceId,
+static intptr_t g_WXBridge_callUpdateRichtextStyle = 0;
+static jint Java_WXBridge_callUpdateRichtextStyle(JNIEnv *env, jobject obj, jstring instanceId,
                                                   jstring ref,
-                                                  jobject attrs,
+                                                  jobject styles,
                                                   jstring parentRef,
                                                   jstring richtextRef) {
-    /* Must call RegisterNativesImpl()  */
-    //CHECK_CLAZZ(env, obj,
-    //    WXBridge_clazz(env), 0);
-    jmethodID method_id =
-            base::android::GetMethod(
-                    env, WXBridge_clazz(env),
-                    base::android::INSTANCE_METHOD,
-                    "callUpdateRichtextChildAttr",
-                    "("
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    "Ljava/util/HashMap;"
-                    "Ljava/lang/String;"
-                    "Ljava/lang/String;"
-                    ")"
-                    "I",
-                    &g_WXBridge_callUpdateRichtextChildAttr);
-
-    jint ret =
-            env->CallIntMethod(obj,
-                               method_id, instanceId, ref, attrs, parentRef, richtextRef);
-    base::android::CheckException(env);
-    return ret;
+  /* Must call RegisterNativesImpl()  */
+  //CHECK_CLAZZ(env, obj,
+  //    WXBridge_clazz(env), 0);
+  jmethodID method_id =
+      base::android::GetMethod(
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callUpdateRichtextStyle",
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callUpdateRichtextStyle);
+
+  jint ret =
+      env->CallIntMethod(obj,
+                         method_id, instanceId, ref, styles, parentRef, richtextRef);
+  base::android::CheckException(env);
+  return ret;
+}
+
+static intptr_t g_WXBridge_callUpdateRichtextChildAttr = 0;
+static jint Java_WXBridge_callUpdateRichtextChildAttr(JNIEnv *env, jobject obj, jstring instanceId,
+                                                      jstring ref,
+                                                      jobject attrs,
+                                                      jstring parentRef,
+                                                      jstring richtextRef) {
+  /* Must call RegisterNativesImpl()  */
+  //CHECK_CLAZZ(env, obj,
+  //    WXBridge_clazz(env), 0);
+  jmethodID method_id =
+      base::android::GetMethod(
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callUpdateRichtextChildAttr",
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callUpdateRichtextChildAttr);
+
+  jint ret =
+      env->CallIntMethod(obj,
+                         method_id, instanceId, ref, attrs, parentRef, richtextRef);
+  base::android::CheckException(env);
+  return ret;
 }
 
 static intptr_t g_WXBridge_callLayout = 0;
-static jint Java_WXBridge_callLayout(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jstring ref,
-    int top,
-    int bottom,
-    int left,
-    int right,
-    int height,
-    int width,
-    bool isRTL,
-    int index) {
+static jint Java_WXBridge_callLayout(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                     jstring ref,
+                                     int top,
+                                     int bottom,
+                                     int left,
+                                     int right,
+                                     int height,
+                                     int width,
+                                     bool isRTL,
+                                     int index) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callLayout",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-"I"
-"I"
-"I"
-"I"
-"I"
-"Z"
-"I"
-")"
-"I",
-      &g_WXBridge_callLayout);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callLayout",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "I"
+          "I"
+          "I"
+          "I"
+          "I"
+          "I"
+          "Z"
+          "I"
+          ")"
+          "I",
+          &g_WXBridge_callLayout);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, int(top), int(bottom), int(left),
-              int(right), int(height), int(width), isRTL, int(index));
+                         method_id, instanceId, ref, int(top), int(bottom), int(left),
+                         int(right), int(height), int(width), isRTL, int(index));
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callCreateFinish = 0;
-static jint Java_WXBridge_callCreateFinish(JNIEnv* env, jobject obj, jstring
-    instanceId) {
+static jint Java_WXBridge_callCreateFinish(JNIEnv *env, jobject obj, jstring
+instanceId) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callCreateFinish",
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callCreateFinish",
 
-"("
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callCreateFinish);
+          "("
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callCreateFinish);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId);
+                         method_id, instanceId);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callRenderSuccess = 0;
-static jint Java_WXBridge_callRenderSuccess(JNIEnv* env, jobject obj, jstring
-    instanceId) {
+static jint Java_WXBridge_callRenderSuccess(JNIEnv *env, jobject obj, jstring
+instanceId) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callRenderSuccess",
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callRenderSuccess",
 
-"("
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callRenderSuccess);
+          "("
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callRenderSuccess);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId);
+                         method_id, instanceId);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callAppendTreeCreateFinish = 0;
-static jint Java_WXBridge_callAppendTreeCreateFinish(JNIEnv* env, jobject obj,
-    jstring instanceId,
-    jstring ref) {
+static jint Java_WXBridge_callAppendTreeCreateFinish(JNIEnv *env, jobject obj,
+                                                     jstring instanceId,
+                                                     jstring ref) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callAppendTreeCreateFinish",
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callAppendTreeCreateFinish",
 
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"I",
-      &g_WXBridge_callAppendTreeCreateFinish);
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "I",
+          &g_WXBridge_callAppendTreeCreateFinish);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref);
+                         method_id, instanceId, ref);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_callHasTransitionPros = 0;
-static jint Java_WXBridge_callHasTransitionPros(JNIEnv* env, jobject obj,
-    jstring instanceId,
-    jstring ref,
-    jobject styles) {
+static jint Java_WXBridge_callHasTransitionPros(JNIEnv *env, jobject obj,
+                                                jstring instanceId,
+                                                jstring ref,
+                                                jobject styles) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), 0);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "callHasTransitionPros",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/util/HashMap;"
-")"
-"I",
-      &g_WXBridge_callHasTransitionPros);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "callHasTransitionPros",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          "Ljava/util/HashMap;"
+          ")"
+          "I",
+          &g_WXBridge_callHasTransitionPros);
 
   jint ret =
       env->CallIntMethod(obj,
-          method_id, instanceId, ref, styles);
+                         method_id, instanceId, ref, styles);
   base::android::CheckException(env);
   return ret;
 }
 
 static intptr_t g_WXBridge_getMeasurementFunc = 0;
 static base::android::ScopedLocalJavaRef<jobject>
-    Java_WXBridge_getMeasurementFunc(JNIEnv* env, jobject obj, jstring
-    instanceId,
-    jlong renderObjectPtr) {
+Java_WXBridge_getMeasurementFunc(JNIEnv *env, jobject obj, jstring
+instanceId,
+                                 jlong renderObjectPtr) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env), NULL);
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "getMeasurementFunc",
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "getMeasurementFunc",
 
-"("
-"Ljava/lang/String;"
-"J"
-")"
-"Lcom/taobao/weex/layout/ContentBoxMeasurement;",
-      &g_WXBridge_getMeasurementFunc);
+          "("
+          "Ljava/lang/String;"
+          "J"
+          ")"
+          "Lcom/taobao/weex/layout/ContentBoxMeasurement;",
+          &g_WXBridge_getMeasurementFunc);
 
   jobject ret =
       env->CallObjectMethod(obj,
-          method_id, instanceId, renderObjectPtr);
+                            method_id, instanceId, renderObjectPtr);
   base::android::CheckException(env);
   return base::android::ScopedLocalJavaRef<jobject>(env, ret);
 }
 
 static intptr_t g_WXBridge_reportNativeInitStatus = 0;
-static void Java_WXBridge_reportNativeInitStatus(JNIEnv* env, jobject obj,
-    jstring statusCode,
-    jstring errorMsg) {
+static void Java_WXBridge_reportNativeInitStatus(JNIEnv *env, jobject obj,
+                                                 jstring statusCode,
+                                                 jstring errorMsg) {
   /* Must call RegisterNativesImpl()  */
   //CHECK_CLAZZ(env, obj,
   //    WXBridge_clazz(env));
   jmethodID method_id =
       base::android::GetMethod(
-      env, WXBridge_clazz(env),
-      base::android::INSTANCE_METHOD,
-      "reportNativeInitStatus",
-
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"V",
-      &g_WXBridge_reportNativeInitStatus);
-
-     env->CallVoidMethod(obj,
-          method_id, statusCode, errorMsg);
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "reportNativeInitStatus",
+
+          "("
+          "Ljava/lang/String;"
+          "Ljava/lang/String;"
+          ")"
+          "V",
+          &g_WXBridge_reportNativeInitStatus);
+
+  env->CallVoidMethod(obj,
+                      method_id, statusCode, errorMsg);
   base::android::CheckException(env);
 
 }
 
 static intptr_t g_WXBridge_onNativePerformanceDataUpdate = 0;
-static void Java_WXBridge_onNativePerformanceDataUpdate(JNIEnv* env, jobject obj,
+static void Java_WXBridge_onNativePerformanceDataUpdate(JNIEnv *env, jobject obj,
                                                         jstring id,
                                                         jobject data) {
-    /* Must call RegisterNativesImpl()  */
-    //CHECK_CLAZZ(env, obj,
-    //    WXBridge_clazz(env));
-    jmethodID method_id =
-            base::android::GetMethod(
-                    env, WXBridge_clazz(env),
-                    base::android::INSTANCE_METHOD,
-                    "onNativePerformanceDataUpdate",
-                    "("
-                    "Ljava/lang/String;"
-                    "Ljava/util/Map;"
-                    ")"
-                    "V",
-                    &g_WXBridge_onNativePerformanceDataUpdate);
-
-    env->CallVoidMethod(obj,
-                        method_id, id, data);
-    base::android::CheckException(env);
+  /* Must call RegisterNativesImpl()  */
+  //CHECK_CLAZZ(env, obj,
+  //    WXBridge_clazz(env));
+  jmethodID method_id =
+      base::android::GetMethod(
+          env, WXBridge_clazz(env),
+          base::android::INSTANCE_METHOD,
+          "onNativePerformanceDataUpdate",
+          "("
+          "Ljava/lang/String;"
+          "Ljava/util/Map;"
+          ")"
+          "V",
+          &g_WXBridge_onNativePerformanceDataUpdate);
+
+  env->CallVoidMethod(obj,
+                      method_id, id, data);
+  base::android::CheckException(env);
 
 }
 
 // Step 3: RegisterNatives.
 
 static const JNINativeMethod kMethodsWXBridge[] = {
-    { "nativeInitFrameworkEnv",
-"("
-"Ljava/lang/String;"
-"Lcom/taobao/weex/bridge/WXParams;"
-"Ljava/lang/String;"
-"Z"
-")"
-"I", reinterpret_cast<void*>(InitFrameworkEnv) },
-    { "nativeInitFramework",
-"("
-"Ljava/lang/String;"
-"Lcom/taobao/weex/bridge/WXParams;"
-")"
-"I", reinterpret_cast<void*>(InitFramework) },
-    { "nativeRefreshInstance",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Lcom/taobao/weex/bridge/WXJSObject;"
-")"
-"V", reinterpret_cast<void*>(RefreshInstance) },
-    { "nativeExecJS",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Lcom/taobao/weex/bridge/WXJSObject;"
-")"
-"I", reinterpret_cast<void*>(ExecJS) },
-    { "nativeExecJSService",
-"("
-"Ljava/lang/String;"
-")"
-"I", reinterpret_cast<void*>(ExecJSService) },
-    { "nativeExecJSWithCallback",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Lcom/taobao/weex/bridge/WXJSObject;"
-"J"
-")"
-"V", reinterpret_cast<void*>(ExecJSWithCallback) },
-    { "nativeCreateInstanceContext",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Lcom/taobao/weex/bridge/WXJSObject;"
-")"
-"I", reinterpret_cast<void*>(CreateInstanceContext) },
-    { "nativeDestoryInstance",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"[Lcom/taobao/weex/bridge/WXJSObject;"
-")"
-"I", reinterpret_cast<void*>(DestoryInstance) },
-    { "nativeExecJSOnInstance",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-")"
-"Ljava/lang/String;", reinterpret_cast<void*>(ExecJSOnInstance) },
-    { "nativeOnInteractionTimeUpdate",
-"("
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(onInteractionTimeUpdate) },
-{ "nativeFireEventOnDataRenderNode",
-    "("
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    ")"
-    "V", reinterpret_cast<void*>(FireEventOnDataRenderNode) },
-{ "nativeInvokeCallbackOnDataRender",
-    "("
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    "Z"
-    ")"
-    "V", reinterpret_cast<void*>(InvokeCallbackOnDataRender) },
-{ "nativeRegisterModuleOnDataRenderNode",
-    "("
-    "Ljava/lang/String;"
-    ")"
-    "V", reinterpret_cast<void*>(RegisterModuleOnDataRenderNode) },
-{ "nativeRegisterComponentOnDataRenderNode",
-    "("
-    "Ljava/lang/String;"
-    ")"
-    "V", reinterpret_cast<void*>(RegisterComponentOnDataRenderNode) },
-    { "nativeTakeHeapSnapshot",
-"("
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(TakeHeapSnapshot) },
-    { "nativeBindMeasurementToRenderObject",
-"("
-"J"
-")"
-"V", reinterpret_cast<void*>(BindMeasurementToRenderObject) },
-    { "nativeSetRenderContainerWrapContent",
-"("
-"Z"
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(SetRenderContainerWrapContent) },
-    { "nativeGetFirstScreenRenderTime",
-"("
-"Ljava/lang/String;"
-")"
-"[J", reinterpret_cast<void*>(GetFirstScreenRenderTime) },
-    { "nativeGetRenderFinishTime",
-"("
-"Ljava/lang/String;"
-")"
-"[J", reinterpret_cast<void*>(GetRenderFinishTime) },
-    { "nativeSetDefaultHeightAndWidthIntoRootDom",
-"("
-"Ljava/lang/String;"
-"F"
-"F"
-"Z"
-"Z"
-")"
-"V", reinterpret_cast<void*>(SetDefaultHeightAndWidthIntoRootDom) },
-    { "nativeOnInstanceClose",
-"("
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(OnInstanceClose) },
-    { "nativeForceLayout",
-"("
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(ForceLayout) },
-    { "nativeNotifyLayout",
-"("
-"Ljava/lang/String;"
-")"
-"Z", reinterpret_cast<void*>(NotifyLayout) },
-    { "nativeSetStyleWidth",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"F"
-")"
-"V", reinterpret_cast<void*>(SetStyleWidth) },
-    { "nativeSetStyleHeight",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"F"
-")"
-"V", reinterpret_cast<void*>(SetStyleHeight) },
-    { "nativeSetMargin",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-"F"
-")"
-"V", reinterpret_cast<void*>(SetMargin) },
-    { "nativeSetPadding",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-"F"
-")"
-"V", reinterpret_cast<void*>(SetPadding) },
-    { "nativeSetPosition",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"I"
-"F"
-")"
-"V", reinterpret_cast<void*>(SetPosition) },
-    { "nativeMarkDirty",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-"Z"
-")"
-"V", reinterpret_cast<void*>(MarkDirty) },
-  { "nativeSetDeviceDisplay",
-  "("
-  "Ljava/lang/String;"
-  "F"
-  "F"
-  "F"
-  ")"
-  "V", reinterpret_cast<void*>(SetDeviceDisplay) },
-    { "nativeRegisterCoreEnv",
-"("
-"Ljava/lang/String;"
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(RegisterCoreEnv) },
-    { "nativeResetWXBridge",
-"("
-"Ljava/lang/Object;"
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(ResetWXBridge) },
-{ "nativeSetPageArgument",
-    "("
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    "Ljava/lang/String;"
-    ")"
-    "V", reinterpret_cast<void*>(SetPageArgument) },
-    { "nativeUpdateInitFrameworkParams",
-        "("
-        "Ljava/lang/String;"
-        "Ljava/lang/String;"
-        "Ljava/lang/String;"
-        ")"
-        "V", reinterpret_cast<void*>(UpdateInitFrameworkParams) },
-    { "nativeUpdateGlobalConfig",
-"("
-"Ljava/lang/String;"
-")"
-"V", reinterpret_cast<void*>(UpdateGlobalConfig) },
-    { "nativeSetInstanceRenderType",
-            "("
-            "Ljava/lang/String;"
-            "Ljava/lang/String;"
-            ")"
-            "V", reinterpret_cast<void*>(SetInstanceRenderType) },
-    { "nativeRemoveInstanceRenderType",
-            "("
-            "Ljava/lang/String;"
-            ")"
-            "V", reinterpret_cast<void*>(RemoveInstanceRenderType) },
-    { "nativeSetViewPortWidth",
-            "("
-            "Ljava/lang/String;"
-            "F"
-            ")"
-            "V", reinterpret_cast<void*>(SetViewPortWidth)},
+    {"nativeInitFrameworkEnv",
+     "("
+     "Ljava/lang/String;"
+     "Lcom/taobao/weex/bridge/WXParams;"
+     "Ljava/lang/String;"
+     "Z"
+     ")"
+     "I", reinterpret_cast<void *>(InitFrameworkEnv)},
+    {"nativeInitFramework",
+     "("
+     "Ljava/lang/String;"
+     "Lcom/taobao/weex/bridge/WXParams;"
+     ")"
+     "I", reinterpret_cast<void *>(InitFramework)},
+    {"nativeRefreshInstance",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "[Lcom/taobao/weex/bridge/WXJSObject;"
+     ")"
+     "V", reinterpret_cast<void *>(RefreshInstance)},
+    {"nativeExecJS",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "[Lcom/taobao/weex/bridge/WXJSObject;"
+     ")"
+     "I", reinterpret_cast<void *>(ExecJS)},
+    {"nativeExecJSService",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "I", reinterpret_cast<void *>(ExecJSService)},
+    {"nativeExecJSWithCallback",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "[Lcom/taobao/weex/bridge/WXJSObject;"
+     "J"
+     ")"
+     "V", reinterpret_cast<void *>(ExecJSWithCallback)},
+    {"nativeCreateInstanceContext",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "[Lcom/taobao/weex/bridge/WXJSObject;"
+     ")"
+     "I", reinterpret_cast<void *>(CreateInstanceContext)},
+    {"nativeDestoryInstance",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "[Lcom/taobao/weex/bridge/WXJSObject;"
+     ")"
+     "I", reinterpret_cast<void *>(DestoryInstance)},
+    {"nativeExecJSOnInstance",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "I"
+     ")"
+     "Ljava/lang/String;", reinterpret_cast<void *>(ExecJSOnInstance)},
+    {"nativeOnInteractionTimeUpdate",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(onInteractionTimeUpdate)},
+    {"nativeFireEventOnDataRenderNode",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(FireEventOnDataRenderNode)},
+    {"nativeInvokeCallbackOnDataRender",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Z"
+     ")"
+     "V", reinterpret_cast<void *>(InvokeCallbackOnDataRender)},
+    {"nativeRegisterModuleOnDataRenderNode",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(RegisterModuleOnDataRenderNode)},
+    {"nativeRegisterComponentOnDataRenderNode",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(RegisterComponentOnDataRenderNode)},
+    {"nativeTakeHeapSnapshot",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(TakeHeapSnapshot)},
+    {"nativeBindMeasurementToRenderObject",
+     "("
+     "J"
+     ")"
+     "V", reinterpret_cast<void *>(BindMeasurementToRenderObject)},
+    {"nativeSetRenderContainerWrapContent",
+     "("
+     "Z"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(SetRenderContainerWrapContent)},
+    {"nativeGetFirstScreenRenderTime",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "[J", reinterpret_cast<void *>(GetFirstScreenRenderTime)},
+    {"nativeGetRenderFinishTime",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "[J", reinterpret_cast<void *>(GetRenderFinishTime)},
+    {"nativeSetDefaultHeightAndWidthIntoRootDom",
+     "("
+     "Ljava/lang/String;"
+     "F"
+     "F"
+     "Z"
+     "Z"
+     ")"
+     "V", reinterpret_cast<void *>(SetDefaultHeightAndWidthIntoRootDom)},
+    {"nativeOnInstanceClose",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(OnInstanceClose)},
+    {"nativeForceLayout",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(ForceLayout)},
+    {"nativeNotifyLayout",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "Z", reinterpret_cast<void *>(NotifyLayout)},
+    {"nativeSetStyleWidth",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetStyleWidth)},
+    {"nativeSetStyleHeight",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetStyleHeight)},
+    {"nativeSetMargin",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "I"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetMargin)},
+    {"nativeSetPadding",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "I"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetPadding)},
+    {"nativeSetPosition",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "I"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetPosition)},
+    {"nativeMarkDirty",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Z"
+     ")"
+     "V", reinterpret_cast<void *>(MarkDirty)},
+    {"nativeSetDeviceDisplay",
+     "("
+     "Ljava/lang/String;"
+     "F"
+     "F"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetDeviceDisplay)},
+    {"nativeRegisterCoreEnv",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(RegisterCoreEnv)},
+    {"nativeResetWXBridge",
+     "("
+     "Ljava/lang/Object;"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(ResetWXBridge)},
+    {"nativeSetPageArgument",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(SetPageArgument)},
+    {"nativeUpdateInitFrameworkParams",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(UpdateInitFrameworkParams)},
+    {"nativeUpdateGlobalConfig",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(UpdateGlobalConfig)},
+    {"nativeSetInstanceRenderType",
+     "("
+     "Ljava/lang/String;"
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(SetInstanceRenderType)},
+    {"nativeRemoveInstanceRenderType",
+     "("
+     "Ljava/lang/String;"
+     ")"
+     "V", reinterpret_cast<void *>(RemoveInstanceRenderType)},
+    {"nativeSetViewPortWidth",
+     "("
+     "Ljava/lang/String;"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetViewPortWidth)},
+    {"nativeSetLogType",
+     "("
+     "F"
+     "F"
+     ")"
+     "V", reinterpret_cast<void *>(SetLogType)},
 };
 
-static bool RegisterNativesImpl(JNIEnv* env) {
+static bool RegisterNativesImpl(JNIEnv *env) {
 
   g_WXBridge_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
       base::android::GetClass(env, kWXBridgeClassPath).Get()));
 
   const int kMethodsWXBridgeSize =
-      sizeof(kMethodsWXBridge)/sizeof(kMethodsWXBridge[0]);
+      sizeof(kMethodsWXBridge) / sizeof(kMethodsWXBridge[0]);
 
   if (env->RegisterNatives(WXBridge_clazz(env),
                            kMethodsWXBridge,
@@ -1393,35 +1411,35 @@ static bool RegisterNativesImpl(JNIEnv* env) {
   return true;
 }
 
-static void Java_WXBridge_reset_clazz(JNIEnv* env, const char* className) {
-    LOGE("Java_WXBridge_reset_clazz class Name is %s", className);
-    g_WXBridge_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
-                    base::android::GetClass(env, className).Get()));
-                            g_WXBridge_callNative = 0;
-    g_WXBridge_reportJSException = 0;
-    g_WXBridge_callNativeModule = 0;
-    g_WXBridge_callNativeComponent = 0;
-    g_WXBridge_setTimeoutNative = 0;
-    g_WXBridge_setJSFrmVersion = 0;
-    g_WXBridge_callUpdateFinish = 0;
-    g_WXBridge_callRefreshFinish = 0;
-    g_WXBridge_reportServerCrash = 0;
-    g_WXBridge_callCreateBody = 0;
-    g_WXBridge_callAddElement = 0;
-    g_WXBridge_callRemoveElement = 0;
-    g_WXBridge_callMoveElement = 0;
-    g_WXBridge_callAddEvent = 0;
-    g_WXBridge_callRemoveEvent = 0;
-    g_WXBridge_callUpdateStyle = 0;
-    g_WXBridge_callUpdateAttrs = 0;
-    g_WXBridge_callLayout = 0;
-    g_WXBridge_callCreateFinish = 0;
-    g_WXBridge_callRenderSuccess = 0;
-    g_WXBridge_callAppendTreeCreateFinish = 0;
-    g_WXBridge_callHasTransitionPros = 0;
-    g_WXBridge_getMeasurementFunc = 0;
-    g_WXBridge_reportNativeInitStatus = 0;
-    g_WXBridge_onNativePerformanceDataUpdate = 0;
+static void Java_WXBridge_reset_clazz(JNIEnv *env, const char *className) {
+  LOGE("Java_WXBridge_reset_clazz class Name is %s", className);
+  g_WXBridge_clazz = reinterpret_cast<jclass>(env->NewGlobalRef(
+      base::android::GetClass(env, className).Get()));
+  g_WXBridge_callNative = 0;
+  g_WXBridge_reportJSException = 0;
+  g_WXBridge_callNativeModule = 0;
+  g_WXBridge_callNativeComponent = 0;
+  g_WXBridge_setTimeoutNative = 0;
+  g_WXBridge_setJSFrmVersion = 0;
+  g_WXBridge_callUpdateFinish = 0;
+  g_WXBridge_callRefreshFinish = 0;
+  g_WXBridge_reportServerCrash = 0;
+  g_WXBridge_callCreateBody = 0;
+  g_WXBridge_callAddElement = 0;
+  g_WXBridge_callRemoveElement = 0;
+  g_WXBridge_callMoveElement = 0;
+  g_WXBridge_callAddEvent = 0;
+  g_WXBridge_callRemoveEvent = 0;
+  g_WXBridge_callUpdateStyle = 0;
+  g_WXBridge_callUpdateAttrs = 0;
+  g_WXBridge_callLayout = 0;
+  g_WXBridge_callCreateFinish = 0;
+  g_WXBridge_callRenderSuccess = 0;
+  g_WXBridge_callAppendTreeCreateFinish = 0;
+  g_WXBridge_callHasTransitionPros = 0;
+  g_WXBridge_getMeasurementFunc = 0;
+  g_WXBridge_reportNativeInitStatus = 0;
+  g_WXBridge_onNativePerformanceDataUpdate = 0;
 }
 
 #endif  // com_taobao_weex_bridge_WXBridge_JNI
diff --git a/weex_core/Source/base/log_defines.cpp b/weex_core/Source/base/log_defines.cpp
index 6391736..289c768 100644
--- a/weex_core/Source/base/log_defines.cpp
+++ b/weex_core/Source/base/log_defines.cpp
@@ -23,126 +23,130 @@
 
 #ifdef __ANDROID__
 #include <android/log.h>
+#include "base/log_defines.h"
 #endif
 
 #include "core/manager/weex_core_manager.h"
 
 namespace WeexCore {
-    bool DebugMode = false;
+struct LogFlattenHelper {
+  LogFlattenHelper() : mLargeBuf() {}
+  LogFlattenHelper(const char *fmt, va_list args) : LogFlattenHelper() {
+    set(fmt, args);
+  }
+  ~LogFlattenHelper() {
+    if (mLargeBuf)
+      free(mLargeBuf);
+  }
 
-    struct LogFlattenHelper {
-        LogFlattenHelper() : mLargeBuf() {}
-        LogFlattenHelper(const char *fmt, va_list args) : LogFlattenHelper() {
-            set(fmt, args);
-        }
-        ~LogFlattenHelper() {
-            if (mLargeBuf)
-                free(mLargeBuf);
+  const char *str() const { return mLargeBuf ? mLargeBuf : mSmallBuf.data(); }
+  LogFlattenHelper &set(const char *fmt, va_list args);
+
+ private:
+  LogFlattenHelper(const LogFlattenHelper &) = delete;
+  void operator=(const LogFlattenHelper &) = delete;
+
+  std::array<char, 4096> mSmallBuf;
+  char *mLargeBuf;
+};
+
+LogFlattenHelper &LogFlattenHelper::set(const char *fmt, va_list args) {
+  va_list argsCopy;
+  va_copy(argsCopy, args);
+  int len = 1 + vsnprintf(nullptr, 0, fmt, argsCopy);
+  va_end(argsCopy);
+  if (len <= 1) {
+    mSmallBuf[0] = 0;
+    return *this;
+  }
+  if (len > (int) mSmallBuf.size())
+    mLargeBuf = static_cast<char *>(malloc(len));
+  int rv;
+  if (mLargeBuf) {
+    rv = vsnprintf(mLargeBuf, len, fmt, args);
+  } else {
+    rv = vsnprintf(mSmallBuf.data(), mSmallBuf.size(), fmt, args);
+  }
+  (void) rv;
+  return *this;
+}
+
+void PrintLog(LogLevel level,
+              const char *tag,
+              const char *file,
+              unsigned long line,
+              const char *fmt,
+              ...) {
+  va_list args;
+  va_start(args, fmt);
+  LogFlattenHelper log(fmt, args);
+  va_end(args);
+
+  bool succeed = weex::base::LogImplement::getLog()->log(level, tag, file, line, log.str());
+  if (!succeed) {
+    // Log to console by default
+#ifdef __ANDROID__
+    bool debugMode = weex::base::LogImplement::getLog()->debugMode();
+    switch (level) {
+      case LogLevel::Error:
+        __android_log_print(ANDROID_LOG_ERROR,
+                            tag,
+                            "%s:%lu, %s",
+                            file,
+                            line,
+                            log.str());
+        break;
+      case LogLevel::Warn:
+        if (debugMode) {
+          __android_log_print(ANDROID_LOG_WARN,
+                              tag,
+                              "%s:%lu, %s",
+                              file,
+                              line,
+                              log.str());
         }
-        
-        const char *str() const { return mLargeBuf ? mLargeBuf : mSmallBuf.data(); }
-        LogFlattenHelper &set(const char *fmt, va_list args);
-        
-    private:
-        LogFlattenHelper(const LogFlattenHelper &) = delete;
-        void operator=(const LogFlattenHelper &) = delete;
-        
-        std::array<char, 4096> mSmallBuf;
-        char *mLargeBuf;
-    };
-    
-    LogFlattenHelper &LogFlattenHelper::set(const char *fmt, va_list args) {
-        va_list argsCopy;
-        va_copy(argsCopy, args);
-        int len = 1 + vsnprintf(nullptr, 0, fmt, argsCopy);
-        va_end(argsCopy);
-        if (len <= 1) {
-            mSmallBuf[0] = 0;
-            return *this;
+        break;
+      case LogLevel::Info:
+        if (debugMode) {
+          __android_log_print(ANDROID_LOG_INFO,
+                              tag,
+                              "%s:%lu, %s",
+                              file,
+                              line,
+                              log.str());
         }
-        if (len > (int)mSmallBuf.size())
-            mLargeBuf = static_cast<char *>(malloc(len));
-        int rv;
-        if (mLargeBuf) {
-            rv = vsnprintf(mLargeBuf, len, fmt, args);
-        } else {
-            rv = vsnprintf(mSmallBuf.data(), mSmallBuf.size(), fmt, args);
+        break;
+      case LogLevel::Debug:
+        if (debugMode) {
+          __android_log_print(ANDROID_LOG_DEBUG,
+                              tag,
+                              "%s:%lu, %s",
+                              file,
+                              line,
+                              log.str());
         }
-        (void)rv;
-        return *this;
+        break;
+      default:break;
     }
-    
-    void PrintLog(LogLevel level, const char* tag, const char* file, unsigned long line, const char* fmt, ...) {
-        va_list args;
-        va_start(args, fmt);
-        LogFlattenHelper log(fmt, args);
-        va_end(args);
-        
-        LogBridge* logBridge = WeexCore::WeexCoreManager::Instance()->get_log_bridge();
-        if (logBridge) {
-            // Log to bridge
-            logBridge->log(level, tag, file, line, log.str());
-        }
-        else {
-            // Log to console by default
-#ifdef __ANDROID__
-            if(DebugMode) {
-                switch (level) {
-                    case LogLevel::Error:
-                        __android_log_print(ANDROID_LOG_ERROR,
-                                            tag,
-                                            "%s:%lu, %s",
-                                            file,
-                                            line,
-                                            log.str());
-                    break;
-                    case LogLevel::Warn:
-                        __android_log_print(ANDROID_LOG_WARN,
-                                            tag,
-                                            "%s:%lu, %s",
-                                            file,
-                                            line,
-                                            log.str());
-                    break;
-                    case LogLevel::Info:
-                        __android_log_print(ANDROID_LOG_INFO,
-                                            tag,
-                                            "%s:%lu, %s",
-                                            file,
-                                            line,
-                                            log.str());
-                    break;
-                    case LogLevel::Debug:
-                        __android_log_print(ANDROID_LOG_DEBUG,
-                                            tag,
-                                            "%s:%lu, %s",
-                                            file,
-                                            line,
-                                            log.str());
-                    break;
-                    default:
-                        break;
-                }
-            }
 #elif __APPLE__
-            switch (level) {
-                case LogLevel::Error:
-                    printf("<%s:Error|%s:%lu> %s\n", tag, file, line, log.str());
-                    break;
-                case LogLevel::Warn:
-                    printf("<%s:Warn|%s:%lu> %s\n", tag, file, line, log.str());
-                    break;
-                case LogLevel::Info:
-                    printf("<%s:Info|%s:%lu> %s\n", tag, file, line, log.str());
-                    break;
-                case LogLevel::Debug:
-                    printf("<%s:Debug|%s:%lu> %s\n", tag, file, line, log.str());
-                    break;
-                default:
-                    break;
-            }
-#endif
-        }
+    switch (level) {
+        case LogLevel::Error:
+            printf("<%s:Error|%s:%lu> %s\n", tag, file, line, log.str());
+            break;
+        case LogLevel::Warn:
+            printf("<%s:Warn|%s:%lu> %s\n", tag, file, line, log.str());
+            break;
+        case LogLevel::Info:
+            printf("<%s:Info|%s:%lu> %s\n", tag, file, line, log.str());
+            break;
+        case LogLevel::Debug:
+            printf("<%s:Debug|%s:%lu> %s\n", tag, file, line, log.str());
+            break;
+        default:
+            break;
     }
-    
+#endif
+  }
+}
+
 }
diff --git a/weex_core/Source/base/log_defines.h b/weex_core/Source/base/log_defines.h
index 0776494..0bf840c 100644
--- a/weex_core/Source/base/log_defines.h
+++ b/weex_core/Source/base/log_defines.h
@@ -20,19 +20,156 @@
 #ifndef LogDefines_h
 #define LogDefines_h
 #include <cstring>
+#include <string>
+#ifdef __ANDROID__
+#include <android/log.h>
+#endif
+#include <mutex>
 
 namespace WeexCore {
-    
-    enum class LogLevel : int {
-        Debug,
-        Info,
-        Warn,
-        Error
-    };
-    
-    void PrintLog(LogLevel level, const char* tag, const char* file, unsigned long line, const char* format, ...);
-
-    extern bool DebugMode;
+
+enum class LogLevel : int {
+  All = 0,
+  Verbose,
+  Debug,
+  Info,
+  Warn,
+  Error,
+  Tlog,
+  Wtf,
+  Off,
+  Performance,
+};
+
+void PrintLog(LogLevel level,
+              const char *tag,
+              const char *file,
+              unsigned long line,
+              const char *format,
+              ...);
+}
+
+namespace weex {
+namespace base {
+class LogBase {
+ public:
+  virtual bool log(WeexCore::LogLevel level,
+                   const char *tag,
+                   const char *file,
+                   unsigned long line,
+                   const char *log) = 0;
+
+  LogBase() : printLevel(WeexCore::LogLevel::Error), m_debugMode(false), m_perfMode(false) {};
+
+  inline void setDebugMode(bool isDebug) {
+    if (isDebug) {
+      printLevel = WeexCore::LogLevel::Debug;
+    } else {
+      printLevel = WeexCore::LogLevel::Error;
+    }
+    m_debugMode = isDebug;
+  }
+
+  inline bool is_debug_mode() { return m_debugMode; }
+
+  inline void setPerfMode(bool isPerf) {
+    m_perfMode = isPerf;
+  }
+
+  inline bool is_perf_mode() { return m_perfMode; }
+
+  inline void setPrintLevel(WeexCore::LogLevel l) {
+    printLevel = l;
+  }
+
+  inline WeexCore::LogLevel print_level() { return printLevel; }
+
+  inline bool shouldPrint(WeexCore::LogLevel l) {
+    if (m_perfMode && l == WeexCore::LogLevel::Performance) {
+      return true;
+    }
+
+    return l != WeexCore::LogLevel::Performance && l >= printLevel;
+  }
+
+ private:
+  WeexCore::LogLevel printLevel = WeexCore::LogLevel::Error;
+  bool m_perfMode = false;
+  bool m_debugMode = false;
+};
+
+class LogImplement {
+ public:
+  static LogImplement *getLog() {
+    static weex::base::LogImplement *mySelf;
+    static std::once_flag once_flag;
+    std::call_once(once_flag, []() { mySelf = new LogImplement(); });
+    return mySelf;
+  }
+
+  void setLogImplement(weex::base::LogBase *logVirtual) {
+    m_log = logVirtual;
+  }
+
+  inline void setPrintLevel(WeexCore::LogLevel level) {
+    if (m_log) {
+      m_log->setPrintLevel(level);
+    }
+  }
+
+  inline void setDebugMode(bool debugFlag) {
+    if (m_log) {
+      m_log->setDebugMode(debugFlag);
+    }
+  }
+
+  inline bool debugMode() {
+    if (m_log)
+      return m_log->is_debug_mode();
+
+    return false;
+  }
+
+  inline bool perfMode() {
+    if (m_log)
+      return m_log->is_perf_mode();
+
+    return false;
+  }
+
+  inline void setPerfMode(bool perfFlag) {
+    if (m_log)
+      m_log->setPerfMode(perfFlag);
+  }
+
+  inline bool can_print_log(WeexCore::LogLevel l) {
+    if (m_log)
+      return m_log->shouldPrint(l);
+
+    return false;
+  }
+
+  bool log(WeexCore::LogLevel level,
+           const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log) {
+    if (m_log == nullptr) {
+      return false;
+    }
+
+    if (!m_log->shouldPrint(level)) {
+      return true;
+    }
+
+    return m_log->log(level, tag, file, line, log);
+  }
+
+ private:
+  weex::base::LogBase *m_log;
+  LogImplement() : m_log(nullptr) {}
+};
+}
 }
 
 #if defined(LOGE)
@@ -57,26 +194,39 @@ namespace WeexCore {
 
 #define WEEX_CORE_LOG_TAG "WeexCore"
 #define WEEX_CORE_FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
-#define WEEX_CORE_LOG(level, TAG, format, ...)   WeexCore::PrintLog((level), TAG, WEEX_CORE_FILENAME, __LINE__, (format), ##__VA_ARGS__)
+#define WEEX_CORE_LOG(level, TAG, format, ...) \
+        do{ \
+        if(weex::base::LogImplement::getLog()->can_print_log((level))) \
+          WeexCore::PrintLog((level), TAG, WEEX_CORE_FILENAME, __LINE__, (format), ##__VA_ARGS__);\
+        }while(0);\
 
 #define LOGE_TAG(TAG, format, ...)       WEEX_CORE_LOG(WeexCore::LogLevel::Error, TAG, format, ##__VA_ARGS__)
 #define LOGE(format, ...)                LOGE_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
 
 #define LOGW_TAG(TAG, format, ...)       WEEX_CORE_LOG(WeexCore::LogLevel::Warn, TAG, format, ##__VA_ARGS__)
+
 #define LOGW(format, ...)                LOGW_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
 
 #define LOGI_TAG(TAG, format, ...)       WEEX_CORE_LOG(WeexCore::LogLevel::Info, TAG, format, ##__VA_ARGS__)
+
 #define LOGI(format, ...)                LOGI_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
 
+#define LOG_Performance(INSTANCE_ID, format, ...)       WEEX_CORE_LOG(WeexCore::LogLevel::Performance, INSTANCE_ID, format, ##__VA_ARGS__)
+
+#define LOG_TLOG(TAG, format, ...)  WEEX_CORE_LOG(WeexCore::LogLevel::Tlog, TAG, format, ##__VA_ARGS__)
+#ifdef __ANDROID__
+#define LOGE_FOR_DEBUG(TAG, format, ...)  __android_log_print(ANDROID_LOG_ERROR,TAG,format,##__VA_ARGS__)
+#endif
+
+
 #ifdef DEBUG
+#define LOGD_TAG(TAG, format, ...) WEEX_CORE_LOG(WeexCore::LogLevel::Debug, TAG, format, ##__VA_ARGS__)
 
-#define LOGD_TAG(TAG, format, ...)       WEEX_CORE_LOG(WeexCore::LogLevel::Debug, TAG, format, ##__VA_ARGS__)
-#define LOGD(format, ...)                LOGD_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
+#define LOGD(format, ...) LOGD_TAG(WEEX_CORE_LOG_TAG, format, ##__VA_ARGS__)
 
 #else
-
 #define LOGD_TAG(TAG, format, ...)       ((void) 0)
-#define LOGD(format, ...)                ((void) 0)
+#define LOGD(format, ...)                if(weex::base::LogImplement::getLog()->debugMode()) WEEX_CORE_LOG(WeexCore::LogLevel::Debug, TAG, format, ##__VA_ARGS__)
 
 #endif
 
diff --git a/weex_core/Source/base/time_calculator.cpp b/weex_core/Source/base/time_calculator.cpp
new file mode 100644
index 0000000..c76f091
--- /dev/null
+++ b/weex_core/Source/base/time_calculator.cpp
@@ -0,0 +1,117 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+#include "time_calculator.h"
+#include "log_defines.h"
+namespace weex {
+namespace base {
+void weex::base::TimeCalculator::taskEnd() {
+  if (!turnOn()) {
+    return;
+  }
+
+  LOG_Performance(m_instance_id_.c_str(),
+      "%s taskName is %s : instanceId %s : m_task_id_ %d: taskEnd",
+      m_task_platform_.c_str(),
+      m_task_name_.c_str(),
+      m_instance_id_.c_str(),
+      m_task_id_);
+  this->m_task_end_time_ = getCurrentTime();
+  m_task_end_flag_ = true;
+}
+void weex::base::TimeCalculator::taskStart() {
+
+  if (!turnOn()) {
+    return;
+  }
+
+
+  LOG_Performance(m_instance_id_.c_str(),
+      "timeline %s taskName is %s : instanceId %s : m_task_id_ %d: taskStart",
+      m_task_platform_.c_str(),
+      m_task_name_.c_str(),
+      m_instance_id_.c_str(),
+      m_task_id_);
+  this->m_task_start_time_ = getCurrentTime();
+}
+void weex::base::TimeCalculator::print() {
+  if (!turnOn()) {
+    return;
+  }
+
+  const long long &taskWait = m_task_start_time_ - m_constructor_time_;
+  const long long &taskCost = m_task_end_time_ - m_task_start_time_;
+
+  bool showLog = false;
+
+  if (!args.empty() || taskWait > 100) {
+    showLog = true;
+  } else if (taskCost < 5) {
+    LOG_Performance(m_instance_id_.c_str(),"timeline %s taskName is %s cost less than 5ms", m_task_platform_.c_str(),
+         m_task_name_.c_str());
+  } else {
+    showLog = true;
+    std::string msg = "normal";
+    if (taskCost > 100) {
+      msg = "task cost than 100, ";
+    }
+
+    if (taskWait > 100) {
+      std::string a = "wait to long time than 100ms";
+      msg += a;
+    }
+  }
+
+  if (showLog) {
+    LOG_Performance(m_instance_id_.c_str(),"timeline taskName: %s, result: %s", m_task_name_.c_str(), formatData().c_str());
+  }
+}
+void weex::base::TimeCalculator::transform() {
+  if (!turnOn()) {
+    return;
+  }
+  LOG_Performance(m_instance_id_.c_str(), "%s", formatData().c_str());
+}
+std::string weex::base::TimeCalculator::formatData() {
+  if (!turnOn()) {
+    return "";
+  }
+  char buffer[1024];
+  std::string format =
+      "{\"time\":{\"execTime\":%lld,\"waitTime\":%lld,\"constructor\":%lld,\"destructor\":%lld,\"taskStart\":%lld,\"taskEnd\":%lld},"
+      "\"Info\":{\"platform\":\"%s\",\"taskId\":%d,\"taskInfo\":{\"relateTaskId\":%d, \"args\":\"%s\",},\"taskName\":\"%s\"}}";
+
+  snprintf(buffer, 1024, format.c_str(),
+           m_task_end_time_ - m_task_start_time_,
+           m_task_start_time_ - m_constructor_time_,
+           m_constructor_time_,
+           m_destructor_time_,
+           m_task_start_time_,
+           m_task_end_time_,
+           m_task_platform_.c_str(),
+           m_task_id_,
+           m_relative_task_id_,
+           args.c_str(),
+           m_task_name_.c_str());
+
+  return std::string(buffer);
+}
+}  // namespace base
+}  // namespace weex
+
+
diff --git a/weex_core/Source/base/time_calculator.h b/weex_core/Source/base/time_calculator.h
index 9831921..f79dc20 100644
--- a/weex_core/Source/base/time_calculator.h
+++ b/weex_core/Source/base/time_calculator.h
@@ -24,9 +24,11 @@
 #define WEEX_PROJECT_TIME_CALCULATOR_H
 
 #include <string>
+#include <mutex>
 #include "time_point.h"
 #include "time_unit.h"
-#include "android/log_utils.h"
+#include "time_utils.h"
+#include "base/log_defines.h"
 
 namespace weex {
 namespace base {
@@ -35,20 +37,27 @@ enum TaskPlatform {
   JSS_ENGINE
 };
 
+enum Level {
+  HIGH,
+  MEDIUM,
+  LOW,
+};
+
 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()) {
+  TimeCalculator(TaskPlatform taskPlatform, std::string name, std::string id, Level level = LOW) :
+      m_task_name_(name),
+      m_instance_id_(id),
+      m_destructor_time_(getCurrentTime()),
+      m_constructor_time_(getCurrentTime()),
+      m_task_end_time_(getCurrentTime()),
+      m_task_start_time_(getCurrentTime()),
+      m_task_id_(genTaskId()),
+      m_relative_task_id_(0) {
     if (taskPlatform == TaskPlatform::JSS_ENGINE) {
-      task_platform = "jsengine";
+      m_task_platform_ = "JSEngine";
     } else {
-      task_platform = "weexcore";
+      m_task_platform_ = "WeexCore";
     }
   }
 
@@ -58,84 +67,51 @@ class TimeCalculator {
   }
 
   ~TimeCalculator() {
-    if (!task_end_flag) {
-      task_end = TimePoint::Now();
+    if (!m_task_end_flag_) {
+      m_task_end_time_ = getCurrentTime();
     }
-    end = TimePoint::Now();
+    m_destructor_time_ = getCurrentTime();
     print();
+//    transform();
   }
 
-  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 taskStart();
 
-  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 taskEnd();
 
   void set_task_name(std::string name) {
-    this->task_name = name;
+    this->m_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());
-//    }
+  void setArgs(std::string args) {
+    this->args = args;
+  }
+
+  std::string formatData();
+  void transform();
+  void print();
+
+  //println
+  bool turnOn() {
+    return weex::base::LogImplement::getLog()->perfMode();
   }
 
  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;
+  std::string m_task_name_;
+  std::string m_log_tag_;
+  std::string m_log_level_;
+  int m_task_id_;
+  int m_relative_task_id_;
+  std::string m_instance_id_;
+  long long m_constructor_time_;
+  long long m_destructor_time_;
+  long long m_task_start_time_;
+  long long m_task_end_time_;
+  bool m_task_end_flag_ = false;
+  std::string m_task_platform_;
+  std::string m_final_info_string_;
+  std::string args;
+
 };
 }  // namespace base
 }  // namespace weex
diff --git a/weex_core/Source/base/utils/log_utils.cpp b/weex_core/Source/base/utils/log_utils.cpp
index 019c20c..a05c705 100644
--- a/weex_core/Source/base/utils/log_utils.cpp
+++ b/weex_core/Source/base/utils/log_utils.cpp
@@ -19,38 +19,32 @@
 
 #include "base/utils/log_utils.h"
 
-namespace Weex{
-  void LogUtil::ConsoleLogPrint(int level, const char* tag, const char* log) {
-        // Log = 1, 
-        // Warning = 2,
-        // Error = 3,
-        // Debug = 4,
-        // Info = 5,
-        
-        // if (!mDebugMode) {
-        //   LOGE("LogUtil mDebugMode is false");
-        //   return;
-        // }
-        switch(level) {
-          case 1:
-            LOGV_TAG("jsengine", "%s", log);
-            break;
-          case 2:
-            LOGW_TAG("jsengine", "%s", log);
-            break;
-          case 3:
-            LOGE_TAG("jsengine", "%s", log);
-            break;
-          case 4:
-            LOGD_TAG("jsengine", "%s", log);
-            break;
-          case 5:
-            LOGI_TAG("jsengine", "%s", log);
-            break;
-          default:
-            LOGV_TAG("jsengine", "%s", log);
-            break;
-        }
-      }
+namespace Weex {
+void LogUtil::ConsoleLogPrint(int level, const char *tag, const char *log) {
+  // Log = 1,
+  // Warning = 2,
+  // Error = 3,
+  // Debug = 4,
+  // Info = 5,
+
+  // if (!mDebugMode) {
+  //   LOGE("LogUtil mDebugMode is false");
+  //   return;
+  // }
+  switch (level) {
+    case 1:LOGD_TAG(tag, "%s", log);
+      break;
+    case 2:LOGW_TAG(tag, "%s", log);
+      break;
+    case 3:LOGE_TAG(tag, "%s", log);
+      break;
+    case 4:LOGD_TAG(tag, "%s", log);
+      break;
+    case 5:LOGI_TAG(tag, "%s", log);
+      break;
+    default:LOGE_TAG(tag, "%s", log);
+      break;
+  }
+}
 
 }
diff --git a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp
index 0514c1e..0ba8a1e 100644
--- a/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp
+++ b/weex_core/Source/core/bridge/platform/core_side_in_platform.cpp
@@ -624,5 +624,12 @@ int CoreSideInPlatform::UpdateInitFrameworkParams(const std::string &key, const
           ->UpdateInitFrameworkParams(key, value, desc);
 }
 
+void CoreSideInPlatform::SetLogType(const int logType, const bool isPerf) {
+  WeexCoreManager::Instance()
+      ->script_bridge()
+      ->script_side()
+      ->SetLogType(logType,isPerf);
+}
+
 
 }  // namespace WeexCore
diff --git a/weex_core/Source/core/bridge/platform/core_side_in_platform.h b/weex_core/Source/core/bridge/platform/core_side_in_platform.h
index a6e5d93..9cd3f6c 100644
--- a/weex_core/Source/core/bridge/platform/core_side_in_platform.h
+++ b/weex_core/Source/core/bridge/platform/core_side_in_platform.h
@@ -112,7 +112,7 @@ class CoreSideInPlatform : public PlatformBridge::CoreSide {
   int UpdateGlobalConfig(const char *config) override;
 
   int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc) override;
-
+  void SetLogType(const int logType, const bool isPerf) override;
 
 private:
   DISALLOW_COPY_AND_ASSIGN(CoreSideInPlatform);
diff --git a/weex_core/Source/core/bridge/platform_bridge.h b/weex_core/Source/core/bridge/platform_bridge.h
index ba6ab7c..b290009 100644
--- a/weex_core/Source/core/bridge/platform_bridge.h
+++ b/weex_core/Source/core/bridge/platform_bridge.h
@@ -139,6 +139,8 @@ class PlatformBridge {
 
     virtual int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc) = 0;
 
+    virtual void SetLogType(const int logType, const bool isPerf) = 0;
+
     inline PlatformBridge* bridge() { return bridge_; }
 
    protected:
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 8f85f18..d833da9 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
@@ -23,6 +23,7 @@
 #include "base/log_defines.h"
 #include "base/make_copyable.h"
 #include "base/thread/waitable_event.h"
+#include "base/time_calculator.h"
 #include "core/manager/weex_core_manager.h"
 #include "core/render/manager/render_manager.h"
 #include "core/bridge/eagle_bridge.h"
@@ -30,7 +31,6 @@
 #include "core/config/core_environment.h"
 #ifdef OS_ANDROID
 #include "core/parser/action_args_check.h"
-#include <base/time_calculator.h>
 #include "android/weex_extend_js_api.h"
 #endif
 
@@ -111,11 +111,11 @@ void CoreSideInScript::AddElement(const char *page_id, const char *parent_ref,
                                   const char *index_str) {
 
   
-//  std::string msg = "AddElement :";
+  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);
+  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);
@@ -462,4 +462,11 @@ void CoreSideInScript::UpdateComponentData(const char* page_id,
     }
 }
 
+bool CoreSideInScript::Log(int level, const char *tag,
+         const char *file,
+         unsigned long line,
+         const char *log) {
+  return weex::base::LogImplement::getLog()->log((LogLevel) level, tag, file, line, log);
+}
+
 }  // namespace WeexCore
diff --git a/weex_core/Source/core/bridge/script/core_side_in_script.h b/weex_core/Source/core/bridge/script/core_side_in_script.h
index 2c53c1c..78638f1 100644
--- a/weex_core/Source/core/bridge/script/core_side_in_script.h
+++ b/weex_core/Source/core/bridge/script/core_side_in_script.h
@@ -84,6 +84,11 @@ class CoreSideInScript : public ScriptBridge::CoreSide {
                            const char* cid,
                            const char* json_data) override;
 
+  bool Log(int level, const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log) override ;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(CoreSideInScript);
 };
diff --git a/weex_core/Source/core/bridge/script_bridge.h b/weex_core/Source/core/bridge/script_bridge.h
index d6a0a4d..c1eea10 100644
--- a/weex_core/Source/core/bridge/script_bridge.h
+++ b/weex_core/Source/core/bridge/script_bridge.h
@@ -89,6 +89,12 @@ class ScriptBridge {
                                      const char* cid,
                                      const char* json_data) = 0;
 
+
+    virtual bool Log(int level, const char *tag,
+                     const char *file,
+                     unsigned long line,
+                     const char *log) = 0;
+
     inline ScriptBridge *bridge() { return bridge_; }
 
    private:
@@ -152,8 +158,12 @@ class ScriptBridge {
 
     virtual int UpdateInitFrameworkParams(const std::string& key, const std::string& value, const std::string& desc) = 0;
 
+    virtual void SetLogType(const int logLevel, const bool isPerf) = 0;
+
     inline ScriptBridge *bridge() { return bridge_; }
 
+
+
    private:
     ScriptBridge *bridge_;
     friend class ScriptBridge;
diff --git a/weex_core/Source/core/config/core_environment.cpp b/weex_core/Source/core/config/core_environment.cpp
index 4e4012a..5645d72 100644
--- a/weex_core/Source/core/config/core_environment.cpp
+++ b/weex_core/Source/core/config/core_environment.cpp
@@ -22,6 +22,7 @@
 
 #include "base/core_constants.h"
 #include "base/log_defines.h"
+#include "base/log_defines.h"
 #include "core/common/view_utils.h"
 
 namespace WeexCore {
@@ -86,8 +87,6 @@ namespace WeexCore {
     mOptions.insert(std::pair<std::string, std::string>(key, value));
     if (key == "switchInteractionLog") {
       mInteractionLogSwitch = "true" == value;
-    } else if(key == "debugMode" && value == "true"){
-      WeexCore::DebugMode = true;
     }
   }
 
diff --git a/weex_core/Source/core/manager/weex_core_manager.h b/weex_core/Source/core/manager/weex_core_manager.h
index b520fd0..1996e46 100644
--- a/weex_core/Source/core/manager/weex_core_manager.h
+++ b/weex_core/Source/core/manager/weex_core_manager.h
@@ -25,7 +25,6 @@
 #include "base/thread/thread.h"
 #include "core/bridge/platform_bridge.h"
 #include "core/bridge/script_bridge.h"
-#include "core/bridge/log_bridge.h"
 #include "base/message_loop/message_loop.h"
 
 namespace WeexCore {
@@ -43,12 +42,6 @@ class WeexCoreManager {
   inline void set_platform_bridge(PlatformBridge *bridge) {
     platform_bridge_ = bridge;
   }
-    
-  inline LogBridge *get_log_bridge() { return log_bridge_; }
-
-  inline void set_log_bridge(LogBridge *bridge) {
-    log_bridge_ = bridge;
-  }
 
   inline ScriptBridge *script_bridge() { return script_bridge_; }
 
@@ -80,14 +73,12 @@ class WeexCoreManager {
  private:
   PlatformBridge *platform_bridge_;
   MeasureFunctionAdapter *measure_function_adapter_;
-  LogBridge *log_bridge_;
   ScriptBridge *script_bridge_;
   ProjectMode project_mode_;
   weex::base::Thread *script_thread_;
 
   WeexCoreManager()
       : platform_bridge_(nullptr),
-        log_bridge_(nullptr),
         measure_function_adapter_(nullptr),
         script_bridge_(nullptr),
         project_mode_(COMMON),
diff --git a/weex_core/Source/core/network/android/default_request_handler.cc b/weex_core/Source/core/network/android/default_request_handler.cc
index ab218bd..b12d7bf 100644
--- a/weex_core/Source/core/network/android/default_request_handler.cc
+++ b/weex_core/Source/core/network/android/default_request_handler.cc
@@ -55,7 +55,7 @@ bool DefaultRequestHandler::RegisterJNIUtils(JNIEnv* env) {
 }
 
 DefaultRequestHandler::DefaultRequestHandler() {
-  JNIEnv* env = base::android::AttachCurrentThread();
+  JNIEnv* env = ::base::android::AttachCurrentThread();
   Reset(env, Java_RequestHandler_create(env).Release());
 }
 
@@ -63,23 +63,23 @@ DefaultRequestHandler::~DefaultRequestHandler() {}
 
 void DefaultRequestHandler::Send(const char* instance_id, const char* url,
                                  Callback callback) {
-  JNIEnv* env = base::android::AttachCurrentThread();
+  JNIEnv* env = ::base::android::AttachCurrentThread();
   if (!env) return;
   CallbackWrapper* callback_wrapper = new CallbackWrapper(callback);
-  base::android::ScopedLocalJavaRef<jstring> jni_url(env,
+  ::base::android::ScopedLocalJavaRef<jstring> jni_url(env,
                                                      env->NewStringUTF(url));
-  base::android::ScopedLocalJavaRef<jstring> jni_id(
+  ::base::android::ScopedLocalJavaRef<jstring> jni_id(
       env, env->NewStringUTF(instance_id));
   Java_RequestHandler_send(env, jni_object(), jni_id.Get(), jni_url.Get(),
                            reinterpret_cast<jlong>(callback_wrapper));
 }
 
 void DefaultRequestHandler::GetBundleType(const char *instance_id, const char *content, Callback callback){
-  JNIEnv* env = base::android::AttachCurrentThread();
+  JNIEnv* env = ::base::android::AttachCurrentThread();
   if (!env) return;
   CallbackWrapper* callback_wrapper = new CallbackWrapper(callback);
-  base::android::ScopedLocalJavaRef<jstring> jni_id(env, env->NewStringUTF(instance_id));
-  base::android::ScopedLocalJavaRef<jstring> jni_content(env,env->NewStringUTF(content));
+  ::base::android::ScopedLocalJavaRef<jstring> jni_id(env, env->NewStringUTF(instance_id));
+  ::base::android::ScopedLocalJavaRef<jstring> jni_content(env,env->NewStringUTF(content));
   Java_RequestHandler_getBundleType(env, jni_object(), jni_id.Get(), jni_content.Get(),
                            reinterpret_cast<jlong>(callback_wrapper));
 }
diff --git a/weex_core/Source/include/WeexApiHeader.h b/weex_core/Source/include/WeexApiHeader.h
index 0f5572e..759afa6 100644
--- a/weex_core/Source/include/WeexApiHeader.h
+++ b/weex_core/Source/include/WeexApiHeader.h
@@ -119,6 +119,12 @@ typedef void
 (*FuncUpdateComponentData)(const char* page_id, const char* cid, const char* json_data);
 
 
+typedef bool
+(*FuncLog)(int level, const char *tag,
+           const char *file,
+           unsigned long line,
+           const char *log);
+
 typedef struct FunctionsExposedByCore {
     FuncSetJSVersion funcSetJSVersion;
     FuncReportException funcReportException;
@@ -147,6 +153,7 @@ typedef struct FunctionsExposedByCore {
     FuncCallDispatchMessageSync funcCallDispatchMessageSync;
     FuncOnReceivedResult  funcOnReceivedResult;
     FuncUpdateComponentData funcUpdateComponentData;
+    FuncLog funcLog;
 } FunctionsExposedByCore;
 
 typedef void (*FuncCallSetJSVersion)(const char* version);
@@ -259,6 +266,8 @@ typedef int (*FuncUpdateGlobalConfig)(const char *config);
 
 typedef int (*FuncUpdateInitFrameworkParams)(const std::string& key, const std::string& value, const std::string& desc);
 
+typedef void (*FuncSetLogType)(const int logLevel, const bool isPerf);
+
 typedef struct FunctionsExposedByJS {
     FuncInitFramework funcInitFramework;
     FuncInitAppFramework funcInitAppFramework;
@@ -276,6 +285,7 @@ typedef struct FunctionsExposedByJS {
     FuncDestroyInstance funcDestroyInstance;
     FuncUpdateGlobalConfig funcUpdateGlobalConfig;
     FuncUpdateInitFrameworkParams funcUpdateInitFrameworkParams;
+    FuncSetLogType funcSetLogType;
 } FunctionsExposedByJS;
 
 
diff --git a/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_queue.cpp b/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_queue.cpp
index 6295d62..2b71b9f 100644
--- a/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_queue.cpp
+++ b/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_queue.cpp
@@ -305,6 +305,11 @@ int ScriptSideInQueue::UpdateInitFrameworkParams(const std::string& key, const s
   return 1;
 }
 
+void ScriptSideInQueue::SetLogType(const int logLevel, const bool isPerf) {
+  // do nothing;
+};
+
+
 void ScriptSideInQueue::useBackUpWeexRuntime(std::string id) {
   usingBackThreadId.push_back(id);
 }
diff --git a/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_simple.cpp b/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_simple.cpp
index 94bb888..fee2931 100644
--- a/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_simple.cpp
+++ b/weex_core/Source/js_runtime/weex/bridge/script/script_side_in_simple.cpp
@@ -143,6 +143,9 @@ int ScriptSideInSimple::UpdateInitFrameworkParams(const std::string& key, const
   return runtime_->UpdateInitFrameworkParams(key ,value, desc);
 }
 
+void ScriptSideInSimple::SetLogType(const int logLevel, const bool isPerf) {
+  //do nothing
+}
 
 
 }  // namespace js
diff --git a/weex_core/Source/js_runtime/weex/object/weex_global_object_v2.cpp b/weex_core/Source/js_runtime/weex/object/weex_global_object_v2.cpp
index e177ac8..b3a1d7b 100644
--- a/weex_core/Source/js_runtime/weex/object/weex_global_object_v2.cpp
+++ b/weex_core/Source/js_runtime/weex/object/weex_global_object_v2.cpp
@@ -20,6 +20,7 @@
 // Created by chenpeihan on 2019/2/22.
 //
 
+#include "base/log_defines.h"
 #include "core/bridge/script_bridge.h"
 #include "js_runtime/weex/utils/weex_jsc_utils.h"
 #include "core/bridge/script_bridge.h"
@@ -131,7 +132,7 @@ WeexGlobalObjectV2::initWxEnvironment(std::vector<INIT_FRAMEWORK_PARAMS *> &para
         // add for debug mode
         if (std::string("debugMode") == type && std::string("true") == value) {
            // Weex::LogUtil::setDebugMode(true);
-            WeexCore::DebugMode = true;
+            weex::base::LogImplement::getLog()->setDebugMode(true);
             LOGE("jss use %s","runtime");
         }
         // --------------------------------------------------------
diff --git a/weex_core/Source/third_party/IPC/IPCLog.h b/weex_core/Source/third_party/IPC/IPCLog.h
index 5f43913..04baf0d 100644
--- a/weex_core/Source/third_party/IPC/IPCLog.h
+++ b/weex_core/Source/third_party/IPC/IPCLog.h
@@ -25,6 +25,7 @@
 #ifndef IPCLOG_H
 #define IPCLOG_H
 #include "../../base/log_defines.h"
+
 #define IPC_LOGE(format, ...) LOGE(format, ##__VA_ARGS__)
 #define IPC_LOGD(format, ...) LOGD(format, ##__VA_ARGS__)
 #endif /* IPCLOG_H */
diff --git a/weex_core/Source/third_party/IPC/IPCMessageJS.h b/weex_core/Source/third_party/IPC/IPCMessageJS.h
index b7e0ad4..af7cc0b 100644
--- a/weex_core/Source/third_party/IPC/IPCMessageJS.h
+++ b/weex_core/Source/third_party/IPC/IPCMessageJS.h
@@ -44,6 +44,7 @@ enum class IPCJSMsg {
     EXECJSONAPPWITHRESULT,
     CALLJSONAPPCONTEXT,
     DESTORYAPPCONTEXT,
+    SETLOGLEVEL,
 };
 
 // Message from Script to Core in ScriptBridge
@@ -75,8 +76,8 @@ enum class IPCProxyMsg {
     DISPATCHMESSAGESYNC,
   	ONRECEIVEDRESULT,
     UPDATECOMPONENTDATA,
-    TLOGMSG,
     HEARTBEAT,
+    POSTLOGDETAIL,
 };
 // Message from Script to Core in ScriptBridge