diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java index 9e00799a69..f185118e86 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/NativeModuleRegistry.java @@ -84,6 +84,8 @@ public class NativeModuleRegistry { /* package */ void notifyCatalystInstanceInitialized() { UiThreadUtil.assertOnUiThread(); + + ReactMarker.logMarker("NativeModule_start"); Systrace.beginSection( Systrace.TRACE_TAG_REACT_JAVA_BRIDGE, "NativeModuleRegistry_notifyCatalystInstanceInitialized"); @@ -93,6 +95,7 @@ public class NativeModuleRegistry { } } finally { Systrace.endSection(Systrace.TRACE_TAG_REACT_JAVA_BRIDGE); + ReactMarker.logMarker("NativeModule_end"); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarker.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarker.java new file mode 100644 index 0000000000..16eaa513f6 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/ReactMarker.java @@ -0,0 +1,30 @@ +// Copyright 2004-present Facebook. All Rights Reserved. + +package com.facebook.react.bridge; + +import javax.annotation.Nullable; +import com.facebook.proguard.annotations.DoNotStrip; +/** + * Static class that allows markers to be placed in React code and responded to in a + * configurable way + */ +public class ReactMarker { + + public interface MarkerListener { + void logMarker(String name); + }; + + @Nullable static private MarkerListener sMarkerListener = null; + + static public void setMarkerListener(MarkerListener listener) { + sMarkerListener = listener; + } + + @DoNotStrip + static public void logMarker(String name) { + if (sMarkerListener != null) { + sMarkerListener.logMarker(name); + } + } + +} diff --git a/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp b/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp index cd537c7dde..2ee64145df 100644 --- a/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp +++ b/ReactAndroid/src/main/jni/react/jni/OnLoad.cpp @@ -552,6 +552,7 @@ namespace bridge { static jmethodID gCallbackMethod; static jmethodID gOnBatchCompleteMethod; +static jmethodID gLogMarkerMethod; static void makeJavaCall(JNIEnv* env, jobject callback, MethodCall&& call) { if (call.arguments.isNull()) { @@ -619,21 +620,31 @@ static void create(JNIEnv* env, jobject obj, jobject executor, jobject callback, static void loadScriptFromAssets(JNIEnv* env, jobject obj, jobject assetManager, jstring assetName) { + jclass markerClass = env->FindClass("com/facebook/react/bridge/ReactMarker"); + auto bridge = extractRefPtr(env, obj); auto assetNameStr = fromJString(env, assetName); + + env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromNetworkCached_start")); auto script = react::loadScriptFromAssets(env, assetManager, assetNameStr); #ifdef WITH_FBSYSTRACE FbSystraceSection s(TRACE_TAG_REACT_CXX_BRIDGE, "reactbridge_jni_" "executeApplicationScript", "assetName", assetNameStr); #endif + + env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromNetworkCached_read")); bridge->executeApplicationScript(script, assetNameStr); + env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromNetworkCached_done")); } static void loadScriptFromNetworkCached(JNIEnv* env, jobject obj, jstring sourceURL, jstring tempFileName) { + jclass markerClass = env->FindClass("com/facebook/react/bridge/ReactMarker"); + auto bridge = jni::extractRefPtr(env, obj); std::string script = ""; + env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromNetworkCached_start")); if (tempFileName != NULL) { script = react::loadScriptFromFile(jni::fromJString(env, tempFileName)); } @@ -643,7 +654,9 @@ static void loadScriptFromNetworkCached(JNIEnv* env, jobject obj, jstring source "executeApplicationScript", "sourceURL", sourceURLStr); #endif + env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromNetworkCached_read")); bridge->executeApplicationScript(script, jni::fromJString(env, sourceURL)); + env->CallStaticVoidMethod(markerClass, gLogMarkerMethod, env->NewStringUTF("loadScriptFromNetworkCached_exec")); } static void callFunction(JNIEnv* env, jobject obj, jint moduleId, jint methodId, @@ -787,6 +800,9 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { bridge::gCallbackMethod = env->GetMethodID(callbackClass, "call", "(IILcom/facebook/react/bridge/ReadableNativeArray;)V"); bridge::gOnBatchCompleteMethod = env->GetMethodID(callbackClass, "onBatchComplete", "()V"); + jclass markerClass = env->FindClass("com/facebook/react/bridge/ReactMarker"); + bridge::gLogMarkerMethod = env->GetStaticMethodID(markerClass, "logMarker", "(Ljava/lang/String;)V"); + registerNatives("com/facebook/react/bridge/ReactBridge", { makeNativeMethod("initialize", "(Lcom/facebook/react/bridge/JavaScriptExecutor;Lcom/facebook/react/bridge/ReactCallback;Lcom/facebook/react/bridge/queue/MessageQueueThread;)V", bridge::create), makeNativeMethod(