Get it from ActivityThread
In API 28+, you can call Application.getProcessName()
, which is just a public wrapper around ActivityThread.currentProcessName()
.
On older platforms, just call ActivityThread.currentProcessName()
directly.
Note that prior to API 18, the method was incorrectly called ActivityThread.currentPackageName()
but still in fact returned the process name.
Example code
public static String getProcessName() {
if (Build.VERSION.SDK_INT >= 28)
return Application.getProcessName();
// Using the same technique as Application.getProcessName() for older devices
// Using reflection since ActivityThread is an internal API
try {
@SuppressLint("PrivateApi")
Class<?> activityThread = Class.forName("android.app.ActivityThread");
// Before API 18, the method was incorrectly named "currentPackageName", but it still returned the process name
// See https://github.com/aosp-mirror/platform_frameworks_base/commit/b57a50bd16ce25db441da5c1b63d48721bb90687
String methodName = Build.VERSION.SDK_INT >= 18 ? "currentProcessName" : "currentPackageName";
Method getProcessName = activityThread.getDeclaredMethod(methodName);
return (String) getProcessName.invoke(null);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
Compatibility
Tested and working on
- Official emulator
- 16
- 17
- 18
- 19
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- Q beta 1
- Real devices
- Motorola Moto G5 Plus running Android 8.1.0
- Samsung Galaxy S5 running Android 6.0.1
- Sony Xperia M running stock Android 7.1.1
- Sony Xperia M running Sony Android 4.1.2