如何判断我是否在android:isolatedProcess中运行?

问题描述 投票:3回答:1

我正在为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,我宁愿使用它。

java android android-service android-manifest android-permissions
1个回答
2
投票

可以查看运行进程的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。

© www.soinside.com 2019 - 2024. All rights reserved.