16
16
public class NativeInstrumentationModule extends ReactContextBaseJavaModule implements RCTEventEmitter {
17
17
public static final String NAME = "NativeInstrumentation" ;
18
18
private static Long startTime = null ;
19
- private static WritableMap cachedMetrics = null ;
19
+
20
+ private static Double cachedStartStartupTime = null ;
21
+ private static Double cachedEndStartupTime = null ;
22
+ private static Double cachedStartupDuration = null ;
20
23
21
24
static {
22
25
ReactMarker .addListener ((name , tag , instanceKey ) -> {
@@ -41,11 +44,30 @@ public String getName() {
41
44
42
45
public static void initializeNativeInstrumentation () {
43
46
android .util .Log .d (NAME , "Initializing native instrumentation..." );
44
- cachedMetrics = null ;
47
+ cachedStartStartupTime = null ;
48
+ cachedEndStartupTime = null ;
49
+ cachedStartupDuration = null ;
45
50
startTime = System .currentTimeMillis ();
46
51
android .util .Log .d (NAME , String .format ("Initialized with start time: %d (previous metrics cleared)" , startTime ));
47
52
}
48
53
54
+ /**
55
+ * Creates a fresh WritableMap with startup metrics.
56
+ * Note: Each WritableMap can only be consumed once when passed through the React Native bridge.
57
+ * This method ensures we always create a new instance for each request.
58
+ *
59
+ * Each map can be consumed once by the JS side (i.e., going through the bridge).
60
+ *
61
+ * @return A new WritableMap instance containing the startup metrics
62
+ */
63
+ private WritableMap createStartupMetricsMap (double startStartupTime , double endStartupTime , double startupDuration ) {
64
+ WritableMap params = Arguments .createMap ();
65
+ params .putDouble ("startStartupTime" , startStartupTime );
66
+ params .putDouble ("endStartupTime" , endStartupTime );
67
+ params .putDouble ("startupDuration" , startupDuration );
68
+ return params ;
69
+ }
70
+
49
71
@ ReactMethod
50
72
public void getStartupTime (Promise promise ) {
51
73
android .util .Log .d (NAME , "Getting startup time..." );
@@ -56,9 +78,9 @@ public void getStartupTime(Promise promise) {
56
78
return ;
57
79
}
58
80
59
- if (cachedMetrics != null ) {
81
+ if (cachedStartupDuration != null ) {
60
82
android .util .Log .d (NAME , "Returning cached metrics" );
61
- promise .resolve (cachedMetrics );
83
+ promise .resolve (createStartupMetricsMap ( cachedStartStartupTime , cachedEndStartupTime , cachedStartupDuration ) );
62
84
return ;
63
85
}
64
86
@@ -70,14 +92,12 @@ public void getStartupTime(Promise promise) {
70
92
startTime , endTime , duration
71
93
));
72
94
73
- WritableMap params = Arguments .createMap ();
74
- params .putDouble ("startStartupTime" , (double ) startTime );
75
- params .putDouble ("endStartupTime" , (double ) endTime );
76
- params .putDouble ("startupDuration" , duration );
95
+ cachedStartStartupTime = (double ) startTime ;
96
+ cachedEndStartupTime = (double ) endTime ;
97
+ cachedStartupDuration = duration ;
77
98
78
- cachedMetrics = params ;
79
99
android .util .Log .d (NAME , "Metrics cached and being returned" );
80
- promise .resolve (params );
100
+ promise .resolve (createStartupMetricsMap ( cachedStartStartupTime , cachedEndStartupTime , cachedStartupDuration ) );
81
101
}
82
102
83
103
@ ReactMethod
0 commit comments