Skip to content

Commit 41d948c

Browse files
RSNarafacebook-github-bot
authored andcommitted
Introduce TurboModulePerfLogger Java class
Summary: We need to instrument the following markers for TurboModules in Java: - **Java:** moduleDataCreate - **Java:** moduleCreate **Problem:** Perf-logging can be on or off in production. This means that we have to guard every perf-logger call, which can be a bit tedious. Therefore, this diff introduces a Java class called `TurboModulePerfLogger`, which: 1. Enables perf-logging by accepting a `NativeModulePerfLogger` `jni::HybridObject` in its `enableLogging` method. 2. Exposes static methods that call into the `NativeModulePerfLogger`'s Java part, when perf-logging is enabled. We actually have C++ markers as well: - **C++:** moduleJSRequireBeginning - **C++:** moduleJSRequireEnding - **C++:** syncMethodCall - **C++:** asyncMethodCall - **C++:** asyncMethodCallExecution Therefore, `TurboModulePerfLogger.java` also calls its native method `jniEnableCppLogging` to setup C++ TurboModule perf-logging. TurboModule C++ logging is done via a similar setup (to Java), using `TurboModulePerfLogger.cpp`. The `jniEnableCppLogging` native method calls into `TurboModulePerfLogger::enableLogging` with the C++ part of `NativeModulePerfLogger`. Then, the TurboModules C++ infra uses the static methods on `TurboModulePerfLogger.cpp` to start/end markers. Changelog: [Internal] Reviewed By: PeteTheHeat Differential Revision: D22444246 fbshipit-source-id: 66f191056cdcf5d7932ff1916a1de70b82e5f32b
1 parent c0dd11e commit 41d948c

6 files changed

Lines changed: 101 additions & 1 deletion

File tree

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/BUCK

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ rn_android_library(
2222
react_native_dep("third-party/java/infer-annotations:infer-annotations"),
2323
react_native_dep("third-party/java/jsr-305:jsr-305"),
2424
react_native_target("java/com/facebook/react/common:common"),
25+
react_native_target("java/com/facebook/react/reactperflogger:reactperflogger"),
2526
react_native_target("java/com/facebook/react/turbomodule/core/jni:jni"),
2627
react_native_target("java/com/facebook/debug/holder:holder"),
2728
react_native_target("java/com/facebook/react/bridge:interfaces"),
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright (c) Facebook, Inc. and its affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.facebook.react.turbomodule.core;
9+
10+
import com.facebook.react.perflogger.NativeModulePerfLogger;
11+
import com.facebook.soloader.SoLoader;
12+
import javax.annotation.Nullable;
13+
14+
public class TurboModulePerfLogger {
15+
@Nullable private static NativeModulePerfLogger sNativeModulePerfLogger = null;
16+
17+
static {
18+
SoLoader.loadLibrary("turbomodulejsijni");
19+
}
20+
21+
public static void moduleDataCreateStart(String moduleName, int id) {
22+
if (sNativeModulePerfLogger != null) {
23+
sNativeModulePerfLogger.moduleDataCreateStart(moduleName, id);
24+
}
25+
}
26+
27+
public static void moduleDataCreateEnd(String moduleName, int id) {
28+
if (sNativeModulePerfLogger != null) {
29+
sNativeModulePerfLogger.moduleDataCreateEnd(moduleName, id);
30+
}
31+
}
32+
33+
public static void moduleCreateStart(String moduleName, int id) {
34+
if (sNativeModulePerfLogger != null) {
35+
sNativeModulePerfLogger.moduleCreateStart(moduleName, id);
36+
}
37+
}
38+
39+
public static void moduleCreateCacheHit(String moduleName, int id) {
40+
if (sNativeModulePerfLogger != null) {
41+
sNativeModulePerfLogger.moduleCreateCacheHit(moduleName, id);
42+
}
43+
}
44+
45+
public static void moduleCreateConstructStart(String moduleName, int id) {
46+
if (sNativeModulePerfLogger != null) {
47+
sNativeModulePerfLogger.moduleCreateConstructStart(moduleName, id);
48+
}
49+
}
50+
51+
public static void moduleCreateConstructEnd(String moduleName, int id) {
52+
if (sNativeModulePerfLogger != null) {
53+
sNativeModulePerfLogger.moduleCreateConstructEnd(moduleName, id);
54+
}
55+
}
56+
57+
public static void moduleCreateSetUpStart(String moduleName, int id) {
58+
if (sNativeModulePerfLogger != null) {
59+
sNativeModulePerfLogger.moduleCreateSetUpStart(moduleName, id);
60+
}
61+
}
62+
63+
public static void moduleCreateSetUpEnd(String moduleName, int id) {
64+
if (sNativeModulePerfLogger != null) {
65+
sNativeModulePerfLogger.moduleCreateSetUpEnd(moduleName, id);
66+
}
67+
}
68+
69+
public static void moduleCreateEnd(String moduleName, int id) {
70+
if (sNativeModulePerfLogger != null) {
71+
sNativeModulePerfLogger.moduleCreateEnd(moduleName, id);
72+
}
73+
}
74+
75+
private static native void jniEnableCppLogging(NativeModulePerfLogger perfLogger);
76+
77+
public static void enableLogging(NativeModulePerfLogger perfLogger) {
78+
if (perfLogger != null) {
79+
sNativeModulePerfLogger = perfLogger;
80+
jniEnableCppLogging(perfLogger);
81+
}
82+
}
83+
}

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/Android.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
1515

1616
LOCAL_CFLAGS += -fexceptions -frtti -std=c++14 -Wall
1717

18-
LOCAL_STATIC_LIBRARIES = libcallinvoker
18+
LOCAL_STATIC_LIBRARIES = libcallinvoker libreactperfloggerjni
1919

2020
LOCAL_SHARED_LIBRARIES = libfb libfbjni
2121

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/BUCK

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ rn_xplat_cxx_library(
3535
":callinvokerholder",
3636
"//xplat/jsi:jsi",
3737
react_native_xplat_target("turbomodule/core:core"),
38+
react_native_target("java/com/facebook/react/reactperflogger/jni:jni"),
3839
],
3940
)
4041

