1010import io .sentry .protocol .MeasurementValue ;
1111import io .sentry .protocol .SentryId ;
1212import io .sentry .util .AutoClosableReentrantLock ;
13+ import io .sentry .util .LazyEvaluator ;
1314import java .util .HashMap ;
1415import java .util .Map ;
1516import java .util .WeakHashMap ;
3031 */
3132public final class ActivityFramesTracker {
3233
33- private @ Nullable FrameMetricsAggregator frameMetricsAggregator = null ;
34+ private @ NotNull LazyEvaluator < FrameMetricsAggregator > frameMetricsAggregator ;
3435 private @ NotNull final SentryAndroidOptions options ;
3536
3637 private final @ NotNull Map <SentryId , Map <String , @ NotNull MeasurementValue >>
@@ -41,17 +42,18 @@ public final class ActivityFramesTracker {
4142 private final @ NotNull MainLooperHandler handler ;
4243 protected @ NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock ();
4344
45+ private final @ NotNull LazyEvaluator <Boolean > androidXAvailable ;
46+
4447 public ActivityFramesTracker (
4548 final @ NotNull io .sentry .util .LoadClass loadClass ,
4649 final @ NotNull SentryAndroidOptions options ,
4750 final @ NotNull MainLooperHandler handler ) {
4851
49- final boolean androidXAvailable =
50- loadClass .isClassAvailable ("androidx.core.app.FrameMetricsAggregator" , options .getLogger ());
52+ androidXAvailable =
53+ loadClass .isClassAvailableLazy (
54+ "androidx.core.app.FrameMetricsAggregator" , options .getLogger ());
55+ frameMetricsAggregator = new LazyEvaluator <>(() -> new FrameMetricsAggregator ());
5156
52- if (androidXAvailable ) {
53- frameMetricsAggregator = new FrameMetricsAggregator ();
54- }
5557 this .options = options ;
5658 this .handler = handler ;
5759 }
@@ -67,15 +69,15 @@ public ActivityFramesTracker(
6769 final @ NotNull io .sentry .util .LoadClass loadClass ,
6870 final @ NotNull SentryAndroidOptions options ,
6971 final @ NotNull MainLooperHandler handler ,
70- final @ Nullable FrameMetricsAggregator frameMetricsAggregator ) {
72+ final @ NotNull FrameMetricsAggregator frameMetricsAggregator ) {
7173
7274 this (loadClass , options , handler );
73- this .frameMetricsAggregator = frameMetricsAggregator ;
75+ this .frameMetricsAggregator = new LazyEvaluator <>(() -> frameMetricsAggregator ) ;
7476 }
7577
7678 @ VisibleForTesting
7779 public boolean isFrameMetricsAggregatorAvailable () {
78- return frameMetricsAggregator != null
80+ return androidXAvailable . getValue ()
7981 && options .isEnableFramesTracking ()
8082 && !options .isEnablePerformanceV2 ();
8183 }
@@ -87,7 +89,8 @@ public void addActivity(final @NotNull Activity activity) {
8789 return ;
8890 }
8991
90- runSafelyOnUiThread (() -> frameMetricsAggregator .add (activity ), "FrameMetricsAggregator.add" );
92+ runSafelyOnUiThread (
93+ () -> frameMetricsAggregator .getValue ().add (activity ), "FrameMetricsAggregator.add" );
9194 snapshotFrameCountsAtStart (activity );
9295 }
9396 }
@@ -104,11 +107,11 @@ private void snapshotFrameCountsAtStart(final @NotNull Activity activity) {
104107 return null ;
105108 }
106109
107- if (frameMetricsAggregator == null ) {
110+ if (! androidXAvailable . getValue () ) {
108111 return null ;
109112 }
110113
111- final @ Nullable SparseIntArray [] framesRates = frameMetricsAggregator .getMetrics ();
114+ final @ Nullable SparseIntArray [] framesRates = frameMetricsAggregator .getValue (). getMetrics ();
112115
113116 int totalFrames = 0 ;
114117 int slowFrames = 0 ;
@@ -153,7 +156,7 @@ public void setMetrics(final @NotNull Activity activity, final @NotNull SentryId
153156 // there was no
154157 // Observers, See
155158 // https://android.googlesource.com/platform/frameworks/base/+/140ff5ea8e2d99edc3fbe63a43239e459334c76b
156- runSafelyOnUiThread (() -> frameMetricsAggregator .remove (activity ), null );
159+ runSafelyOnUiThread (() -> frameMetricsAggregator .getValue (). remove (activity ), null );
157160
158161 final @ Nullable FrameCounts frameCounts = diffFrameCountsAtEnd (activity );
159162
@@ -215,8 +218,9 @@ public void setMetrics(final @NotNull Activity activity, final @NotNull SentryId
215218 public void stop () {
216219 try (final @ NotNull ISentryLifecycleToken ignored = lock .acquire ()) {
217220 if (isFrameMetricsAggregatorAvailable ()) {
218- runSafelyOnUiThread (() -> frameMetricsAggregator .stop (), "FrameMetricsAggregator.stop" );
219- frameMetricsAggregator .reset ();
221+ runSafelyOnUiThread (
222+ () -> frameMetricsAggregator .getValue ().stop (), "FrameMetricsAggregator.stop" );
223+ frameMetricsAggregator .getValue ().reset ();
220224 }
221225 activityMeasurements .clear ();
222226 }
0 commit comments