mirror of
https://github.com/status-im/react-native.git
synced 2025-02-27 16:40:38 +00:00
Move implementation of extracting bundles from assets to react/jni
Summary: Splits JSModulesUnbundle into interface+implementation. public Reviewed By: astreet Differential Revision: D2905186 fb-gh-sync-id: 3e621f7a7239d3f1e730334da2fe7cbeb17a1de4
This commit is contained in:
parent
52fcfc31cd
commit
cc926211b6
@ -39,7 +39,6 @@ react_library(
|
|||||||
force_static = True,
|
force_static = True,
|
||||||
srcs = [
|
srcs = [
|
||||||
'Bridge.cpp',
|
'Bridge.cpp',
|
||||||
'JSModulesUnbundle.cpp',
|
|
||||||
'Value.cpp',
|
'Value.cpp',
|
||||||
'MethodCall.cpp',
|
'MethodCall.cpp',
|
||||||
'JSCHelpers.cpp',
|
'JSCHelpers.cpp',
|
||||||
|
@ -37,7 +37,7 @@ void Bridge::executeApplicationScript(const std::string& script, const std::stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Bridge::loadApplicationUnbundle(
|
void Bridge::loadApplicationUnbundle(
|
||||||
JSModulesUnbundle&& unbundle,
|
std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
const std::string& startupCode,
|
const std::string& startupCode,
|
||||||
const std::string& sourceURL) {
|
const std::string& sourceURL) {
|
||||||
m_jsExecutor->loadApplicationUnbundle(std::move(unbundle), startupCode, sourceURL);
|
m_jsExecutor->loadApplicationUnbundle(std::move(unbundle), startupCode, sourceURL);
|
||||||
|
@ -59,7 +59,7 @@ public:
|
|||||||
* and injects each module as individual file.
|
* and injects each module as individual file.
|
||||||
*/
|
*/
|
||||||
void loadApplicationUnbundle(
|
void loadApplicationUnbundle(
|
||||||
JSModulesUnbundle&& unbundle,
|
std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
const std::string& startupCode,
|
const std::string& startupCode,
|
||||||
const std::string& sourceURL);
|
const std::string& sourceURL);
|
||||||
void setGlobalVariable(const std::string& propName, const std::string& jsonValue);
|
void setGlobalVariable(const std::string& propName, const std::string& jsonValue);
|
||||||
|
@ -39,7 +39,7 @@ public:
|
|||||||
* Add an application "unbundle" file
|
* Add an application "unbundle" file
|
||||||
*/
|
*/
|
||||||
virtual void loadApplicationUnbundle(
|
virtual void loadApplicationUnbundle(
|
||||||
JSModulesUnbundle&& bundle,
|
std::unique_ptr<JSModulesUnbundle> bundle,
|
||||||
const std::string& startupCode,
|
const std::string& startupCode,
|
||||||
const std::string& sourceURL) = 0;
|
const std::string& sourceURL) = 0;
|
||||||
|
|
||||||
|
@ -151,15 +151,13 @@ void JSCExecutor::executeApplicationScript(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JSCExecutor::loadApplicationUnbundle(
|
void JSCExecutor::loadApplicationUnbundle(
|
||||||
JSModulesUnbundle&& unbundle,
|
std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
const std::string& startupCode,
|
const std::string& startupCode,
|
||||||
const std::string& sourceURL) {
|
const std::string& sourceURL) {
|
||||||
|
if (!m_unbundle) {
|
||||||
m_unbundle = std::move(unbundle);
|
|
||||||
if (!m_isUnbundleInitialized) {
|
|
||||||
m_isUnbundleInitialized = true;
|
|
||||||
installGlobalFunction(m_context, "nativeRequire", nativeRequire);
|
installGlobalFunction(m_context, "nativeRequire", nativeRequire);
|
||||||
}
|
}
|
||||||
|
m_unbundle = std::move(unbundle);
|
||||||
executeApplicationScript(startupCode, sourceURL);
|
executeApplicationScript(startupCode, sourceURL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +240,7 @@ void JSCExecutor::flushQueueImmediate(std::string queueJSON) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void JSCExecutor::loadModule(uint32_t moduleId) {
|
void JSCExecutor::loadModule(uint32_t moduleId) {
|
||||||
auto module = m_unbundle.getModule(moduleId);
|
auto module = m_unbundle->getModule(moduleId);
|
||||||
auto sourceUrl = String::createExpectingAscii(module.name);
|
auto sourceUrl = String::createExpectingAscii(module.name);
|
||||||
auto source = String::createExpectingAscii(module.code);
|
auto source = String::createExpectingAscii(module.code);
|
||||||
evaluateScript(m_context, source, sourceUrl);
|
evaluateScript(m_context, source, sourceUrl);
|
||||||
|
@ -35,7 +35,7 @@ public:
|
|||||||
const std::string& script,
|
const std::string& script,
|
||||||
const std::string& sourceURL) override;
|
const std::string& sourceURL) override;
|
||||||
virtual void loadApplicationUnbundle(
|
virtual void loadApplicationUnbundle(
|
||||||
JSModulesUnbundle&& unbundle,
|
std::unique_ptr<JSModulesUnbundle> unbundle,
|
||||||
const std::string& startupCode,
|
const std::string& startupCode,
|
||||||
const std::string& sourceURL) override;
|
const std::string& sourceURL) override;
|
||||||
virtual std::string flush() override;
|
virtual std::string flush() override;
|
||||||
@ -66,10 +66,9 @@ private:
|
|||||||
FlushImmediateCallback m_flushImmediateCallback;
|
FlushImmediateCallback m_flushImmediateCallback;
|
||||||
std::unordered_map<int, JSCWebWorker> m_webWorkers;
|
std::unordered_map<int, JSCWebWorker> m_webWorkers;
|
||||||
std::unordered_map<int, Object> m_webWorkerJSObjs;
|
std::unordered_map<int, Object> m_webWorkerJSObjs;
|
||||||
JSModulesUnbundle m_unbundle;
|
|
||||||
bool m_isUnbundleInitialized = false;
|
|
||||||
std::shared_ptr<MessageQueueThread> m_messageQueueThread;
|
std::shared_ptr<MessageQueueThread> m_messageQueueThread;
|
||||||
std::string m_deviceCacheDir;
|
std::string m_deviceCacheDir;
|
||||||
|
std::unique_ptr<JSModulesUnbundle> m_unbundle;
|
||||||
|
|
||||||
int addWebWorker(const std::string& script, JSValueRef workerRef);
|
int addWebWorker(const std::string& script, JSValueRef workerRef);
|
||||||
void postMessageToWebWorker(int worker, JSValueRef message, JSValueRef *exn);
|
void postMessageToWebWorker(int worker, JSValueRef message, JSValueRef *exn);
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <android/asset_manager.h>
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <fb/noncopyable.h>
|
#include <fb/noncopyable.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -15,7 +14,6 @@ class JSModulesUnbundle : noncopyable {
|
|||||||
/**
|
/**
|
||||||
* Represents the set of JavaScript modules that the application consists of.
|
* Represents the set of JavaScript modules that the application consists of.
|
||||||
* The source code of each module can be retrieved by module ID.
|
* The source code of each module can be retrieved by module ID.
|
||||||
* This implementation reads modules as single file from the assets of an apk.
|
|
||||||
*
|
*
|
||||||
* The class is non-copyable because copying instances might involve copying
|
* The class is non-copyable because copying instances might involve copying
|
||||||
* several megabytes of memory.
|
* several megabytes of memory.
|
||||||
@ -28,20 +26,8 @@ public:
|
|||||||
std::string name;
|
std::string name;
|
||||||
std::string code;
|
std::string code;
|
||||||
};
|
};
|
||||||
|
virtual ~JSModulesUnbundle() {}
|
||||||
JSModulesUnbundle() = default;
|
virtual Module getModule(uint32_t moduleId) const = 0;
|
||||||
JSModulesUnbundle(AAssetManager *assetManager, const std::string& entryFile);
|
|
||||||
JSModulesUnbundle(JSModulesUnbundle&& other) noexcept;
|
|
||||||
JSModulesUnbundle& operator= (JSModulesUnbundle&& other) noexcept;
|
|
||||||
|
|
||||||
static bool isUnbundle(
|
|
||||||
AAssetManager *assetManager,
|
|
||||||
const std::string& assetName);
|
|
||||||
Module getModule(uint32_t moduleId) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
AAssetManager *m_assetManager = nullptr;
|
|
||||||
std::string m_moduleDirectory;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,7 @@ jni_library(
|
|||||||
'JMessageQueueThread.cpp',
|
'JMessageQueueThread.cpp',
|
||||||
'JSCPerfLogging.cpp',
|
'JSCPerfLogging.cpp',
|
||||||
'JSLoader.cpp',
|
'JSLoader.cpp',
|
||||||
|
'JniJSModulesUnbundle.cpp',
|
||||||
'NativeArray.cpp',
|
'NativeArray.cpp',
|
||||||
'OnLoad.cpp',
|
'OnLoad.cpp',
|
||||||
'ProxyExecutor.cpp',
|
'ProxyExecutor.cpp',
|
||||||
@ -41,6 +42,7 @@ jni_library(
|
|||||||
'ProxyExecutor.h',
|
'ProxyExecutor.h',
|
||||||
'JMessageQueueThread.h',
|
'JMessageQueueThread.h',
|
||||||
'JNativeRunnable.h',
|
'JNativeRunnable.h',
|
||||||
|
'JniJSModulesUnbundle.h',
|
||||||
'JSCPerfLogging.h',
|
'JSCPerfLogging.h',
|
||||||
'JSLogging.h',
|
'JSLogging.h',
|
||||||
],
|
],
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Copyright 2004-present Facebook. All Rights Reserved.
|
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||||
|
|
||||||
#include "JSModulesUnbundle.h"
|
#include "JniJSModulesUnbundle.h"
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <fb/assert.h>
|
#include <fb/assert.h>
|
||||||
@ -36,22 +36,11 @@ static asset_ptr openAsset(
|
|||||||
AAsset_close);
|
AAsset_close);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSModulesUnbundle::JSModulesUnbundle(AAssetManager *assetManager, const std::string& entryFile) :
|
JniJSModulesUnbundle::JniJSModulesUnbundle(AAssetManager *assetManager, const std::string& entryFile) :
|
||||||
m_assetManager(assetManager),
|
m_assetManager(assetManager),
|
||||||
m_moduleDirectory(jsModulesDir(entryFile)) {}
|
m_moduleDirectory(jsModulesDir(entryFile)) {}
|
||||||
|
|
||||||
JSModulesUnbundle::JSModulesUnbundle(JSModulesUnbundle&& other) noexcept {
|
bool JniJSModulesUnbundle::isUnbundle(
|
||||||
*this = std::move(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSModulesUnbundle& JSModulesUnbundle::operator= (JSModulesUnbundle&& other) noexcept {
|
|
||||||
std::swap(m_assetManager, other.m_assetManager);
|
|
||||||
std::swap(m_moduleDirectory, other.m_moduleDirectory);
|
|
||||||
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool JSModulesUnbundle::isUnbundle(
|
|
||||||
AAssetManager *assetManager,
|
AAssetManager *assetManager,
|
||||||
const std::string& assetName) {
|
const std::string& assetName) {
|
||||||
if (!assetManager) {
|
if (!assetManager) {
|
||||||
@ -69,7 +58,7 @@ bool JSModulesUnbundle::isUnbundle(
|
|||||||
return fileHeader == htole32(MAGIC_FILE_HEADER);
|
return fileHeader == htole32(MAGIC_FILE_HEADER);
|
||||||
}
|
}
|
||||||
|
|
||||||
JSModulesUnbundle::Module JSModulesUnbundle::getModule(uint32_t moduleId) const {
|
JSModulesUnbundle::Module JniJSModulesUnbundle::getModule(uint32_t moduleId) const {
|
||||||
// can be nullptr for default constructor.
|
// can be nullptr for default constructor.
|
||||||
FBASSERTMSGF(m_assetManager != nullptr, "Unbundle has not been initialized with an asset manager");
|
FBASSERTMSGF(m_assetManager != nullptr, "Unbundle has not been initialized with an asset manager");
|
||||||
|
|
31
ReactAndroid/src/main/jni/react/jni/JniJSModulesUnbundle.h
Normal file
31
ReactAndroid/src/main/jni/react/jni/JniJSModulesUnbundle.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// Copyright 2004-present Facebook. All Rights Reserved.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <android/asset_manager.h>
|
||||||
|
#include <react/JSModulesUnbundle.h>
|
||||||
|
|
||||||
|
namespace facebook {
|
||||||
|
namespace react {
|
||||||
|
|
||||||
|
class JniJSModulesUnbundle : public JSModulesUnbundle {
|
||||||
|
/**
|
||||||
|
* This implementation reads modules as single file from the assets of an apk.
|
||||||
|
*/
|
||||||
|
public:
|
||||||
|
JniJSModulesUnbundle() = default;
|
||||||
|
JniJSModulesUnbundle(AAssetManager *assetManager, const std::string& entryFile);
|
||||||
|
JniJSModulesUnbundle(JniJSModulesUnbundle&& other) = delete;
|
||||||
|
JniJSModulesUnbundle& operator= (JSModulesUnbundle&& other) = delete;
|
||||||
|
|
||||||
|
static bool isUnbundle(
|
||||||
|
AAssetManager *assetManager,
|
||||||
|
const std::string& assetName);
|
||||||
|
virtual Module getModule(uint32_t moduleId) const override;
|
||||||
|
private:
|
||||||
|
AAssetManager *m_assetManager = nullptr;
|
||||||
|
std::string m_moduleDirectory;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -22,6 +22,7 @@
|
|||||||
#include "ProxyExecutor.h"
|
#include "ProxyExecutor.h"
|
||||||
#include "OnLoad.h"
|
#include "OnLoad.h"
|
||||||
#include "JMessageQueueThread.h"
|
#include "JMessageQueueThread.h"
|
||||||
|
#include "JniJSModulesUnbundle.h"
|
||||||
#include "JSLogging.h"
|
#include "JSLogging.h"
|
||||||
#include "JSCPerfLogging.h"
|
#include "JSCPerfLogging.h"
|
||||||
#include "WebWorkers.h"
|
#include "WebWorkers.h"
|
||||||
@ -668,7 +669,8 @@ static void loadApplicationUnbundle(
|
|||||||
try {
|
try {
|
||||||
// Load the application unbundle and collect/dispatch any native calls that might have occured
|
// Load the application unbundle and collect/dispatch any native calls that might have occured
|
||||||
bridge->loadApplicationUnbundle(
|
bridge->loadApplicationUnbundle(
|
||||||
JSModulesUnbundle(assetManager, startupFileName),
|
std::unique_ptr<JSModulesUnbundle>(
|
||||||
|
new JniJSModulesUnbundle(assetManager, startupFileName)),
|
||||||
startupCode,
|
startupCode,
|
||||||
startupFileName);
|
startupFileName);
|
||||||
bridge->flush();
|
bridge->flush();
|
||||||
@ -693,7 +695,7 @@ static void loadScriptFromAssets(JNIEnv* env, jobject obj, jobject assetManager,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromAssets_read"));
|
env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromAssets_read"));
|
||||||
if (JSModulesUnbundle::isUnbundle(manager, assetNameStr)) {
|
if (JniJSModulesUnbundle::isUnbundle(manager, assetNameStr)) {
|
||||||
loadApplicationUnbundle(bridge, manager, script, assetNameStr);
|
loadApplicationUnbundle(bridge, manager, script, assetNameStr);
|
||||||
} else {
|
} else {
|
||||||
executeApplicationScript(bridge, script, assetNameStr);
|
executeApplicationScript(bridge, script, assetNameStr);
|
||||||
|
@ -51,7 +51,7 @@ void ProxyExecutor::executeApplicationScript(
|
|||||||
jni::make_jstring(sourceURL).get());
|
jni::make_jstring(sourceURL).get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProxyExecutor::loadApplicationUnbundle(JSModulesUnbundle&&, const std::string&, const std::string&) {
|
void ProxyExecutor::loadApplicationUnbundle(std::unique_ptr<JSModulesUnbundle>, const std::string&, const std::string&) {
|
||||||
jni::throwNewJavaException(
|
jni::throwNewJavaException(
|
||||||
"java/lang/UnsupportedOperationException",
|
"java/lang/UnsupportedOperationException",
|
||||||
"Loading application unbundles is not supported for proxy executors");
|
"Loading application unbundles is not supported for proxy executors");
|
||||||
|
@ -34,7 +34,7 @@ public:
|
|||||||
const std::string& script,
|
const std::string& script,
|
||||||
const std::string& sourceURL) override;
|
const std::string& sourceURL) override;
|
||||||
virtual void loadApplicationUnbundle(
|
virtual void loadApplicationUnbundle(
|
||||||
JSModulesUnbundle&& bundle,
|
std::unique_ptr<JSModulesUnbundle> bundle,
|
||||||
const std::string& startupCode,
|
const std::string& startupCode,
|
||||||
const std::string& sourceURL) override;
|
const std::string& sourceURL) override;
|
||||||
virtual std::string flush() override;
|
virtual std::string flush() override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user