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