首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎样才能知道我是否在运行android:隔离进程?

我怎样才能知道我是否在运行android:隔离进程?
EN

Stack Overflow用户
提问于 2014-10-20 21:00:43
回答 2查看 2.8K关注 0票数 6

我正在为Android开发一个第三方库,并且需要能够判断我是以特权进程的身份运行,还是以我想要的权限运行,或者我生活在一个独立的进程中,AndroidManifest.xml文件中定义了受限的权限:

代码语言:javascript
运行
复制
<service android:name="mySandboxedService" android:permission="com.android.chrome.permission.CHILD_SERVICE" android:exported="false" android:process=":sandboxed_process0" android:isolatedProcess="true" />

原因是我试图做的某些事情,例如获取运行的应用程序进程的数量(以及其他各种事情),如果它们是孤立的,就会抛出一个RuntimeException。如果不是作为孤立的进程运行,此代码将成功运行,但如果进程是孤立的,则会抛出RTE:

代码语言:javascript
运行
复制
    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.");
    }

从我的日志里说:

代码语言:javascript
运行
复制
java.lang.SecurityException: Isolated process not allowed to call getRunningAppProcesses

有没有人知道我可以检查我当前的进程,看看它是孤立的还是特权的?我在这里查看了Android 服务文档,它没有提供太多的信息。

我的最终目标是从主特权线程初始化我的应用程序一次,然后忽略可能创建的各种沙箱进程的所有启动调用。我不想在这些文件中运行,但是我的钩子在Application.onCreate中,每个进程都会被调用,不管有没有沙箱。

我已经考虑过将其中一个检查添加到初始化中并在引发RTE时捕获RTE的想法。但是如果它有一个公共API,我宁愿使用它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-07 12:53:03

我们可以检查正在运行的进程的uid,看看它们是否落在独立进程的范围内。

代码语言:javascript
运行
复制
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并查看是否引发异常。

代码语言:javascript
运行
复制
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

票数 5
EN

Stack Overflow用户

发布于 2020-08-28 08:09:08

API28 (Android / 9)引入了检查当前进程是否是孤立进程的新方法:Process#isIsolated

注意,这个方法被添加到API 16中的Process类中,但是隐藏到API 28。因此,可以使用以下方法来检查流程是否是孤立的(这实际上是Chrome应用程序执行此检查的方式):

代码语言:javascript
运行
复制
@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)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26474833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档