Skip to content

Commit 252aa91

Browse files
committed
Move process name helpers into Fireperf
1 parent 77cd685 commit 252aa91

File tree

5 files changed

+64
-19
lines changed

5 files changed

+64
-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: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.google.firebase.perf.util
2+
3+
import android.app.ActivityManager
4+
import android.app.Application
5+
import android.content.Context
6+
import android.os.Build
7+
import android.os.Process
8+
import com.google.android.gms.common.util.ProcessUtils
9+
10+
object AppProcessesProvider {
11+
/** Gets the details for all of this app's running processes. */
12+
@JvmStatic
13+
fun getAppProcesses(context: Context): List<ActivityManager.RunningAppProcessInfo> {
14+
val appUid = context.applicationInfo.uid
15+
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
16+
val runningAppProcesses = activityManager?.runningAppProcesses ?: listOf()
17+
18+
return runningAppProcesses.filterNotNull().filter {
19+
// Only collect process info for this app's processes.
20+
it.uid == appUid
21+
}
22+
}
23+
24+
/**
25+
* Gets this app's current process details.
26+
*
27+
* If the current process details are not found for whatever reason, returns app's package name.
28+
*/
29+
@JvmStatic
30+
fun getProcessName(context: Context): String {
31+
val pid = Process.myPid()
32+
return getAppProcesses(context).find { it.pid == pid }?.processName ?: getProcessName()
33+
}
34+
35+
/** Gets the app's current process name. If it could not be found, returns an empty string. */
36+
private fun getProcessName(): String {
37+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.TIRAMISU) {
38+
return Process.myProcessName()
39+
}
40+
41+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
42+
Application.getProcessName()?.let {
43+
return it
44+
}
45+
}
46+
47+
// GMS core has different ways to get the process name on old api levels.
48+
ProcessUtils.getMyProcessName()?.let {
49+
return it
50+
}
51+
52+
// Default to an empty string if nothing works.
53+
return ""
54+
}
55+
}

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)