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 2f6420af3e..6a853d533f 100644 --- a/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java +++ b/android/sdk/src/main/java/com/taobao/weex/WXEnvironment.java @@ -81,6 +81,11 @@ public class WXEnvironment { /** from init to sdk-ready **/ public static long sSDKInitTime =0; + /** + * component and modules ready + * */ + public static long sComponentsAndModulesReadyTime = 0; + public static LogLevel sLogLevel = LogLevel.DEBUG; private static boolean isApkDebug = true; public static boolean isPerf = false; 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 1a288eedf5..a297113755 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 @@ -1670,6 +1670,7 @@ private void initFramework(String framework) { execRegisterFailTask(); WXEnvironment.JsFrameworkInit = true; registerDomModule(); + trackComponentAndModulesTime(); String reinitInfo = ""; if (reInitCount > 1) { reinitInfo = "reinit Framework:"; @@ -1709,6 +1710,17 @@ private void initFramework(String framework) { } } + private void trackComponentAndModulesTime() { + post(new Runnable() { + @Override + public void run() { + WXEnvironment.sComponentsAndModulesReadyTime = System.currentTimeMillis() - WXEnvironment.sSDKInitStart; + WXLogUtils.renderPerformanceLog("ComponentModulesReadyTime", WXEnvironment.sComponentsAndModulesReadyTime); + WXLogUtils.d("ComponentModulesReadyTime " + WXEnvironment.sComponentsAndModulesReadyTime); + } + }); + } + @SuppressWarnings("unchecked") private void invokeCallJSBatch(Message message) { if (mNextTickTasks.isEmpty() || !isJSFrameworkInit()) { @@ -1844,12 +1856,18 @@ public void registerComponents(final List> components) { || components.size() == 0) { return; } - post(new Runnable() { + Runnable runnable = new Runnable() { @Override public void run() { invokeRegisterComponents(components, mRegisterComponentFailList); } - }, null); + }; + + if(isJSThread() && isJSFrameworkInit()){ + runnable.run(); + }else{ + post(runnable, null); + } } public void execJSService(final String service) { @@ -1910,9 +1928,9 @@ private void invokeRegisterModules(Map modules, List autoLoadClass = new ConcurrentLinkedQueue<>(); + + /** + * pre load module class and methods when so&jsf init + **/ + public static void preLoad(JavascriptInvokable invokable){ + if(invokable instanceof ConfigModuleFactory){ + return; + } + if(invokable instanceof ConfigComponentHolder){ + return; + } + autoLoadClass.add(invokable); + } /** * auto scan config files and do auto config from files, none need center register @@ -49,6 +65,16 @@ public static void doScanConfig(){ @Override public void run() { doScanConfigSync(); + JavascriptInvokable invokable = autoLoadClass.poll(); + int count = 0; + while (invokable != null){ + invokable.getMethods(); + invokable = autoLoadClass.poll(); + count++; + } + if(WXEnvironment.isApkDebugable()){ + WXLogUtils.d(TAG, "auto preload class's methods count " + count); + } } }); thread.setName("AutoScanConfigRegister");