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}"`)