mirror of
https://github.com/status-im/react-native.git
synced 2025-02-24 15:18:10 +00:00
Drop JSC code on background
Reviewed By: lexs Differential Revision: D3311037 fbshipit-source-id: e46559108c51f1cd163ed5c557d23c21f696ef88
This commit is contained in:
parent
bdab834036
commit
f948662013
@ -20,6 +20,7 @@ import static android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;
|
||||
import static android.content.ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
|
||||
import static android.content.ComponentCallbacks2.TRIM_MEMORY_MODERATE;
|
||||
import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
|
||||
import static android.content.ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN;
|
||||
|
||||
/**
|
||||
* Translates and routes memory pressure events to the current catalyst instance.
|
||||
@ -27,6 +28,8 @@ import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
|
||||
public class MemoryPressureRouter {
|
||||
// Trigger this by sending an intent to your activity with adb shell:
|
||||
// am broadcast -a com.facebook.catalyst.ACTION_TRIM_MEMORY_MODERATE
|
||||
private static final String ACTION_TRIM_MEMORY_UI_HIDDEN =
|
||||
"com.facebook.rnfeed.ACTION_TRIM_MEMORY_UI_HIDDEN";
|
||||
private static final String ACTION_TRIM_MEMORY_MODERATE =
|
||||
"com.facebook.rnfeed.ACTION_TRIM_MEMORY_MODERATE";
|
||||
private static final String ACTION_TRIM_MEMORY_CRITICAL =
|
||||
@ -52,6 +55,9 @@ public class MemoryPressureRouter {
|
||||
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
|
||||
public static boolean handleDebugIntent(Application application, String action) {
|
||||
switch (action) {
|
||||
case ACTION_TRIM_MEMORY_UI_HIDDEN:
|
||||
simulateTrimMemory(application, ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
|
||||
break;
|
||||
case ACTION_TRIM_MEMORY_MODERATE:
|
||||
simulateTrimMemory(application, TRIM_MEMORY_MODERATE);
|
||||
break;
|
||||
@ -87,10 +93,12 @@ public class MemoryPressureRouter {
|
||||
}
|
||||
|
||||
private void trimMemory(int level) {
|
||||
if (level >= ComponentCallbacks2.TRIM_MEMORY_COMPLETE) {
|
||||
if (level >= TRIM_MEMORY_COMPLETE) {
|
||||
dispatchMemoryPressure(MemoryPressure.CRITICAL);
|
||||
} else if (level >= TRIM_MEMORY_BACKGROUND || level == TRIM_MEMORY_RUNNING_CRITICAL) {
|
||||
dispatchMemoryPressure(MemoryPressure.MODERATE);
|
||||
} else if (level == TRIM_MEMORY_UI_HIDDEN) {
|
||||
dispatchMemoryPressure(MemoryPressure.UI_HIDDEN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
package com.facebook.react.bridge;
|
||||
|
||||
public enum MemoryPressure {
|
||||
UI_HIDDEN,
|
||||
MODERATE,
|
||||
CRITICAL
|
||||
}
|
||||
|
@ -58,6 +58,9 @@ public class ReactBridge extends Countable {
|
||||
|
||||
public void handleMemoryPressure(MemoryPressure level) {
|
||||
switch (level) {
|
||||
case UI_HIDDEN:
|
||||
handleMemoryPressureUiHidden();
|
||||
break;
|
||||
case MODERATE:
|
||||
handleMemoryPressureModerate();
|
||||
break;
|
||||
@ -86,6 +89,7 @@ public class ReactBridge extends Countable {
|
||||
public native void startProfiler(String title);
|
||||
public native void stopProfiler(String title, String filename);
|
||||
public native ExecutorToken getMainExecutorToken();
|
||||
private native void handleMemoryPressureUiHidden();
|
||||
private native void handleMemoryPressureModerate();
|
||||
private native void handleMemoryPressureCritical();
|
||||
public native void destroy();
|
||||
|
@ -289,8 +289,26 @@ public class CatalystInstanceImpl implements CatalystInstance {
|
||||
return mJavaRegistry.getAllModules();
|
||||
}
|
||||
|
||||
private native void handleMemoryPressureUiHidden();
|
||||
private native void handleMemoryPressureModerate();
|
||||
private native void handleMemoryPressureCritical();
|
||||
|
||||
@Override
|
||||
public void handleMemoryPressure(MemoryPressure level) {
|
||||
if (mDestroyed) {
|
||||
return;
|
||||
}
|
||||
switch(level) {
|
||||
case UI_HIDDEN:
|
||||
handleMemoryPressureUiHidden();
|
||||
break;
|
||||
case MODERATE:
|
||||
handleMemoryPressureModerate();
|
||||
break;
|
||||
case CRITICAL:
|
||||
handleMemoryPressureCritical();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -127,6 +127,12 @@ void Bridge::stopProfiler(const std::string& title, const std::string& filename)
|
||||
});
|
||||
}
|
||||
|
||||
void Bridge::handleMemoryPressureUiHidden() {
|
||||
runOnExecutorQueue(*m_mainExecutorToken, [=] (JSExecutor* executor) {
|
||||
executor->handleMemoryPressureUiHidden();
|
||||
});
|
||||
}
|
||||
|
||||
void Bridge::handleMemoryPressureModerate() {
|
||||
runOnExecutorQueue(*m_mainExecutorToken, [=] (JSExecutor* executor) {
|
||||
executor->handleMemoryPressureModerate();
|
||||
|
@ -96,6 +96,7 @@ public:
|
||||
bool supportsProfiling();
|
||||
void startProfiler(const std::string& title);
|
||||
void stopProfiler(const std::string& title, const std::string& filename);
|
||||
void handleMemoryPressureUiHidden();
|
||||
void handleMemoryPressureModerate();
|
||||
void handleMemoryPressureCritical();
|
||||
|
||||
|
@ -68,6 +68,7 @@ public:
|
||||
};
|
||||
virtual void startProfiler(const std::string &titleString) {};
|
||||
virtual void stopProfiler(const std::string &titleString, const std::string &filename) {};
|
||||
virtual void handleMemoryPressureUiHidden() {};
|
||||
virtual void handleMemoryPressureModerate() {};
|
||||
virtual void handleMemoryPressureCritical() {
|
||||
handleMemoryPressureModerate();
|
||||
|
@ -363,6 +363,12 @@ void JSCExecutor::stopProfiler(const std::string &titleString, const std::string
|
||||
#endif
|
||||
}
|
||||
|
||||
void JSCExecutor::handleMemoryPressureUiHidden() {
|
||||
#ifdef WITH_JSC_MEMORY_PRESSURE
|
||||
JSHandleMemoryPressure(this, m_context, JSMemoryPressure::UI_HIDDEN);
|
||||
#endif
|
||||
}
|
||||
|
||||
void JSCExecutor::handleMemoryPressureModerate() {
|
||||
#ifdef WITH_JSC_MEMORY_PRESSURE
|
||||
JSHandleMemoryPressure(this, m_context, JSMemoryPressure::MODERATE);
|
||||
|
@ -71,6 +71,7 @@ public:
|
||||
virtual bool supportsProfiling() override;
|
||||
virtual void startProfiler(const std::string &titleString) override;
|
||||
virtual void stopProfiler(const std::string &titleString, const std::string &filename) override;
|
||||
virtual void handleMemoryPressureUiHidden() override;
|
||||
virtual void handleMemoryPressureModerate() override;
|
||||
virtual void handleMemoryPressureCritical() override;
|
||||
virtual void destroy() override;
|
||||
|
@ -839,6 +839,12 @@ static void stopProfiler(JNIEnv* env, jobject obj, jstring title, jstring filena
|
||||
bridge->stopProfiler(fromJString(env, title), fromJString(env, filename));
|
||||
}
|
||||
|
||||
static void handleMemoryPressureUiHidden(JNIEnv* env, jobject obj) {
|
||||
LOG(WARNING) << "handleMemoryPressureUiHidden";
|
||||
auto bridge = extractRefPtr<CountableBridge>(env, obj);
|
||||
bridge->handleMemoryPressureUiHidden();
|
||||
}
|
||||
|
||||
static void handleMemoryPressureModerate(JNIEnv* env, jobject obj) {
|
||||
auto bridge = extractRefPtr<CountableBridge>(env, obj);
|
||||
bridge->handleMemoryPressureModerate();
|
||||
@ -1029,6 +1035,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
|
||||
makeNativeMethod("supportsProfiling", bridge::supportsProfiling),
|
||||
makeNativeMethod("startProfiler", bridge::startProfiler),
|
||||
makeNativeMethod("stopProfiler", bridge::stopProfiler),
|
||||
makeNativeMethod("handleMemoryPressureUiHidden", bridge::handleMemoryPressureUiHidden),
|
||||
makeNativeMethod("handleMemoryPressureModerate", bridge::handleMemoryPressureModerate),
|
||||
makeNativeMethod("handleMemoryPressureCritical", bridge::handleMemoryPressureCritical),
|
||||
makeNativeMethod("getJavaScriptContextNativePtrExperimental", bridge::getJavaScriptContext),
|
||||
|
@ -106,6 +106,9 @@ void CatalystInstanceImpl::registerNatives() {
|
||||
makeNativeMethod("callJSCallback", CatalystInstanceImpl::callJSCallback),
|
||||
makeNativeMethod("getMainExecutorToken", CatalystInstanceImpl::getMainExecutorToken),
|
||||
makeNativeMethod("setGlobalVariable", CatalystInstanceImpl::setGlobalVariable),
|
||||
makeNativeMethod("handleMemoryPressureUiHidden", CatalystInstanceImpl::handleMemoryPressureUiHidden),
|
||||
makeNativeMethod("handleMemoryPressureModerate", CatalystInstanceImpl::handleMemoryPressureModerate),
|
||||
makeNativeMethod("handleMemoryPressureCritical", CatalystInstanceImpl::handleMemoryPressureCritical),
|
||||
makeNativeMethod("supportsProfiling", CatalystInstanceImpl::supportsProfiling),
|
||||
makeNativeMethod("startProfiler", CatalystInstanceImpl::startProfiler),
|
||||
makeNativeMethod("stopProfiler", CatalystInstanceImpl::stopProfiler),
|
||||
@ -204,6 +207,18 @@ void CatalystInstanceImpl::setGlobalVariable(std::string propName,
|
||||
folly::make_unique<JSBigStdString>(std::move(jsonValue)));
|
||||
}
|
||||
|
||||
void CatalystInstanceImpl::handleMemoryPressureUiHidden() {
|
||||
instance_->handleMemoryPressureUiHidden();
|
||||
}
|
||||
|
||||
void CatalystInstanceImpl::handleMemoryPressureModerate() {
|
||||
instance_->handleMemoryPressureModerate();
|
||||
}
|
||||
|
||||
void CatalystInstanceImpl::handleMemoryPressureCritical() {
|
||||
instance_->handleMemoryPressureCritical();
|
||||
}
|
||||
|
||||
jboolean CatalystInstanceImpl::supportsProfiling() {
|
||||
if (!instance_) {
|
||||
return false;
|
||||
|
@ -55,6 +55,9 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
|
||||
local_ref<JExecutorToken::JavaPart> getMainExecutorToken();
|
||||
void setGlobalVariable(std::string propName,
|
||||
std::string&& jsonValue);
|
||||
void handleMemoryPressureUiHidden();
|
||||
void handleMemoryPressureModerate();
|
||||
void handleMemoryPressureCritical();
|
||||
jboolean supportsProfiling();
|
||||
void startProfiler(const std::string& title);
|
||||
void stopProfiler(const std::string& title, const std::string& filename);
|
||||
|
@ -168,6 +168,7 @@ public:
|
||||
}
|
||||
virtual void startProfiler(const std::string &titleString) {}
|
||||
virtual void stopProfiler(const std::string &titleString, const std::string &filename) {}
|
||||
virtual void handleMemoryPressureUiHidden() {}
|
||||
virtual void handleMemoryPressureModerate() {}
|
||||
virtual void handleMemoryPressureCritical() {
|
||||
handleMemoryPressureModerate();
|
||||
|
@ -118,5 +118,17 @@ ExecutorToken Instance::getMainExecutorToken() {
|
||||
return nativeToJsBridge_->getMainExecutorToken();
|
||||
}
|
||||
|
||||
void Instance::handleMemoryPressureUiHidden() {
|
||||
nativeToJsBridge_->handleMemoryPressureUiHidden();
|
||||
}
|
||||
|
||||
void Instance::handleMemoryPressureModerate() {
|
||||
nativeToJsBridge_->handleMemoryPressureModerate();
|
||||
}
|
||||
|
||||
void Instance::handleMemoryPressureCritical() {
|
||||
nativeToJsBridge_->handleMemoryPressureCritical();
|
||||
}
|
||||
|
||||
} // namespace react
|
||||
} // namespace facebook
|
||||
|
@ -50,6 +50,9 @@ class Instance {
|
||||
MethodCallResult callSerializableNativeHook(ExecutorToken token, unsigned int moduleId,
|
||||
unsigned int methodId, folly::dynamic&& args);
|
||||
ExecutorToken getMainExecutorToken();
|
||||
void handleMemoryPressureUiHidden();
|
||||
void handleMemoryPressureModerate();
|
||||
void handleMemoryPressureCritical();
|
||||
|
||||
private:
|
||||
void callNativeModules(ExecutorToken token, const std::string& calls, bool isEndOfBatch);
|
||||
|
@ -371,6 +371,12 @@ void JSCExecutor::stopProfiler(const std::string &titleString, const std::string
|
||||
#endif
|
||||
}
|
||||
|
||||
void JSCExecutor::handleMemoryPressureUiHidden() {
|
||||
#ifdef WITH_JSC_MEMORY_PRESSURE
|
||||
JSHandleMemoryPressure(this, m_context, JSMemoryPressure::UI_HIDDEN);
|
||||
#endif
|
||||
}
|
||||
|
||||
void JSCExecutor::handleMemoryPressureModerate() {
|
||||
#ifdef WITH_JSC_MEMORY_PRESSURE
|
||||
JSHandleMemoryPressure(this, m_context, JSMemoryPressure::MODERATE);
|
||||
|
@ -74,6 +74,7 @@ public:
|
||||
virtual bool supportsProfiling() override;
|
||||
virtual void startProfiler(const std::string &titleString) override;
|
||||
virtual void stopProfiler(const std::string &titleString, const std::string &filename) override;
|
||||
virtual void handleMemoryPressureUiHidden() override;
|
||||
virtual void handleMemoryPressureModerate() override;
|
||||
virtual void handleMemoryPressureCritical() override;
|
||||
virtual void destroy() override;
|
||||
|
@ -226,6 +226,12 @@ void NativeToJsBridge::stopProfiler(const std::string& title, const std::string&
|
||||
});
|
||||
}
|
||||
|
||||
void NativeToJsBridge::handleMemoryPressureUiHidden() {
|
||||
runOnExecutorQueue(m_mainExecutorToken, [=] (JSExecutor* executor) {
|
||||
executor->handleMemoryPressureUiHidden();
|
||||
});
|
||||
}
|
||||
|
||||
void NativeToJsBridge::handleMemoryPressureModerate() {
|
||||
runOnExecutorQueue(m_mainExecutorToken, [=] (JSExecutor* executor) {
|
||||
executor->handleMemoryPressureModerate();
|
||||
|
@ -101,6 +101,7 @@ public:
|
||||
bool supportsProfiling();
|
||||
void startProfiler(const std::string& title);
|
||||
void stopProfiler(const std::string& title, const std::string& filename);
|
||||
void handleMemoryPressureUiHidden();
|
||||
void handleMemoryPressureModerate();
|
||||
void handleMemoryPressureCritical();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user