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"; }