ReactAndroid/src/main/java/com/facebook/react/turbomodule/core/jni/ReactCommon/OnLoad.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,29 @@
55
* LICENSE file in the root directory of this source tree.
66
*/
77

8+
#include <ReactCommon/TurboModulePerfLogger.h>
89
#include <fb/xplat_init.h>
910
#include <fbjni/fbjni.h>
11+
#include <reactperflogger/JNativeModulePerfLogger.h>
1012

1113
#include "TurboModuleManager.h"
1214

15+
void jniEnableCppLogging(
16+
jni::alias_ref<jclass> cls,
17+
jni::alias_ref<facebook::react::JNativeModulePerfLogger::javaobject>
18+
perfLogger) {
19+
facebook::react::TurboModulePerfLogger::enableLogging(
20+
perfLogger->cthis()->get());
21+
}
22+
1323
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {
1424
return facebook::xplat::initialize(vm, [] {
1525
// TODO: dvacca ramanpreet unify this with the way
1626
// "ComponentDescriptorFactory" is defined in Fabric
1727
facebook::react::TurboModuleManager::registerNatives();
28+
29+
facebook::jni::registerNatives(
30+
"com/facebook/react/turbomodule/core/TurboModulePerfLogger",
31+
{makeNativeMethod("jniEnableCppLogging", jniEnableCppLogging)});
1832
});
1933
}

ReactAndroid/src/main/jni/react/jni/Android.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ $(call import-module,reactperflogger)
7373
$(call import-module,hermes)
7474
$(call import-module,runtimeexecutor)
7575

76+
include $(REACT_SRC_DIR)/reactperflogger/jni/Android.mk
7677
include $(REACT_SRC_DIR)/turbomodule/core/jni/Android.mk
7778

7879
# TODO(ramanpreet):

0 commit comments

Comments
 (0)