Skip to content

Commit 53780bd

Browse files
Merging from Master
2 parents 1e17889 + 23fc235 commit 53780bd

File tree

7 files changed

+99
-30
lines changed

7 files changed

+99
-30
lines changed

firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,14 @@ public List<Component<?>> getComponents() {
5252
.add(Dependency.required(FirebaseInstallationsApi.class))
5353
.add(Dependency.requiredProvider(TransportFactory.class))
5454
.factory(FirebasePerfRegistrar::providesFirebasePerformance)
55-
// Since the SDK is eager(auto starts at app start), we use "lazy" dependency for some
56-
// components that are not required during initialization so as not to force initialize
57-
// them at app startup (refer
58-
// https://github.com/google/guice/wiki/InjectingProviders#providers-for-lazy-loading).
59-
.eagerInDefaultApp()
6055
.build(),
56+
/**
57+
* Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link
58+
* com.google.firebase.perf.application.AppStateMonitor#onActivityResumed(Activity)}. we use
59+
* "lazy" dependency for some components that are not required during initialization so as
60+
* not to force initialize them at app startup (refer
61+
* https://github.com/google/guice/wiki/InjectingProviders#providers-for-lazy-loading)*
62+
*/
6163
LibraryVersionComponent.create("fire-perf", BuildConfig.VERSION_NAME));
6264
}
6365

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2021 Google LLC
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package com.google.firebase.perf;
16+
17+
import com.google.firebase.perf.application.AppStateMonitor;
18+
19+
/**
20+
* FirebasePerformanceInitializer to initialize FirebasePerformance during app cold start
21+
*
22+
* @hide
23+
*/
24+
/** @hide */
25+
public final class FirebasePerformanceInitializer implements AppStateMonitor.AppColdStartCallback {
26+
27+
/** @hide */
28+
@Override
29+
public void onAppColdStart() {
30+
// Initialize FirebasePerformance when app cold starts.
31+
FirebasePerformance.getInstance();
32+
}
33+
}

firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ public static AppStateMonitor getInstance() {
8585

8686
private ApplicationProcessState mCurrentState = ApplicationProcessState.BACKGROUND;
8787

88-
private Set<WeakReference<AppStateCallback>> mClients =
88+
private Set<WeakReference<AppStateCallback>> appStateSubscribers =
8989
new HashSet<WeakReference<AppStateCallback>>();
90+
private Set<AppColdStartCallback> appColdStartSubscribers = new HashSet<AppColdStartCallback>();
9091

9192
private boolean hasFrameMetricsAggregator = false;
9293
private FrameMetricsAggregator mFrameMetricsAggregator;
@@ -207,6 +208,7 @@ public synchronized void onActivityResumed(Activity activity) {
207208
updateAppState(ApplicationProcessState.FOREGROUND);
208209
if (mIsColdStart) {
209210
// case 1: app startup.
211+
sendAppColdStartUpdate();
210212
mIsColdStart = false;
211213
} else {
212214
// case 2: app switch from background to foreground.
@@ -234,36 +236,50 @@ public ApplicationProcessState getAppState() {
234236
}
235237

236238
/**
237-
* Register a client to receive app state update.
239+
* Register a subscriber to receive app state update.
238240
*
239241
* @param client an AppStateCallback instance.
240242
* @hide
241243
*/
242244
/** @hide */
243-
public void registerForAppState(WeakReference<AppStateCallback> client) {
244-
synchronized (mClients) {
245-
mClients.add(client);
245+
public void registerForAppState(WeakReference<AppStateCallback> subscriber) {
246+
synchronized (appStateSubscribers) {
247+
appStateSubscribers.add(subscriber);
246248
}
247249
}
248250

249251
/**
250-
* Unregister the client to stop receiving app state update.
252+
* Unregister the subscriber to stop receiving app state update.
251253
*
252-
* @param client an AppStateCallback instance.
254+
* @param subscriber an AppStateCallback instance.
253255
* @hide
254256
*/
255257
/** @hide */
256-
public void unregisterForAppState(WeakReference<AppStateCallback> client) {
257-
synchronized (mClients) {
258-
mClients.remove(client);
258+
public void unregisterForAppState(WeakReference<AppStateCallback> subscriber) {
259+
synchronized (appStateSubscribers) {
260+
appStateSubscribers.remove(subscriber);
259261
}
260262
}
261263

262-
/** Send update state update to registered clients. */
264+
/**
265+
* Register a subscriber to receive app cold start update.
266+
*
267+
* @param subscriber the {@link AppColdStartCallback} instance.
268+
* @hide
269+
*/
270+
/** @hide */
271+
public void registerForAppColdStart(AppColdStartCallback subscriber) {
272+
synchronized (appStateSubscribers) {
273+
appColdStartSubscribers.add(subscriber);
274+
}
275+
}
276+
277+
/** Send update state update to registered subscribers. */
263278
private void updateAppState(ApplicationProcessState newState) {
264279
mCurrentState = newState;
265-
synchronized (mClients) {
266-
for (Iterator<WeakReference<AppStateCallback>> i = mClients.iterator(); i.hasNext(); ) {
280+
synchronized (appStateSubscribers) {
281+
for (Iterator<WeakReference<AppStateCallback>> i = appStateSubscribers.iterator();
282+
i.hasNext(); ) {
267283
AppStateCallback callback = i.next().get();
268284
if (callback != null) {
269285
callback.onUpdateAppState(mCurrentState);
@@ -276,6 +292,18 @@ private void updateAppState(ApplicationProcessState newState) {
276292
}
277293
}
278294

295+
/** Send cold start update to registered subscribers. */
296+
private void sendAppColdStartUpdate() {
297+
synchronized (appStateSubscribers) {
298+
for (Iterator<AppColdStartCallback> i = appColdStartSubscribers.iterator(); i.hasNext(); ) {
299+
AppColdStartCallback callback = i.next();
300+
if (callback != null) {
301+
callback.onAppColdStart();
302+
}
303+
}
304+
}
305+
}
306+
279307
/**
280308
* Return app is in foreground or not.
281309
*
@@ -425,7 +453,7 @@ private boolean hasFrameMetricsAggregatorClass() {
425453
}
426454

427455
/**
428-
* An interface to be implemented by clients which needs to receive app state update.
456+
* An interface to be implemented by subscribers which needs to receive app state update.
429457
*
430458
* @hide
431459
*/
@@ -436,6 +464,15 @@ public static interface AppStateCallback {
436464
public void onUpdateAppState(ApplicationProcessState newState);
437465
}
438466

467+
/**
468+
* An interface to be implemented by subscribers which needs to receive app cold start update.
469+
*
470+
* @hide
471+
*/
472+
public static interface AppColdStartCallback {
473+
public void onAppColdStart();
474+
}
475+
439476
/**
440477
* Screen trace name is prefix "_st_" concatenates with Activity's class name.
441478
*

firebase-perf/src/main/java/com/google/firebase/perf/provider/FirebasePerfProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import androidx.annotation.Nullable;
2929
import com.google.android.gms.common.internal.Preconditions;
3030
import com.google.android.gms.common.util.VisibleForTesting;
31+
import com.google.firebase.perf.FirebasePerformanceInitializer;
3132
import com.google.firebase.perf.application.AppStateMonitor;
3233
import com.google.firebase.perf.config.ConfigResolver;
3334
import com.google.firebase.perf.metrics.AppStartTrace;
@@ -61,7 +62,10 @@ public void attachInfo(Context context, ProviderInfo info) {
6162
ConfigResolver configResolver = ConfigResolver.getInstance();
6263
configResolver.setContentProviderContext(getContext());
6364

64-
AppStateMonitor.getInstance().registerActivityLifecycleCallbacks(getContext());
65+
AppStateMonitor appStateMonitor = AppStateMonitor.getInstance();
66+
appStateMonitor.registerActivityLifecycleCallbacks(getContext());
67+
appStateMonitor.registerForAppColdStart(new FirebasePerformanceInitializer());
68+
6569
AppStartTrace appStartTrace = AppStartTrace.getInstance();
6670
appStartTrace.registerActivityLifecycleCallbacks(getContext());
6771

firebase-perf/src/main/java/com/google/firebase/perf/session/PerfSession.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import androidx.annotation.Nullable;
2121
import androidx.annotation.VisibleForTesting;
2222
import com.google.firebase.perf.config.ConfigResolver;
23-
import com.google.firebase.perf.logging.AndroidLogger;
2423
import com.google.firebase.perf.util.Clock;
2524
import com.google.firebase.perf.util.Timer;
2625
import com.google.firebase.perf.v1.SessionVerbosity;
@@ -50,11 +49,6 @@ public static PerfSession create() {
5049
PerfSession session = new PerfSession(sessionId, new Clock());
5150
session.setGaugeAndEventCollectionEnabled(shouldCollectGaugesAndEvents());
5251

53-
AndroidLogger.getInstance()
54-
.debug(
55-
"Creating a new %s Session: %s",
56-
session.isVerbose() ? "Verbose" : "Non Verbose", sessionId);
57-
5852
return session;
5953
}
6054

firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public class TransportManager implements AppStateCallback {
101101
private FlgTransport flgTransport;
102102

103103
private ExecutorService executorService;
104-
private final ApplicationInfo.Builder applicationInfoBuilder;
104+
private ApplicationInfo.Builder applicationInfoBuilder;
105105
private Context appContext;
106106
private ConfigResolver configResolver;
107107
private RateLimiter rateLimiter;
@@ -136,8 +136,6 @@ private TransportManager() {
136136
TimeUnit.SECONDS,
137137
new LinkedBlockingQueue<>());
138138

139-
this.applicationInfoBuilder = ApplicationInfo.newBuilder();
140-
141139
cacheMap = new ConcurrentHashMap<>();
142140
cacheMap.put(KEY_AVAILABLE_TRACES_FOR_CACHING, MAX_TRACE_METRICS_CACHE_SIZE);
143141
cacheMap.put(
@@ -219,6 +217,7 @@ private void syncInit() {
219217
private void finishInitialization() {
220218
appStateMonitor.registerForAppState(new WeakReference<>(instance));
221219

220+
applicationInfoBuilder = ApplicationInfo.newBuilder();
222221
applicationInfoBuilder
223222
.setGoogleAppId(firebaseApp.getOptions().getApplicationId())
224223
.setAndroidAppInfo(

firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerfRegistrarTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,6 @@ public void testGetComponents() {
4848
Dependency.required(FirebaseInstallationsApi.class),
4949
Dependency.requiredProvider(TransportFactory.class));
5050

51-
assertThat(firebasePerfComponent.isEagerInDefaultApp()).isTrue();
51+
assertThat(firebasePerfComponent.isLazy()).isTrue();
5252
}
5353
}

0 commit comments

Comments
 (0)