Skip to content

Commit d181c2c

Browse files
committed
Refactor usage of ProcessName in Fireperf. (#6963)
- This is based on `firebase-sessions/src/main/kotlin/com/google/firebase/sessions/ProcessDetailsProvider.kt` - Usage in `AppStartTrace` and `TransportManager` - Reverts changes in `firebase-sessions/src/main/` to `main`
1 parent 4c4a304 commit d181c2c

File tree

5 files changed

+82
-19
lines changed

5 files changed

+82
-19
lines changed

firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
package com.google.firebase.perf.metrics;
1616

17+
import static com.google.firebase.perf.util.AppProcessesProvider.getAppProcesses;
18+
1719
import android.annotation.SuppressLint;
1820
import android.app.Activity;
1921
import android.app.ActivityManager;
@@ -509,17 +511,10 @@ public static boolean isAnyAppProcessInForeground(Context appContext) {
509511
if (activityManager == null) {
510512
return true;
511513
}
512-
List<ActivityManager.RunningAppProcessInfo> appProcesses =
513-
activityManager.getRunningAppProcesses();
514-
if (appProcesses != null) {
515-
String appProcessName = appContext.getPackageName();
516-
String allowedAppProcessNamePrefix = appProcessName + ":";
514+
List<ActivityManager.RunningAppProcessInfo> appProcesses = getAppProcesses(appContext);
515+
if (!appProcesses.isEmpty()) {
517516
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
518-
if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
519-
continue;
520-
}
521-
if (appProcess.processName.equals(appProcessName)
522-
|| appProcess.processName.startsWith(allowedAppProcessNamePrefix)) {
517+
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
523518
boolean isAppInForeground = true;
524519

525520
// For the case when the app is in foreground and the device transitions to sleep mode,

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
@@ -14,7 +14,7 @@
1414

1515
package com.google.firebase.perf.transport;
1616

17-
import static com.google.firebase.sessions.ProcessDetailsProvider.getProcessDetailsProvider;
17+
import static com.google.firebase.perf.util.AppProcessesProvider.getProcessName;
1818
import static java.util.concurrent.TimeUnit.MILLISECONDS;
1919
import static java.util.concurrent.TimeUnit.MINUTES;
2020

@@ -231,8 +231,7 @@ private void finishInitialization() {
231231
applicationInfoBuilder = ApplicationInfo.newBuilder();
232232
applicationInfoBuilder
233233
.setGoogleAppId(firebaseApp.getOptions().getApplicationId())
234-
.setProcessName(
235-
getProcessDetailsProvider().getCurrentProcessDetails(appContext).getProcessName())
234+
.setProcessName(getProcessName(appContext))
236235
.setAndroidAppInfo(
237236
AndroidApplicationInfo.newBuilder()
238237
.setPackageName(packageName)
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright 2025 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+
//
6+
// You may obtain a copy of the License at
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.util
16+
17+
import android.app.ActivityManager
18+
import android.app.Application
19+
import android.content.Context
20+
import android.os.Build
21+
import android.os.Process
22+
import com.google.android.gms.common.util.ProcessUtils
23+
24+
/**
25+
* A singleton that contains helper functions to get relevant process details. TODO(b/418041083):
26+
* Explore using a common utility. See [com.google.firebase.sessions.ProcessDetailsProvider].
27+
*/
28+
object AppProcessesProvider {
29+
/** Gets the details for all of this app's running processes. */
30+
@JvmStatic
31+
fun getAppProcesses(context: Context): List<ActivityManager.RunningAppProcessInfo> {
32+
val appUid = context.applicationInfo.uid
33+
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
34+
val runningAppProcesses = activityManager?.runningAppProcesses ?: listOf()
35+
36+
return runningAppProcesses.filterNotNull().filter {
37+
// Only collect process info for this app's processes.
38+
it.uid == appUid
39+
}
40+
}
41+
42+
/**
43+
* Gets this app's current process name.
44+
*
45+
* If the current process details are not found for whatever reason, returns an empty string.
46+
*/
47+
@JvmStatic
48+
fun getProcessName(context: Context): String {
49+
val pid = Process.myPid()
50+
return getAppProcesses(context).find { it.pid == pid }?.processName ?: getProcessName()
51+
}
52+
53+
/** Gets the app's current process name. If it could not be found, return the default. */
54+
private fun getProcessName(default: String = ""): String {
55+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
56+
return Process.myProcessName()
57+
}
58+
59+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
60+
Application.getProcessName()?.let {
61+
return it
62+
}
63+
}
64+
65+
// GMS core has different ways to get the process name on old api levels.
66+
ProcessUtils.getMyProcessName()?.let {
67+
return it
68+
}
69+
70+
// Returns default if nothing works.
71+
return default
72+
}
73+
}

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/ProcessDetailsProvider.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,7 @@ import com.google.android.gms.common.util.ProcessUtils
2828
*
2929
* @hide
3030
*/
31-
object ProcessDetailsProvider {
32-
@JvmStatic
33-
fun getProcessDetailsProvider(): ProcessDetailsProvider {
34-
return this
35-
}
31+
internal object ProcessDetailsProvider {
3632
/** Gets the details for all of this app's running processes. */
3733
fun getAppProcessDetails(context: Context): List<ProcessDetails> {
3834
val appUid = context.applicationInfo.uid

firebase-sessions/src/main/kotlin/com/google/firebase/sessions/SessionEvent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ internal data class DataCollectionStatus(
8181
)
8282

8383
/** Container for information about the process */
84-
data class ProcessDetails(
84+
internal data class ProcessDetails(
8585
val processName: String,
8686
val pid: Int,
8787
val importance: Int,

0 commit comments

Comments
 (0)