我正在为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.");
}
从我的日志里说:
java.lang.SecurityException: Isolated process not allowed to call getRunningAppProcesses
有没有人知道我可以检查我当前的进程,看看它是孤立的还是特权的?我在这里查看了Android 服务文档,它没有提供太多的信息。
我的最终目标是从主特权线程初始化我的应用程序一次,然后忽略可能创建的各种沙箱进程的所有启动调用。我不想在这些文件中运行,但是我的钩子在Application.onCreate中,每个进程都会被调用,不管有没有沙箱。
我已经考虑过将其中一个检查添加到初始化中并在引发RTE时捕获RTE的想法。但是如果它有一个公共API,我宁愿使用它。
发布于 2020-05-07 12:53:03
我们可以检查正在运行的进程的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");
}
处理范围信息来源:app.te
编辑:在Android8.1及以下版本中,发现上面的内容是不可靠的。另一种方法是尝试访问特权API并查看是否引发异常。
try {
ActivityManager activityManager = (ActivityManager) mContext.getSystemService(ACTIVITY_SERVICE);
activityManager.getRunningAppProcesses();
} catch (SecurityException e) {
Log.i(TAG, "This is from an isolated process");
}
正如另一个答案所指出的,Android /9 (API 28)为此引入了一个新的API。见https://developer.android.com/reference/android/os/Process#isIsolated()。
这似乎存在于像Android4.3这样的低版本中。请参阅r1:frameworks/base/core/java/android/os/Process.java;l=680
发布于 2020-08-28 08:09:08
API28 (Android / 9)引入了检查当前进程是否是孤立进程的新方法:Process#isIsolated。
注意,这个方法被添加到API 16中的Process类中,但是隐藏到API 28。因此,可以使用以下方法来检查流程是否是孤立的(这实际上是Chrome应用程序执行此检查的方式):
@SuppressLint("NewApi")
public boolean isIsolated() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
return false;
}
return android.os.Process.isIsolated();
}
检查UID是否在{99000,99999}范围内(如接受的答案中所示)将在多用户/配置文件环境中产生不正确的结果,这些用户/配置文件不是主要的用户/配置文件,因为它们的UID将以匹配的用户id作为前缀(例如,用户10的隔离进程的UID将为1099013)。
https://stackoverflow.com/questions/26474833
复制相似问题