You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by to...@apache.org on 2018/03/07 07:01:11 UTC
[2/5] incubator-weex git commit: * [WEEX-240] [android] feature
update for weexsandbox and size off so 1. every page will has a runtime
context independent of other page 2. At the beginning of js,
will use // {"framework" : "Rax"} or // {"framework" :
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/libs/armeabi/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjsc.so b/android/sdk/libs/armeabi/libweexjsc.so
old mode 100644
new mode 100755
index 28ee2a3..f45aee4
Binary files a/android/sdk/libs/armeabi/libweexjsc.so and b/android/sdk/libs/armeabi/libweexjsc.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/libs/armeabi/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjss.so b/android/sdk/libs/armeabi/libweexjss.so
old mode 100644
new mode 100755
index dc93f8d..51bbd4d
Binary files a/android/sdk/libs/armeabi/libweexjss.so and b/android/sdk/libs/armeabi/libweexjss.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/libs/armeabi/libweexjst.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/armeabi/libweexjst.so b/android/sdk/libs/armeabi/libweexjst.so
index bca44ad..099256c 100755
Binary files a/android/sdk/libs/armeabi/libweexjst.so and b/android/sdk/libs/armeabi/libweexjst.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/libs/x86/libweexjsc.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjsc.so b/android/sdk/libs/x86/libweexjsc.so
index 3e2bf9a..b86a821 100755
Binary files a/android/sdk/libs/x86/libweexjsc.so and b/android/sdk/libs/x86/libweexjsc.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/libs/x86/libweexjss.so
----------------------------------------------------------------------
diff --git a/android/sdk/libs/x86/libweexjss.so b/android/sdk/libs/x86/libweexjss.so
index 13c858f..fc8e5f6 100755
Binary files a/android/sdk/libs/x86/libweexjss.so and b/android/sdk/libs/x86/libweexjss.so differ
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
----------------------------------------------------------------------
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 e6084d9..96ca990 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java
@@ -119,6 +119,9 @@ public class WXEnvironment {
configs.put(WXConfig.weexVersion, String.valueOf(WXSDK_VERSION));
configs.put(WXConfig.logLevel,sLogLevel.getName());
try {
+ if (isApkDebugable()) {
+ options.put(WXConfig.debugMode, "true");
+ }
options.put(WXConfig.scale, Float.toString(sApplication.getResources().getDisplayMetrics().density));
}catch (NullPointerException e){
//There is little chance of NullPointerException as sApplication may be null.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
index 475991e..bdc6f2f 100644
--- a/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
+++ b/android/sdk/src/main/java/com/taobao/weex/WXSDKInstance.java
@@ -175,6 +175,26 @@ public class WXSDKInstance implements IWXActivityStateListener,DomContext, View.
private ComponentObserver mComponentObserver;
private boolean mIsCommitedDomAtionExp = false;
+ // add for clound setting, default value is true
+ // can use it to control weex sandbox
+ // if true will open weex sandbox for multi context
+ private boolean mUseSandBox = true;
+
+ /**
+ * get sandbox switch
+ * @return useSandBox
+ */
+ public boolean getUseSandBox() {
+ return mUseSandBox;
+ }
+
+ /**
+ * set open SandBox
+ * @param flag
+ */
+ public void setUseSandBox(boolean flag) {
+ mUseSandBox = flag;
+ }
public PriorityQueue<WXEmbed> hiddenEmbeds;
private int maxHiddenEmbedsNum = -1; //max hidden embed num, -1 standard for ulimit
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
index ef30168..20b37e1 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridge.java
@@ -64,9 +64,28 @@ class WXBridge implements IWXBridge {
*/
public native int execJS(String instanceId, String namespace, String function, WXJSObject[] args);
+ /**
+ * nativeCreateInstanceContext
+ * @param instanceId
+ * @param name
+ * @param function
+ * @param args
+ * @return
+ */
+ public native int createInstanceContext(String instanceId, String name, String function, WXJSObject[] args);
/**
+ * nativeDestoryInstance
+ * @param instanceId
+ * @param name
+ * @param function
+ * @param args
+ * @return
+ */
+ public native int destoryInstance(String instanceId, String name, String function, WXJSObject[] args);
+
+ /**
* Execute JavaScript function
*
* @param instanceId
@@ -85,6 +104,15 @@ class WXBridge implements IWXBridge {
*/
public native int execJSService(String javascript);
+
+ /**
+ * execJSOnInstance
+ * @param instanceId id
+ * @param script js
+ * @param type tag: sync | async | global | instance
+ * @return value
+ */
+ public native String execJSOnInstance(String instanceId, String script, int type);
/**
* Take v8's heap snapshot
* @param filename the name of the file to be written.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/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 fca40d9..bc4dfef 100644
--- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
+++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java
@@ -19,6 +19,7 @@
package com.taobao.weex.bridge;
import android.content.Context;
+import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Handler.Callback;
@@ -54,6 +55,7 @@ import com.taobao.weex.dom.action.Action;
import com.taobao.weex.dom.action.Actions;
import com.taobao.weex.dom.action.TraceableAction;
import com.taobao.weex.tracing.WXTracing;
+import com.taobao.weex.ui.WXComponentRegistry;
import com.taobao.weex.utils.WXExceptionUtils;
import com.taobao.weex.utils.WXFileUtils;
import com.taobao.weex.utils.WXJsonUtils;
@@ -75,12 +77,15 @@ import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.Stack;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
-
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
import static com.taobao.weex.bridge.WXModuleManager.getDomModule;
import static com.taobao.weex.bridge.WXModuleManager.createDomModule;
@@ -138,6 +143,8 @@ public class WXBridgeManager implements Callback, BactchExecutor {
public static final String INITLOGFILE = "/jsserver_start.log";
private static final String NON_CALLBACK = "-1";
private static final String UNDEFINED = "undefined";
+
+ private static final String BUNDLE_TYPE = "bundleType";
private static final int INIT_FRAMEWORK_OK = 1;
private static final int CRASHREINIT = 50;
static volatile WXBridgeManager mBridgeManager;
@@ -145,6 +152,15 @@ public class WXBridgeManager implements Callback, BactchExecutor {
private volatile static int reInitCount = 1;
private static String crashUrl = null;
private static long lastCrashTime = 0;
+ private static String mRaxApi = null;
+
+ private static boolean mBackupJsf = false;
+
+ private enum BundType {
+ Vue,
+ Rax,
+ Others
+ };
/**
* Whether JS Framework(main.js) has been initialized.
@@ -1111,6 +1127,24 @@ public class WXBridgeManager implements Callback, BactchExecutor {
}
+ public String syncExecJsOnInstanceWithResult(final String instanceId, final String js, final int type) {
+ final CountDownLatch waitLatch = new CountDownLatch(1);
+ EventResult callback = new EventResult(){
+ @Override
+ public void onCallback(Object result) {
+ super.onCallback(result);
+ waitLatch.countDown();
+ }
+ };
+ try{
+ execJSOnInstance(callback, instanceId, js, type);
+ waitLatch.await(100, TimeUnit.MILLISECONDS);
+ return callback.getResult().toString();
+ }catch (Exception e){
+ WXLogUtils.e("syncCallExecJsOnInstance", e);
+ return "";
+ }
+ }
/**
* ref, type, data, domChanges
@@ -1571,7 +1605,24 @@ public class WXBridgeManager implements Callback, BactchExecutor {
private void invokeCreateInstance(@NonNull WXSDKInstance instance, String template,
Map<String, Object> options, String data) {
- initFramework("");
+ // add for sandbox, will delete on sandbox ok
+ if (!instance.getUseSandBox()) {
+ // will delete on sandbox stable
+ if (!mBackupJsf || !isJSFrameworkInit()) {
+ String jsf_backup = WXFileUtils.loadAsset("main-backup.js", WXEnvironment.getApplication());
+ setJSFrameworkInit(false);
+ initFramework(jsf_backup);
+ mBackupJsf = true;
+ WXModuleManager.reload();
+ WXComponentRegistry.reload();
+ }
+ } else {
+ initFramework("");
+ }
+ // will delete soon, only for dwongrade sandbox
+
+ // origin code
+ // initFramework("");
if (mMock) {
mock(instance.getInstanceId());
@@ -1586,6 +1637,41 @@ public class WXBridgeManager implements Callback, BactchExecutor {
return;
}
try {
+ BundType type = BundType.Others;
+ try {
+ long start = System.currentTimeMillis();
+ type = getBundleType(instance.getBundleUrl(), template);
+
+ if (WXEnvironment.isOpenDebugLog()) {
+ long end = System.currentTimeMillis();
+ WXLogUtils.e("end getBundleType type:" + type.toString() + " time:" + (end - start));
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ try {
+ if (options == null) {
+ options = new HashMap<>();
+ }
+ // on file there is { "framework": "Vue" } or others
+ if (options.get(BUNDLE_TYPE) == null) {
+ // may vue or Rax
+ if (type == BundType.Vue) {
+ options.put(BUNDLE_TYPE, "Vue");
+ } else if (type == BundType.Rax) {
+ options.put(BUNDLE_TYPE, "Rax");
+ } else {
+ options.put(BUNDLE_TYPE, "Others");
+ }
+ }
+ if (options.get("env") == null) {
+ options.put("env", mInitParams);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+
if (WXEnvironment.isOpenDebugLog()) {
WXLogUtils.d("createInstance >>>> instanceId:" + instance.getInstanceId()
+ ", options:"
@@ -1599,12 +1685,37 @@ public class WXBridgeManager implements Callback, BactchExecutor {
WXJSObject optionsObj = new WXJSObject(WXJSObject.JSON,
options == null ? "{}"
: WXJsonUtils.fromObjectToJSONString(options));
+ optionsObj = optionObjConvert(instance.getUseSandBox(), type, optionsObj);
WXJSObject dataObj = new WXJSObject(WXJSObject.JSON,
data == null ? "{}" : data);
+ WXJSObject apiObj;
+ if (type == BundType.Rax) {
+ if (mRaxApi == null) {
+ mRaxApi = WXFileUtils.loadAsset("weex-rax.js", WXEnvironment.getApplication());
+ }
+ apiObj = new WXJSObject(WXJSObject.String,
+ mRaxApi);
+ } else {
+ apiObj = new WXJSObject(WXJSObject.String,
+ "");
+ }
+
WXJSObject[] args = {instanceIdObj, instanceObj, optionsObj,
- dataObj};
+ dataObj, apiObj};
instance.setTemplate(template);
- invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
+ // if { "framework": "Vue" } or { "framework": "Rax" } will use invokeCreateInstanceContext
+ // others will use invokeExecJS
+ if (!instance.getUseSandBox()) {
+ invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
+ return;
+ }
+ if (type == BundType.Vue || type == BundType.Rax) {
+ invokeCreateInstanceContext(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
+ return;
+ } else {
+ invokeExecJS(instance.getInstanceId(), null, METHOD_CREATE_INSTANCE, args, false);
+ return;
+ }
} catch (Throwable e) {
String err = "[WXBridgeManager] invokeCreateInstance " + e.getCause()
+ instance.getTemplateInfo();
@@ -1617,6 +1728,104 @@ public class WXBridgeManager implements Callback, BactchExecutor {
}
}
+ public WXJSObject optionObjConvert(boolean useSandBox, BundType type, WXJSObject opt) {
+ if (!useSandBox || type == BundType.Others) {
+ return opt;
+ }
+ try {
+ String data = opt.data.toString();
+ JSONObject obj = JSON.parseObject(data);
+ if (obj.getJSONObject("env") != null) {
+ JSONObject optEnv = obj.getJSONObject("env");
+ // obj.replace()
+ if (optEnv != null) {
+ JSONObject opts = optEnv.getJSONObject("options");
+ if (opts!= null) {
+ optEnv.remove("options");
+ Set<String> set = opts.keySet();
+ for(Iterator it = set.iterator(); it.hasNext();) {
+ String key = it.next().toString();
+ optEnv.put(key, opts.getString(key));
+ }
+ }
+ }
+ obj.remove("env");
+ obj.put("env", optEnv);
+ }
+ WXJSObject optionsObj = new WXJSObject(WXJSObject.JSON, obj.toString());
+ return optionsObj;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ return opt;
+
+ }
+
+ /**
+ * check bundleType
+ * @param url
+ * @param temp
+ * @return
+ */
+ public BundType getBundleType(String url, String temp) {
+ try {
+ if (url != null) {
+ Uri uri = Uri.parse(url);
+ String type = uri.getQueryParameter(BUNDLE_TYPE);
+ if ("Vue".equals(type) || "vue".equals(type)) {
+ return BundType.Vue;
+ } else if ("Rax".equals(type) || "rax".equals(type)) {
+ return BundType.Rax;
+ }
+ }
+ if (temp != null) {
+ if (temp.startsWith("// { \"framework\": \"Vue\" }") ||
+ temp.startsWith("// { \"framework\": \"vue\" }") ||
+ temp.startsWith("// {\"framework\" : \"Vue\"}") ||
+ temp.startsWith("// {\"framework\" : \"vue\"}")) {
+ return BundType.Vue;
+ } else if (temp.startsWith("// { \"framework\": \"Rax\" }") ||
+ temp.startsWith("// { \"framework\": \"rax\" }")
+ || temp.startsWith("// {\"framework\" : \"Rax\"}") ||
+ temp.startsWith("// {\"framework\" : \"rax\"}")) {
+ return BundType.Rax;
+ } else {
+ if (temp.length() > 500) {
+ temp = temp.substring(0, 500);
+ }
+ String strTrim = temp.replaceAll("\n","");
+ strTrim.trim();
+ if (strTrim.startsWith("// { \"framework\": \"Vue\" }") ||
+ strTrim.startsWith("// { \"framework\": \"vue\" }") ||
+ strTrim.startsWith("// {\"framework\" : \"Vue\"}") ||
+ strTrim.startsWith("// {\"framework\" : \"vue\"}")) {
+ return BundType.Vue;
+ } else if (strTrim.startsWith("// { \"framework\": \"Rax\" }") ||
+ strTrim.startsWith("// { \"framework\": \"rax\" }")
+ || strTrim.startsWith("// {\"framework\" : \"Rax\"}") ||
+ strTrim.startsWith("// {\"framework\" : \"rax\"}")) {
+ return BundType.Rax;
+ }
+
+ String regEx = "(use)(\\s+)(weex:vue)";
+ Pattern pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
+ if (pattern.matcher(temp).find()) {
+ return BundType.Vue;
+ }
+ regEx = "(use)(\\s+)(weex:rax)";
+ pattern = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
+ if (pattern.matcher(temp).find()) {
+ return BundType.Rax;
+ }
+ }
+ }
+ return BundType.Others;
+ } catch (Throwable e) {
+ e.printStackTrace();
+ return BundType.Others;
+ }
+ }
+
private void mock(String instanceId) {
}
@@ -1653,7 +1862,8 @@ public class WXBridgeManager implements Callback, BactchExecutor {
instanceId);
WXJSObject[] args = {instanceIdObj};
if (isJSFrameworkInit()) {
- invokeExecJS(instanceId, null, METHOD_DESTROY_INSTANCE, args);
+ invokeDestoryInstance(instanceId, null, METHOD_DESTROY_INSTANCE, args, true);
+ // invokeExecJS(instanceId, null, METHOD_DESTROY_INSTANCE, args);
}
} catch (Throwable e) {
String err = "[WXBridgeManager] invokeDestroyInstance " + e.getCause();
@@ -1715,6 +1925,52 @@ public class WXBridgeManager implements Callback, BactchExecutor {
}
mWXBridge.execJS(instanceId, namespace, function, args);
}
+
+ public void invokeCreateInstanceContext(String instanceId, String namespace, String function,
+ WXJSObject[] args, boolean logTaskDetail) {
+ WXLogUtils.d("invokeCreateInstanceContext instanceId:" + instanceId + " function:"
+ + function + " isJSFrameworkInit:%d" + isJSFrameworkInit());
+ mLodBuilder.append("createInstanceContext >>>> instanceId:").append(instanceId)
+ .append("function:").append(function);
+ if (logTaskDetail)
+ mLodBuilder.append(" tasks:").append(WXJsonUtils.fromObjectToJSONString(args));
+ WXLogUtils.d(mLodBuilder.substring(0));
+ mLodBuilder.setLength(0);
+ // }
+ mWXBridge.createInstanceContext(instanceId, namespace, function, args);
+ }
+
+public void invokeDestoryInstance(String instanceId, String namespace, String function,
+ WXJSObject[] args, boolean logTaskDetail) {
+ // if (WXEnvironment.isApkDebugable()) {
+ mLodBuilder.append("callJS >>>> instanceId:").append(instanceId)
+ .append("function:").append(function);
+ if (logTaskDetail)
+ mLodBuilder.append(" tasks:").append(WXJsonUtils.fromObjectToJSONString(args));
+ WXLogUtils.d(mLodBuilder.substring(0));
+ mLodBuilder.setLength(0);
+ // }
+ mWXBridge.destoryInstance(instanceId, namespace, function, args);
+ }
+
+ private void execJSOnInstance(final EventResult eventCallback, final String instanceId, final String js, final int type) {
+ post(new Runnable() {
+ @Override
+ public void run() {
+ String ret = invokeExecJSOnInstance(instanceId, js, type);
+ eventCallback.onCallback(ret);
+ }
+ });
+ }
+
+ private String invokeExecJSOnInstance(String instanceId, String js, int type) {
+ // if (WXEnvironment.isApkDebugable()) {
+ mLodBuilder.append("execJSOnInstance >>>> instanceId:").append(instanceId);
+ WXLogUtils.d(mLodBuilder.substring(0));
+ mLodBuilder.setLength(0);
+ // }
+ return mWXBridge.execJSOnInstance(instanceId, js, type);
+ }
private byte[] invokeExecJSWithResult(String instanceId, String namespace, String function,
WXJSObject[] args,boolean logTaskDetail){
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
index 6a2a97f..0933ce3 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/IWXBridge.java
@@ -61,7 +61,36 @@ public interface IWXBridge extends IWXObject {
byte[] execJSWithResult(String instanceId, String namespace, String function, WXJSObject[] args);
+/**
+ * createInstance
+ * @param instanceId
+ * @param namespace
+ * @param function
+ * @param args
+ * @return
+ */
+ int createInstanceContext(String instanceId, String namespace, String function, WXJSObject[] args);
+
+ /**
+ * destoryInstance
+ * @param instanceId
+ * @param namespace
+ * @param function
+ * @param args
+ * @return
+ */
+ int destoryInstance(String instanceId, String namespace, String function, WXJSObject[] args);
int execJSService(String javascript);
+
+ /**
+ * execJSOnInstance
+ * @param instanceId
+ * @param script
+ * @param type
+ * @return
+ */
+
+ String execJSOnInstance(String instanceId, String script, int type);
/**
* take the heap snapshot and serialize the heap to a local file.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/7c5ef1c6/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
----------------------------------------------------------------------
diff --git a/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java b/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
index ae1774d..11dc820 100644
--- a/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
+++ b/android/sdk/src/main/java/com/taobao/weex/common/WXConfig.java
@@ -33,4 +33,5 @@ public interface WXConfig {
String externalUserAgent="externalUserAgent";
String logLevel="logLevel";
String scale = "scale";
+ String debugMode = "debugMode";
}