You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by zs...@apache.org on 2017/03/30 11:38:37 UTC

[03/30] incubator-weex git commit: * [android] v8 code cache supports.

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b18fb5b6/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
index f2181b4..4e465e0 100755
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKManager.java
@@ -417,6 +417,19 @@ public class WXSDKManager {
     mBridgeManager.notifyTrimMemory();
   }
 
+  /**
+   * Weex embedders can use <code>notifySerializeCodeCache</code> to
+   * serialize code caches if the jsfm has the alility to compile 'new Function'
+   * against js bundles on the weex native side.
+   *
+   * It's a good time to serialize a code cache after exiting a weex page.
+   * Then, the next time of entering the same weex page, V8 would compile
+   * 'new Function' against the code cache deseriazed from the js bundle.
+   */
+  public void notifySerializeCodeCache() {
+    mBridgeManager.notifySerializeCodeCache();
+  }
+
   public @Nullable
   IWebSocketAdapter getIWXWebSocketAdapter() {
     if (mIWebSocketAdapterFactory != null) {

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b18fb5b6/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
index 0bd3417..1860e3e 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
@@ -286,6 +286,8 @@ public class WXBridgeManager implements Callback,BactchExecutor {
   public static final String METHOD_CALLBACK = "callback";
   public static final String METHOD_REFRESH_INSTANCE = "refreshInstance";
   public static final String METHOD_NOTIFY_TRIM_MEMORY = "notifyTrimMemory";
+  public static final String METHOD_NOTIFY_SERIALIZE_CODE_CACHE =
+      "notifySerializeCodeCache";
 
   public static final String KEY_METHOD = "method";
   public static final String KEY_ARGS = "args";
@@ -1354,4 +1356,16 @@ public class WXBridgeManager implements Callback,BactchExecutor {
     return ret;
   }
 
+  public void notifySerializeCodeCache() {
+    post(new Runnable() {
+      @Override
+      public void run() {
+        if (!isJSFrameworkInit())
+          return;
+        
+        invokeExecJS("", null, METHOD_NOTIFY_SERIALIZE_CODE_CACHE, new WXJSObject[0]);
+      }
+    });
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b18fb5b6/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java b/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
index 9a8583a..118bf85 100755
--- a/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
+++ b/android/sdk/src/main/java/com/taobao/weex/utils/WXSoInstallMgrSdk.java
@@ -251,7 +251,7 @@ public class WXSoInstallMgrSdk {
   private final static String X86 = "x86";
   private final static String MIPS = "mips";
   //private final static int ARMEABI_Size = 3542844;
-  private final static int ARMEABI_Size = 120132;
+  private final static int ARMEABI_Size = 120120;
   private final static int X86_Size = 4451068;
 
   static Context mContext = null;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b18fb5b6/build/build.js
----------------------------------------------------------------------
diff --git a/build/build.js b/build/build.js
index f9b6868..10b9e40 100644
--- a/build/build.js
+++ b/build/build.js
@@ -1,3 +1,5 @@
+"use strict"
+
 const fs = require('fs')
 const path = require('path')
 const gzip = require('zlib').createGzip()

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b18fb5b6/html5/frameworks/legacy/app/ctrl/init.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/app/ctrl/init.js b/html5/frameworks/legacy/app/ctrl/init.js
index 0e5d0be..d9c403a 100644
--- a/html5/frameworks/legacy/app/ctrl/init.js
+++ b/html5/frameworks/legacy/app/ctrl/init.js
@@ -21,8 +21,11 @@ import { updateActions } from './misc'
  * @param  {object} app
  * @param  {string} code
  * @param  {object} data
+ * @param  {string} bundleUrl
+ * @param  {string} bundleDigest
+ * @param  {string} codeCachePath
  */
-export function init (app, code, data, services) {
+export function init (app, code, data, services, bundleUrl, bundleDigest, codeCachePath) {
   console.debug('[JS Framework] Intialize an instance with:\n', data)
   let result
 
@@ -78,6 +81,7 @@ export function init (app, code, data, services) {
   // run code and get result
   const { WXEnvironment } = global
   const timerAPIs = {}
+
   /* istanbul ignore if */
   if (WXEnvironment && WXEnvironment.platform !== 'Web') {
     // timer APIs polyfill in native
@@ -117,7 +121,15 @@ export function init (app, code, data, services) {
     __weex_viewmodel__: bundleVm,
     weex: weexGlobalObject
   }, timerAPIs, services)
-  callFunction(globalObjects, functionBody)
+  if (!callFunctionNative(globalObjects,
+                          functionBody,
+                          bundleUrl,
+                          bundleDigest,
+                          codeCachePath)) {
+    // If failed to compile functionBody on native side,
+    // fallback to callFunction.
+    callFunction(globalObjects, functionBody)
+  }
 
   return result
 }
@@ -140,3 +152,49 @@ function callFunction (globalObjects, body) {
   const result = new Function(...globalKeys)
   return result(...globalValues)
 }
+
+/**
+ * Call a new function generated on the V8 native side.
+ * @param  {object} globalObjects
+ * @param  {string} code
+ * @param  {string} url
+ * @param  {string} digest
+ * @param  {string} path
+ * @return {boolean} return true if no error occurred.
+ */
+function callFunctionNative (globalObjects, body, url, digest, path) {
+  if (typeof compileAndRunBundle !== 'function') {
+    return false
+  }
+
+  let fn = void 0
+  let isNativeCompileOk = false
+  let script = '(function ('
+  const globalKeys = []
+  const globalValues = []
+  for (const key in globalObjects) {
+    globalKeys.push(key)
+    globalValues.push(globalObjects[key])
+  }
+  for (let i = 0; i < globalKeys.length - 1; ++i) {
+    script += globalKeys[i]
+    script += ','
+  }
+  script += globalKeys[globalKeys.length - 1]
+  script += ') {'
+  script += body
+  script += '} )'
+
+  try {
+    fn = compileAndRunBundle(script, url, digest, path)
+    if (fn && typeof fn === 'function') {
+      fn(...globalValues)
+      isNativeCompileOk = true
+    }
+  }
+  catch (e) {
+    console.error(e)
+  }
+
+  return isNativeCompileOk
+}

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/b18fb5b6/html5/frameworks/legacy/static/create.js
----------------------------------------------------------------------
diff --git a/html5/frameworks/legacy/static/create.js b/html5/frameworks/legacy/static/create.js
index b81c9d3..3bf7a98 100644
--- a/html5/frameworks/legacy/static/create.js
+++ b/html5/frameworks/legacy/static/create.js
@@ -24,7 +24,13 @@ export function createInstance (id, code, options, data, info) {
   if (!instance) {
     instance = new App(id, options)
     instanceMap[id] = instance
-    result = initApp(instance, code, data, services)
+    result = initApp(instance,
+                     code,
+                     data,
+                     services,
+                     options.bundleUrl,
+                     options.bundleDigest,
+                     options.codeCachePath)
   }
   else {
     result = new Error(`invalid instance id "${id}"`)