74

所以在 4.3 中有一个系统应用程序的概念。放置的 APK/system/app被授予系统权限。从 4.4 开始,出现了“特权应用”的新概念。特权应用程序存储在/system/priv-app目录中,似乎被区别对待。如果您查看 AOSP 源代码,在 下PackageManagerService,您将看到新方法,例如

static boolean locationIsPrivileged(File path) {
    try {
        final String privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app")
                .getCanonicalPath();
        return path.getCanonicalPath().startsWith(privilegedAppDir);
    } catch (IOException e) {
        Slog.e(TAG, "Unable to access code path " + path);
    }
    return false;
}

因此,这是一个不同情况的示例。

public final void addActivity(PackageParser.Activity a, String type) {
...
if (!systemApp && intent.getPriority() > 0 && "activity".equals(type)) {
                intent.setPriority(0);
                Log.w(TAG, "Package " + a.info.applicationInfo.packageName + " has activity "
                        + a.className + " with priority > 0, forcing to 0");
            }
...

这会影响任何未定义为系统应用程序的活动的优先级。这似乎意味着您不能向优先级高于 0 的包管理器添加活动,除非您是系统应用程序。据我所知,这并不排除特权应用程序(这里有很多逻辑,我可能错了。)。

我的问题是这究竟意味着什么?如果我的应用程序是特权的,但不是系统的,那会有什么不同?在PackageManagerService您可以发现系统和特权应用程序之间的各种不同之处,它们并不完全相同。特权应用程序背后应该有某种意识形态,否则他们只会说:

if locationIsPrivileged: app.flags |= FLAG_SYSTEM

并完成了它。这是一个新概念,我认为对于从 4.4 开始进行 AOSP 开发的任何人来说,了解这些类型的应用程序之间的区别非常重要。

4

1 回答 1

96

因此,经过一番挖掘,很明显 priv-app 中的应用程序有资格获得系统权限,就像旧应用程序过去有资格通过在 system-app 中获得系统权限一样。我能找到的唯一官方谷歌文档以提交消息的形式出现:提交哈希:ccbf84f44c9e6a5ed3c08673614826bb237afc54

一些系统应用程序比其他应用程序更系统

“signatureOrSystem”权限不再适用于 /system 分区中的所有应用程序。取而代之的是一个新的 /system/priv-app 目录,并且只有 APK 在该目录中的应用程序才被允许使用 signatureOrSystem 权限而不共享平台证书。这将减少可能利用系统捆绑应用程序来尝试访问受权限保护的操作的表面积。

ApplicationInfo.FLAG_SYSTEM 标志继续意味着它在文档中所说的:它表示应用程序 apk 捆绑在 /system 分区上。引入了一个新的隐藏标志 FLAG_PRIVILEGED,它反映了访问这些权限的实际权限。

更新:从 Android 8.0 开始,priv-app 略有变化,增加了特权权限白名单。除了在 priv-app 中,您的应用还必须添加到白名单中才能获得各种系统权限。可以在此处找到相关信息:https ://source.android.com/devices/tech/config/perms-whitelist

于 2013-11-20T18:49:13.817 回答