我正在为Android开发一个第三方库,我需要能够判断我是作为一个具有我所需权限的特权进程运行,还是生活在一个具有AndroidManifest.xml文件中定义的受限权限的隔离进程中。
<service android:name="mySandboxedService" android:permission="com.android.chrome.permission.CHILD_SERVICE" android:exported="false" android:process=":sandboxed_process0" android:isolatedProcess="true" />
原因是我要做的某些事情,比如获取正在运行的应用进程的数量(以及其他各种事情),如果它们是隔离的,就会抛出一个RuntimeException。 如果不作为隔离进程运行,这段代码会成功运行,但如果进程被隔离,会抛出RTE。
ActivityManager aM = (ActivityManager) context.getSystemService(android.content.Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> l = null;
try {
l = aM.getRunningAppProcesses();
} catch (RuntimeException e) {
Log.w(LOGTAG, "Isolated process not allowed allowed to call getRunningAppProcesses, cannot get number of running apps.");
}
从我的logcat里找到的
java.lang.SecurityException: Isolated process not allowed to call getRunningAppProcesses
有谁知道我有办法检查当前进程是否被隔离或有特权? 我已经检查了Android 服务项目 文档,但它没有提供太多信息。
我的最终目标是在主线程、特权线程中初始化我的应用程序一次,然后忽略可能被创建的各种沙盒进程的所有启动调用。 我不想在这些进程中运行,但我的钩子在Application.onCreate中,并被每个进程调用,无论是否被沙盒化。
我考虑过在我的初始化中添加一个这样的检查,并在抛出RTE时捕获它。 但如果有一个公共的API,我宁愿使用它。
可以查看运行进程的uid,看看是否属于隔离进程的范围。
int AID_ISOLATED_START = 99000;
int AID_ISOLATED_END = 99999;
int uid = Process.myUid();
if (uid >= AID_ISOLATED_START && uid <= AID_ISOLATED_END) {
Log.i(TAG, "This is from an isolated process");
}
进程范围信息来源。https:/android.googlesource.comatformsystemsepolicy+masterpublicisolated_app.te。