//判断当前运行进程是否是主进程
public static boolean isMainProcess(Application app) {
//优先通过反射取进程名
String processName = getProcessNameByReflection(app);
if (TextUtils.isEmpty(processName)) {
processName = getProcessNameByCmdline();
}
if (TextUtils.isEmpty(processName)) {
processName = getProcessNameByAM(app);
}
return app.getPackageName().equals(processName);
}
public static String getProcessNameByAM(Context context) {
final int pid = android.os.Process.myPid();
final ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
String processName = null;
if (manager != null) {
final List infoList = manager.getRunningAppProcesses();
if (infoList != null) {
for (ActivityManager.RunningAppProcessInfo info : infoList) {
if (info.pid == pid) {
processName = info.processName;
break;
}
}
}
}
return processName;
}
public static String getProcessNameByCmdline() {
String processName = null;
BufferedReader cmdlineReader = null;
try {
cmdlineReader = new BufferedReader(new InputStreamReader(
new FileInputStream("/proc/" + android.os.Process.myPid() + "/cmdline"),
"iso-8859-1"));
int c;
StringBuilder sb = new StringBuilder();
while ((c = cmdlineReader.read()) > 0) {
sb.append((char) c);
}
processName = sb.toString();
} catch (Exception e) {
Timber.e(e);
} finally {
if (cmdlineReader != null) {
try {
cmdlineReader.close();
} catch (IOException ignored) {
}
}
}
return processName;
}
public static String getProcessNameByReflection(Application app) {
String processName = null;
try {
Field loadedApkField = app.getClass().getField("mLoadedApk");
loadedApkField.setAccessible(true);
Object loadedApk = loadedApkField.get(app);
Field activityThreadField = loadedApk.getClass().getDeclaredField("mActivityThread");
activityThreadField.setAccessible(true);
Object activityThread = activityThreadField.get(loadedApk);
Method getProcessName = activityThread.getClass().getDeclaredMethod("getProcessName");
processName = (String) getProcessName.invoke(activityThread);
} catch (Exception e) {
Timber.e(e);
}
return processName;
}