Skip to content

Commit aea12a4

Browse files
Merging from Master. Also fixing the merge issues with #2546
2 parents f94d80d + ff551e5 commit aea12a4

29 files changed

+1076
-818
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: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks {
6464
private final WeakHashMap<Activity, Trace> activityToScreenTraceMap = new WeakHashMap<>();
6565
private final Map<String, Long> metricToCountMap = new HashMap<>();
6666
private final Set<WeakReference<AppStateCallback>> appStateSubscribers = new HashSet<>();
67+
private Set<AppColdStartCallback> appColdStartSubscribers = new HashSet<>();
6768

6869
/* Count for TRACE_STARTED_NOT_STOPPED */
6970
private final AtomicInteger tsnsCount = new AtomicInteger(0);
@@ -208,6 +209,7 @@ public synchronized void onActivityResumed(Activity activity) {
208209
updateAppState(ApplicationProcessState.FOREGROUND);
209210
if (isColdStart) {
210211
// case 1: app startup.
212+
sendAppColdStartUpdate();
211213
isColdStart = false;
212214
} else {
213215
// case 2: app switch from background to foreground.
@@ -234,32 +236,45 @@ 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) {
245+
public void registerForAppState(WeakReference<AppStateCallback> subscriber) {
244246
synchronized (appStateSubscribers) {
245-
appStateSubscribers.add(client);
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.
255+
* @hide
256+
*/
257+
/** @hide */
258+
public void unregisterForAppState(WeakReference<AppStateCallback> subscriber) {
259+
synchronized (appStateSubscribers) {
260+
appStateSubscribers.remove(subscriber);
261+
}
262+
}
263+
264+
/**
265+
* Register a subscriber to receive app cold start update.
266+
*
267+
* @param subscriber the {@link AppColdStartCallback} instance.
253268
* @hide
254269
*/
255270
/** @hide */
256-
public void unregisterForAppState(WeakReference<AppStateCallback> client) {
271+
public void registerForAppColdStart(AppColdStartCallback subscriber) {
257272
synchronized (appStateSubscribers) {
258-
appStateSubscribers.remove(client);
273+
appColdStartSubscribers.add(subscriber);
259274
}
260275
}
261276

262-
/** Send update state update to registered clients. */
277+
/** Send update state update to registered subscribers. */
263278
private void updateAppState(ApplicationProcessState newState) {
264279
currentAppState = newState;
265280
synchronized (appStateSubscribers) {
@@ -277,6 +292,18 @@ private void updateAppState(ApplicationProcessState newState) {
277292
}
278293
}
279294

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+
280307
/**
281308
* Return app is in foreground or not.
282309
*
@@ -426,7 +453,7 @@ private boolean hasFrameMetricsAggregatorClass() {
426453
}
427454

428455
/**
429-
* 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.
430457
*
431458
* @hide
432459
*/
@@ -437,6 +464,15 @@ public static interface AppStateCallback {
437464
public void onUpdateAppState(ApplicationProcessState newState);
438465
}
439466

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+
440476
/**
441477
* Screen trace name is prefix "_st_" concatenates with Activity's class name.
442478
*

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;
@@ -62,7 +63,10 @@ public void attachInfo(Context context, ProviderInfo info) {
6263
ConfigResolver configResolver = ConfigResolver.getInstance();
6364
configResolver.setContentProviderContext(getContext());
6465

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

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;
@@ -51,11 +50,6 @@ public static PerfSession create() {
5150
PerfSession session = new PerfSession(sessionId, new Clock());
5251
session.setGaugeAndEventCollectionEnabled(shouldCollectGaugesAndEvents());
5352

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

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
@@ -108,7 +108,6 @@ public class TransportManager implements AppStateCallback {
108108
new ConcurrentLinkedQueue<>();
109109

110110
private final AtomicBoolean isTransportInitialized = new AtomicBoolean(false);
111-
private final ApplicationInfo.Builder applicationInfoBuilder;
112111

113112
private FirebaseApp firebaseApp;
114113
@Nullable private FirebasePerformance firebasePerformance;
@@ -120,6 +119,7 @@ public class TransportManager implements AppStateCallback {
120119
private ConfigResolver configResolver;
121120
private RateLimiter rateLimiter;
122121
private AppStateMonitor appStateMonitor;
122+
private ApplicationInfo.Builder applicationInfoBuilder;
123123

124124
private boolean isForegroundState = false;
125125

@@ -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
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,19 @@ public class FirebasePerformanceTestBase {
4848
protected static final String FAKE_FIREBASE_DB_URL = "https://fir-perftestapp.firebaseio.com";
4949
protected static final String FAKE_FIREBASE_PROJECT_ID = "fir-perftestapp";
5050

51-
protected Context context;
51+
protected Context appContext;
5252

5353
@Before
5454
public void setUpFirebaseApp() {
55-
context = ApplicationProvider.getApplicationContext();
55+
appContext = ApplicationProvider.getApplicationContext();
5656
FirebaseOptions options =
5757
new FirebaseOptions.Builder()
5858
.setApplicationId(FAKE_FIREBASE_APPLICATION_ID)
5959
.setApiKey(FAKE_FIREBASE_API_KEY)
6060
.setDatabaseUrl(FAKE_FIREBASE_DB_URL)
6161
.setProjectId(FAKE_FIREBASE_PROJECT_ID)
6262
.build();
63-
FirebaseApp.initializeApp(context, options);
63+
FirebaseApp.initializeApp(appContext, options);
6464
}
6565

6666
@After

0 commit comments

Comments
 (0)