diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java index 4dbf2f978c0..356c3d91899 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/HippyEngineManagerImpl.java @@ -28,6 +28,7 @@ import com.tencent.mtt.hippy.bridge.bundleloader.HippyAssetBundleLoader; import com.tencent.mtt.hippy.bridge.bundleloader.HippyBundleLoader; import com.tencent.mtt.hippy.bridge.bundleloader.HippyFileBundleLoader; +import com.tencent.mtt.hippy.bridge.bundleloader.HippyRemoteBundleLoader; import com.tencent.mtt.hippy.bridge.libraryloader.LibraryLoader; import com.tencent.mtt.hippy.common.Callback; import com.tencent.mtt.hippy.common.HippyJsException; @@ -45,6 +46,7 @@ import com.tencent.mtt.hippy.utils.TimeMonitor; import com.tencent.mtt.hippy.utils.UIThreadUtils; import java.io.File; +import java.io.InputStream; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -134,7 +136,7 @@ else if (!TextUtils.isEmpty(params.coreJSFilePath)) this.mPreloadBundleLoader = preloadBundleLoader; this.mAPIProviders = params.providers; this.mDebugMode = params.debugMode; - this.mServerBundleName = params.debugMode ? params.debugBundleName : "";; + this.mServerBundleName = params.debugMode ? params.debugBundleName : ""; this.mStartTimeMonitor = new TimeMonitor(!params.debugMode); this.mEnableHippyBuffer = params.enableBuffer; this.mServerHost = params.debugServerHost; @@ -169,10 +171,11 @@ public void initEngine(EngineListener listener) mDevSupportManager = new DevSupportManager(mGlobalConfigs, mDebugMode, mServerHost, mServerBundleName); mDevSupportManager.setDevCallback(this); - if(mDebugMode) - { + if(mDebugMode) { mDevSupportManager.init(null); - return; + String url = mDevSupportManager.createResourceUrl(mServerBundleName); + mCoreBundleLoader = new HippyRemoteBundleLoader(url); + ((HippyRemoteBundleLoader)mCoreBundleLoader).setIsDebugMode(true); } LogUtils.d(TAG, "start restartEngineInBackground..."); @@ -679,11 +682,21 @@ public void onInstancePause(int id) } } + @Override + public void onDevBundleLoadReady(InputStream inputStream) { + + } + + @Override + public void onDevBundleReLoad() { + restartEngineInBackground(); + } @Override public void onDevBundleLoadReady(File bundle) { mCoreBundleLoader = new HippyFileBundleLoader(bundle.getAbsolutePath()); + ((HippyFileBundleLoader)mCoreBundleLoader).setIsDebugMode(true); restartEngineInBackground(); } diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridge.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridge.java index 22fed784b4e..912cc4d4831 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridge.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridge.java @@ -27,12 +27,17 @@ */ public interface HippyBridge { + static final String URI_SCHEME_ASSETS = "asset:"; + static final String URI_SCHEME_FILE = "file:"; + public void initJSBridge(String gobalConfig, NativeCallback callback, int groupId); public boolean runScriptFromFile(String filePath, String scriptName, boolean canUseCodeCache, String codeCacheTag, NativeCallback callback); public boolean runScriptFromAssets(String fileName, AssetManager assetManager, boolean canUseCodeCache, String codeCacheTag, NativeCallback callback); + public boolean runScriptFromUri(String uri, AssetManager assetManager, boolean canUseCodeCache, String codeCacheTag, NativeCallback callback); + public void destroy(NativeCallback callback); public void callFunction(String action, String params, NativeCallback callback); diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeImpl.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeImpl.java index 014b0d8f04c..368085ecaa1 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeImpl.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeImpl.java @@ -15,10 +15,20 @@ */ package com.tencent.mtt.hippy.bridge; +import android.util.Log; +import com.tencent.mtt.hippy.HippyEngineContext; +import com.tencent.mtt.hippy.devsupport.DevServerCallBack; +import com.tencent.mtt.hippy.devsupport.DevServerConfig; +import com.tencent.mtt.hippy.devsupport.DevSupportManager; +import com.tencent.mtt.hippy.utils.ContextHolder; +import com.tencent.mtt.hippy.utils.UIThreadUtils; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FilenameFilter; +import java.io.InputStream; import java.nio.charset.Charset; import java.util.Locale; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -40,6 +50,7 @@ public class HippyBridgeImpl implements HippyBridge, DevRemoteDebugProxy.OnRecei private static volatile ThreadPoolExecutor mCodeCacheThreadExecutor = null; private static volatile int sBridgeNum = 0; private static Object sBridgeSyncLock; + private static int TIMEOUT = 3000; static { @@ -59,15 +70,16 @@ public class HippyBridgeImpl implements HippyBridge, DevRemoteDebugProxy.OnRecei private DebugWebSocketClient mDebugWebSocketClient; private String mDebugGobalConfig; private NativeCallback mDebugInitJSFrameworkCallback; + private HippyEngineContext mContext; - public HippyBridgeImpl(Context context, BridgeCallback callback, boolean singleThreadMode, - boolean jsonBrige, boolean isDevModule, String debugServerHost) + public HippyBridgeImpl(HippyEngineContext engineContext, BridgeCallback callback, boolean singleThreadMode, boolean jsonBrige, boolean isDevModule, String debugServerHost) { this.mBridgeCallback = callback; this.mSingleThreadMode = singleThreadMode; this.mBridgeParamJson = jsonBrige; this.mIsDevModule = isDevModule; this.mDebugServerHost = debugServerHost; + this.mContext = engineContext; synchronized (sBridgeSyncLock) { @@ -75,6 +87,7 @@ public HippyBridgeImpl(Context context, BridgeCallback callback, boolean singleT if (mCodeCacheRootDir == null) { + Context context = mContext.getGlobalConfigs().getContext(); File hippyFile = FileUtils.getHippyFile(context); if (hippyFile != null) { @@ -129,6 +142,8 @@ public void onSuccess(String response) public void onFailure(final Throwable cause) { LogUtils.e("hippyCore", "js debug socket connect failed"); + + initJSEngine(groupId); } }); } @@ -177,6 +192,7 @@ public boolean runScriptFromAssets(String fileName, AssetManager assetManager, b { return false; } + if (!TextUtils.isEmpty(codeCacheTag) && !TextUtils.isEmpty(mCodeCacheRootDir)) { LogUtils.e("HippyEngineMonitor", "runScriptFromAssets ======core====== " + codeCacheTag + ", canUseCodeCache == " + canUseCodeCache); @@ -192,6 +208,29 @@ public boolean runScriptFromAssets(String fileName, AssetManager assetManager, b } } + @Override + public boolean runScriptFromUri(String uri, AssetManager assetManager, boolean canUseCodeCache, String codeCacheTag, NativeCallback callback) + { + if (!mInit) + { + return false; + } + + if (!TextUtils.isEmpty(codeCacheTag) && !TextUtils.isEmpty(mCodeCacheRootDir)) + { + LogUtils.e("HippyEngineMonitor", "runScriptFromAssets ======core====== " + codeCacheTag + ", canUseCodeCache == " + canUseCodeCache); + String codeCacheDir = mCodeCacheRootDir + codeCacheTag + File.separator; + File file = new File(codeCacheDir); + LogUtils.d("HippyEngineMonitor", "codeCacheDir file size : " + (file.listFiles() != null ? file.listFiles().length : 0)); + return runScriptFromUri(uri, assetManager, canUseCodeCache, codeCacheDir, mV8RuntimeId, callback); + } + else + { + LogUtils.e("HippyEngineMonitor", "runScriptFromAssets codeCacheTag is null"); + return runScriptFromUri(uri, assetManager, false, "" + codeCacheTag + File.separator, mV8RuntimeId, callback); + } + } + @Override public void callFunction(String action, String params, NativeCallback callback) { @@ -266,6 +305,8 @@ public void destroy(NativeCallback callback) public native boolean runScriptFromAssets(String fileName, AssetManager assetManager, boolean canUseCodeCache, String codeCacheDir, long V8RuntimId, NativeCallback callback); + public native boolean runScriptFromUri(String uri, AssetManager assetManager, boolean canUseCodeCache, String codeCacheDir, long V8RuntimId, NativeCallback callback); + public native void destroy(long V8RuntimId, boolean useLowMemoryMode, NativeCallback callback); public native void callFunction(String action, byte[] params, int offset, int length, long V8RuntimId, NativeCallback callback); @@ -302,6 +343,65 @@ public void InspectorChannel(byte[] params) } } + public byte[] fetchResourceWithUri(String uri) { + if (mContext == null || TextUtils.isEmpty(uri) || !uri.startsWith("http://")) { + return null; + } + + final String resUrl = uri; + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + final CountDownLatch countDownLatch = new CountDownLatch(1); + UIThreadUtils.runOnUiThread(new Runnable() { + @Override + public void run() { + DevSupportManager devManager = mContext.getDevSupportManager(); + if (devManager == null || !devManager.supportDev()) { + countDownLatch.countDown(); + return; + } + + devManager.loadRemoteResource(resUrl, new DevServerCallBack() { + @Override + public void onDevBundleLoadReady(File bundle) {} + + @Override + public void onDevBundleReLoad() {} + + @Override + public void onDevBundleLoadReady(InputStream inputStream) { + try { + byte[] b = new byte[2048]; + int size = 0; + while ((size = inputStream.read(b)) > 0) { + output.write(b, 0, size); + } + } catch (Exception e) { + LogUtils.e("hippy", "requireSubResource: " + e.getMessage()); + } finally { + countDownLatch.countDown(); + } + + } + + @Override + public void onInitDevError(Throwable e) { + LogUtils.e("hippy", "requireSubResource: " + e.getMessage()); + countDownLatch.countDown(); + } + }); + } + }); + + try { + //countDownLatch.await(TIMEOUT, TimeUnit.MILLISECONDS); + countDownLatch.await(); + } catch (InterruptedException e) { + LogUtils.e("hippy", "requireSubResource: " + e.getMessage()); + } + + return output.toByteArray(); + } + private HippyArray bytesToArgument(byte param[]) { HippyArray hippyParam = null; diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java index 9141c57ce8f..ae1b71c1a88 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/HippyBridgeManagerImpl.java @@ -112,9 +112,9 @@ public boolean handleMessage(Message msg) final com.tencent.mtt.hippy.common.Callback callback = (com.tencent.mtt.hippy.common.Callback) msg.obj; try { - mHippyBridge = new HippyBridgeImpl(mContext.getGlobalConfigs().getContext(), HippyBridgeManagerImpl.this, + mHippyBridge = new HippyBridgeImpl(mContext, HippyBridgeManagerImpl.this, mBridgeType == BRIDGE_TYPE_SINGLE_THREAD, !mEnableHippyBuffer, this.mIsDevModule, this.mDebugServerHost); - + mHippyBridge.initJSBridge(getGlobalConfigs(), new NativeCallback(mHandler) { @Override public void Call(long value, Message msg, String action) { diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyAssetBundleLoader.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyAssetBundleLoader.java index 84942c97a86..83a2dc2ab1a 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyAssetBundleLoader.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyAssetBundleLoader.java @@ -15,6 +15,8 @@ */ package com.tencent.mtt.hippy.bridge.bundleloader; +import static com.tencent.mtt.hippy.bridge.HippyBridge.URI_SCHEME_ASSETS; + import android.content.Context; import android.content.res.AssetManager; import android.text.TextUtils; @@ -29,7 +31,6 @@ */ public class HippyAssetBundleLoader implements HippyBundleLoader { - private static final String ASSETS_STR = "assets://"; private Context mContext; private String mAssetPath; @@ -60,21 +61,27 @@ public void setCodeCache(boolean canUseCodeCache, String codeCacheTag) @Override public boolean load(HippyBridge bridge, NativeCallback callback) { - if (TextUtils.isEmpty(mAssetPath)) - { + if (TextUtils.isEmpty(mAssetPath)) { return false; } + AssetManager assetManager = mContext.getAssets(); - return bridge.runScriptFromAssets(mAssetPath, assetManager,mCanUseCodeCache,mCodeCacheTag, callback); + return bridge.runScriptFromUri(getPath(), assetManager, mCanUseCodeCache, mCodeCacheTag, callback); + //return bridge.runScriptFromAssets(mAssetPath, assetManager,mCanUseCodeCache,mCodeCacheTag, callback); } @Override public String getPath() { - if (mAssetPath != null && !mAssetPath.startsWith(ASSETS_STR)) - return ASSETS_STR + mAssetPath; - else + if (mAssetPath != null && !mAssetPath.startsWith(URI_SCHEME_ASSETS)) { + if (mAssetPath.startsWith("/")) { + return URI_SCHEME_ASSETS + mAssetPath; + } else { + return URI_SCHEME_ASSETS + "/" + mAssetPath; + } + } else { return mAssetPath; + } } @Override diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyFileBundleLoader.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyFileBundleLoader.java index 41343518652..75b010d110c 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyFileBundleLoader.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyFileBundleLoader.java @@ -15,6 +15,8 @@ */ package com.tencent.mtt.hippy.bridge.bundleloader; +import static com.tencent.mtt.hippy.bridge.HippyBridge.URI_SCHEME_FILE; + import android.text.TextUtils; import com.tencent.mtt.hippy.bridge.HippyBridge; import com.tencent.mtt.hippy.bridge.NativeCallback; @@ -26,10 +28,10 @@ */ public class HippyFileBundleLoader implements HippyBundleLoader { - private static final String FILE_STR = "file://"; - String mFilePath; + boolean mIsDebugMode = false; + private boolean mCanUseCodeCache; private String mCodeCacheTag; @@ -52,21 +54,27 @@ public void setCodeCache(boolean canUseCodeCache, String codeCacheTag) this.mCodeCacheTag = codeCacheTag; } + public void setIsDebugMode(boolean debugMode) { + mIsDebugMode = debugMode; + } + @Override public boolean load(HippyBridge bridge, NativeCallback callback) { - if (TextUtils.isEmpty(mFilePath)) - { + if (TextUtils.isEmpty(mFilePath)) { return false; } - return bridge.runScriptFromFile(mFilePath, mFilePath,mCanUseCodeCache,mCodeCacheTag, callback); + + String uri = getPath(); + return bridge.runScriptFromUri(uri, null, mCanUseCodeCache, mCodeCacheTag, callback); + //return bridge.runScriptFromFile(mFilePath, mFilePath,mCanUseCodeCache,mCodeCacheTag, callback); } @Override public String getPath() { - if (mFilePath != null && !mFilePath.startsWith(FILE_STR)) - return FILE_STR + mFilePath; + if (mFilePath != null && !mFilePath.startsWith(URI_SCHEME_FILE)) + return URI_SCHEME_FILE + mFilePath; else return mFilePath; } diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyRemoteBundleLoader.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyRemoteBundleLoader.java new file mode 100644 index 00000000000..f6203530bd5 --- /dev/null +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/bridge/bundleloader/HippyRemoteBundleLoader.java @@ -0,0 +1,89 @@ +/* Tencent is pleased to support the open source community by making Hippy available. + * Copyright (C) 2018 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.tencent.mtt.hippy.bridge.bundleloader; + +import android.text.TextUtils; +import com.tencent.mtt.hippy.bridge.HippyBridge; +import com.tencent.mtt.hippy.bridge.NativeCallback; + +public class HippyRemoteBundleLoader implements HippyBundleLoader +{ + String mUrl; + + boolean mIsDebugMode = false; + + private boolean mCanUseCodeCache; + + private String mCodeCacheTag; + + public HippyRemoteBundleLoader(String url) + { + this(url, false, ""); + } + + public HippyRemoteBundleLoader(String url, boolean canUseCodeCache, String codeCacheTag) { + this.mUrl = url; + this.mCanUseCodeCache = canUseCodeCache; + this.mCodeCacheTag = codeCacheTag; + } + + public void setCodeCache(boolean canUseCodeCache, String codeCacheTag) { + this.mCanUseCodeCache = canUseCodeCache; + this.mCodeCacheTag = codeCacheTag; + } + + public void setIsDebugMode(boolean debugMode) { + mIsDebugMode = debugMode; + } + + @Override + public boolean load(HippyBridge bridge, NativeCallback callback) + { + if (TextUtils.isEmpty(mUrl)) { + return false; + } + + return bridge.runScriptFromUri(mUrl, null, mCanUseCodeCache, mCodeCacheTag, callback); + } + + @Override + public String getPath() { return mUrl; } + + @Override + public String getRawPath() + { + return mUrl; + } + + @Override + public String getBundleUniKey() + { + return getPath(); + } + + @Override + public boolean canUseCodeCache() + { + return mCanUseCodeCache; + } + + @Override + public String getCodeCacheTag() + { + return mCodeCacheTag; + } + +} diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/BundleFetchCallBack.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/BundleFetchCallBack.java index 195c0815fa8..adaeff3a28d 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/BundleFetchCallBack.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/BundleFetchCallBack.java @@ -16,6 +16,7 @@ package com.tencent.mtt.hippy.devsupport; import java.io.File; +import java.io.InputStream; /** * @author: edsheng @@ -26,5 +27,7 @@ public interface BundleFetchCallBack { void onSuccess(File file); + void onSuccess(InputStream inputStream); + void onFail(Exception exception); } diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerCallBack.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerCallBack.java index f47339924c0..238e9a25d48 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerCallBack.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerCallBack.java @@ -16,17 +16,16 @@ package com.tencent.mtt.hippy.devsupport; import java.io.File; - -/** - * @author: edsheng - * @date: 2017/11/15 19:13 - * @version: V1.0 - */ +import java.io.InputStream; public interface DevServerCallBack { //The bundle is loaded successfully callback void onDevBundleLoadReady(File bundle); + void onDevBundleLoadReady(InputStream inputStream); + void onInitDevError(Throwable e); + + void onDevBundleReLoad(); } diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerConfig.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerConfig.java index b1d0210e83b..cff7561954e 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerConfig.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerConfig.java @@ -26,7 +26,7 @@ public class DevServerConfig private static final String HIPPYDEBUGPREF = "hippydebugpref"; - private static final String JS_BUNDLE_FILE_NAME = "HippyDevBundle.js"; + public static final String JS_BUNDLE_FILE_NAME = "HippyDevBundle.js"; boolean mLiveDebug = false; diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerHelper.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerHelper.java index abcc7032dab..b6f2826f219 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerHelper.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerHelper.java @@ -25,11 +25,6 @@ import java.io.*; import java.util.Locale; -/** - * @author: edsheng - * @date: 2017/11/14 17:36 - * @version: V1.0 - */ public class DevServerHelper { private static final String BUNDLE_URL_FORMAT = "http://%s/%s?platform=android&dev=%s&hot=%s&minify=%s"; @@ -47,7 +42,7 @@ public DevServerHelper(HippyGlobalConfigs configs, String serverHost) mServerHost = serverHost; } - private static String createBundleURL(String host, String bundleName, boolean devMode, boolean hmr, boolean jsMinify) + public String createBundleURL(String host, String bundleName, boolean devMode, boolean hmr, boolean jsMinify) { return String.format(Locale.US, BUNDLE_URL_FORMAT, host, bundleName, devMode, hmr, jsMinify); } @@ -107,12 +102,10 @@ public void onTaskFailed(HippyHttpRequest request, Throwable error) } } - public void fetchBundleFromURL(final BundleFetchCallBack bundleFetchCallBack, boolean enableDebug, String serverHost, String bundleName, final File outputFile) + public void fetchBundleFromURL(final BundleFetchCallBack bundleFetchCallBack, final String url, final File outputFile) { - final String bundleURL = createBundleURL(serverHost, bundleName, enableDebug, false, false); - HippyHttpRequest request = new HippyHttpRequest(); - request.setUrl(bundleURL); + request.setUrl(url); mGlobalConfigs.getHttpAdapter().sendRequest(request, new HippyHttpAdapter.HttpTaskCallback() { @Override @@ -124,6 +117,11 @@ public void onTaskSuccess(HippyHttpRequest request, HippyHttpResponse response) } if (response.getStatusCode() == 200 && response.getInputStream() != null) { + if (outputFile == null) { + bundleFetchCallBack.onSuccess(response.getInputStream()); + return; + } + FileOutputStream fileOutputStream = null; try { @@ -182,7 +180,7 @@ public void onTaskSuccess(HippyHttpRequest request, HippyHttpResponse response) } if (bundleFetchCallBack != null) { - bundleFetchCallBack.onFail(new DevServerException("Could not connect to development server." + "URL: " + bundleURL.toString() + bundleFetchCallBack.onFail(new DevServerException("Could not connect to development server." + "URL: " + url + " try to :adb reverse tcp:38989 tcp:38989 , message : " + message)); } } @@ -193,7 +191,7 @@ public void onTaskFailed(HippyHttpRequest request, Throwable error) { if (bundleFetchCallBack != null) { - bundleFetchCallBack.onFail(new DevServerException("Could not connect to development server." + "URL: " + bundleURL.toString() + bundleFetchCallBack.onFail(new DevServerException("Could not connect to development server." + "URL: " + url + " try to :adb reverse tcp:38989 tcp:38989 , message : " + error.getMessage())); } } diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImpl.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImpl.java index 93f492c7d32..76d047a443f 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImpl.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImpl.java @@ -31,6 +31,7 @@ import com.tencent.mtt.hippy.utils.UIThreadUtils; import java.io.File; +import java.io.InputStream; import java.util.HashMap; import java.util.Stack; @@ -62,6 +63,8 @@ public class DevServerImpl implements View.OnClickListener, DevServerInterface, mDebugButtonStack = new Stack<>(); mHostButtonMap = new HashMap<>(); mLiveReloadController = new LiveReloadController(mFetchHelper); + + showProgressDialog(); } private void showProgressDialog() @@ -132,38 +135,52 @@ void startLiveDebug() } @Override - public void reload(DevRemoteDebugProxy remoteDebugManager) - { - showProgressDialog(); + public String createResourceUrl(String resName) { + String resUrl = mFetchHelper.createBundleURL(mServerConfig.getServerHost(), resName, mServerConfig.enableRemoteDebug(), false, false); + return resUrl; + } + + @Override + public void loadRemoteResource(String url, final DevServerCallBack serverCallBack) { mFetchHelper.fetchBundleFromURL(new BundleFetchCallBack() { @Override - public void onSuccess(File file) - { - if (mProgressDialog != null) - { + public void onSuccess(InputStream inputStream) { + if (mProgressDialog != null) { mProgressDialog.dismiss(); } - if (mServerCallBack != null) - { - mServerCallBack.onDevBundleLoadReady(file); + if (serverCallBack != null) { + serverCallBack.onDevBundleLoadReady(inputStream); } } @Override - public void onFail(Exception exception) + public void onSuccess(File file) { - if(mDebugButtonStack.isEmpty()) - { - mServerCallBack.onInitDevError(exception); + } + + @Override + public void onFail(Exception exception) { + if (serverCallBack != null) { + serverCallBack.onInitDevError(exception); } - else - { + + if(mDebugButtonStack.isEmpty()) { + mServerCallBack.onInitDevError(exception); + } else { handleException(exception); } } - }, mServerConfig.enableRemoteDebug(), mServerConfig.getServerHost(), mServerConfig.getBundleName(), mServerConfig.getJSBundleTempFile()); + }, url, null); + } + + @Override + public void reload(DevRemoteDebugProxy remoteDebugManager) + { + if (mServerCallBack != null) { + mServerCallBack.onDevBundleReLoad(); + } } @Override diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImplDisable.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImplDisable.java index e6a2766cb63..c5d7038e83c 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImplDisable.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerImplDisable.java @@ -33,6 +33,14 @@ public void reload(DevRemoteDebugProxy proxy) } + @Override + public String createResourceUrl(String resName) {return null;} + + @Override + public void loadRemoteResource(String url, DevServerCallBack serverCallBack) { + + } + @Override public void setDevServerCallback(DevServerCallBack devServerCallback) { diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerInterface.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerInterface.java index 510a619328e..05a89bfdcce 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerInterface.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevServerInterface.java @@ -29,6 +29,10 @@ public interface DevServerInterface { void reload(DevRemoteDebugProxy remoteDebugManager); + String createResourceUrl(String resName); + + void loadRemoteResource(String url, DevServerCallBack serverCallBack); + void setDevServerCallback(DevServerCallBack devServerCallback); void attachToHost(HippyRootView view); diff --git a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevSupportManager.java b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevSupportManager.java index 61969d2ea45..03c3ea99ae4 100644 --- a/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevSupportManager.java +++ b/android/sdk/src/main/java/com/tencent/mtt/hippy/devsupport/DevSupportManager.java @@ -60,11 +60,19 @@ public void detachFromHost(HippyRootView view) public void init(DevRemoteDebugProxy remoteDebugManager) { - mDevImp.reload(remoteDebugManager); + + } + + public String createResourceUrl(String resName) { + return mDevImp.createResourceUrl(resName); } public void handleException(Throwable throwable) { mDevImp.handleException(throwable); } + + public void loadRemoteResource(String url, DevServerCallBack serverCallBack) { + mDevImp.loadRemoteResource(url, serverCallBack); + } } diff --git a/examples/android-demo/example/src/main/java/com/tencent/mtt/hippy/example/MyActivity.java b/examples/android-demo/example/src/main/java/com/tencent/mtt/hippy/example/MyActivity.java index 402537f8de9..1e3c9e6a12c 100644 --- a/examples/android-demo/example/src/main/java/com/tencent/mtt/hippy/example/MyActivity.java +++ b/examples/android-demo/example/src/main/java/com/tencent/mtt/hippy/example/MyActivity.java @@ -46,11 +46,12 @@ public void onCreate(Bundle savedInstanceState) initParams.imageLoader = new MyImageLoader(); initParams.debugServerHost = "localhost:38989"; // 可选:是否设置为debug模式,默认为false。调试模式下,所有jsbundle都是从debug server上下载 - initParams.debugMode = false; + initParams.debugMode = true; // 可选:是否打印引擎的完整的log。默认为false initParams.enableLog = true; // 可选:debugMode = false 时必须设置coreJSAssetsPath或coreJSFilePath(debugMode = true时,所有jsbundle都是从debug server上下载) initParams.coreJSAssetsPath = "vendor.android.js"; + // 可选:异常处理器 initParams.exceptionHandler = new HippyExceptionHandlerAdapter() { // JavaScript执行异常