mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-09 22:43:10 +08:00
Reviewed By: davidaurelio, tadeuzagallo Differential Revision: D3563710 fbshipit-source-id: 2b0a982d388ee5f44b806f8e561ef49a3fd8c8ca
113 lines
3.6 KiB
Java
113 lines
3.6 KiB
Java
/**
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
package com.facebook.react.cxxbridge;
|
|
|
|
import android.content.Context;
|
|
|
|
import com.facebook.react.devsupport.DebugServerException;
|
|
import com.facebook.react.devsupport.DevServerHelper;
|
|
|
|
import java.io.File;
|
|
|
|
/**
|
|
* A class that stores JS bundle information and allows {@link CatalystInstance} to load a correct
|
|
* bundle through {@link ReactBridge}.
|
|
*/
|
|
public abstract class JSBundleLoader {
|
|
|
|
/**
|
|
* This loader is recommended one for release version of your app. In that case local JS executor
|
|
* should be used. JS bundle will be read from assets directory in native code to save on passing
|
|
* large strings from java to native memory.
|
|
*/
|
|
public static JSBundleLoader createFileLoader(
|
|
final Context context,
|
|
final String fileName) {
|
|
return new JSBundleLoader() {
|
|
@Override
|
|
public void loadScript(CatalystInstanceImpl instance) {
|
|
if (fileName.startsWith("assets://")) {
|
|
instance.loadScriptFromAssets(context.getAssets(), fileName);
|
|
} else {
|
|
instance.loadScriptFromFile(fileName, fileName);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getSourceUrl() {
|
|
return fileName;
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This loader is used when bundle gets reloaded from dev server. In that case loader expect JS
|
|
* bundle to be prefetched and stored in local file. We do that to avoid passing large strings
|
|
* between java and native code and avoid allocating memory in java to fit whole JS bundle in it.
|
|
* Providing correct {@param sourceURL} of downloaded bundle is required for JS stacktraces to
|
|
* work correctly and allows for source maps to correctly symbolize those.
|
|
*/
|
|
public static JSBundleLoader createCachedBundleFromNetworkLoader(
|
|
final String sourceURL,
|
|
final String cachedFileLocation) {
|
|
return new JSBundleLoader() {
|
|
@Override
|
|
public void loadScript(CatalystInstanceImpl instance) {
|
|
try {
|
|
instance.loadScriptFromFile(cachedFileLocation, sourceURL);
|
|
} catch (Exception e) {
|
|
throw DebugServerException.makeGeneric(e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getSourceUrl() {
|
|
return sourceURL;
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This loader is used when proxy debugging is enabled. In that case there is no point in fetching
|
|
* the bundle from device as remote executor will have to do it anyway.
|
|
*/
|
|
public static JSBundleLoader createRemoteDebuggerBundleLoader(
|
|
final String proxySourceURL,
|
|
final String realSourceURL) {
|
|
return new JSBundleLoader() {
|
|
@Override
|
|
public void loadScript(CatalystInstanceImpl instance) {
|
|
instance.loadScriptFromFile(null, proxySourceURL);
|
|
}
|
|
|
|
@Override
|
|
public String getSourceUrl() {
|
|
return realSourceURL;
|
|
}
|
|
};
|
|
}
|
|
|
|
public static JSBundleLoader createUnpackingBundleLoader(
|
|
final Context context,
|
|
final String sourceURL,
|
|
final String bundleName) {
|
|
return UnpackingJSBundleLoader.newBuilder()
|
|
.setContext(context)
|
|
.setSourceURL(sourceURL)
|
|
.setDestinationPath(new File(context.getFilesDir(), "optimized-bundle"))
|
|
.checkAndUnpackFile(bundleName + ".meta", "bundle.meta")
|
|
.unpackFile(bundleName, "bundle.js")
|
|
.build();
|
|
}
|
|
|
|
public abstract void loadScript(CatalystInstanceImpl instance);
|
|
public abstract String getSourceUrl();
|
|
}
|