安卓系统中,系统应用与特权应用有何区别?

78

因此,在4.3中有一个系统应用程序的概念。放置在/system/app中的APK将被赋予系统特权。从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开发的人来说,了解这些应用程序类型之间的区别非常重要。

1个回答

101
经过一些调查,很明显priv-app中的应用程序有资格获得系统权限,就像旧应用程序通过位于system-app中有资格声明系统权限一样。我能找到的唯一官方Google文档是以提交消息的形式出现的: 提交哈希值: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

3
在系统应用程序中放置的应用通常是您希望拥有较少权限的应用程序。例如,您可能不希望您的电子邮件客户端或随机的厂商自带软件能够更改您的系统安全设置。 - Andrew T.
19
系统/app中的应用程序没有特殊权限。除非其使用系统密钥签名(因此需要执行SigOrSystem检查),否则它们与第三方应用程序没有区别。至于有帮助的方法,有很多种。我开始使用grep查找priv-app,然后跟踪到了PackageManagerService,现在该服务将其称为特权包。 - Andrew T.
1
我正在与Google开发人员合作开发Android TV的系统应用程序,似乎还有一些特定的Google API仅限于系统应用程序使用。 - vovahost
6
@Farhan LOCAL_PRIVILEGED_MODULE := true@Farhan 本地特权模块 := true - Andrew T.
8
如果一个应用程序位于priv-app文件夹中,并在其清单文件中请求权限,则它将获得该权限。但请注意,特权应用程序可以获取系统权限,但除非您使用与拥有权限实体相同的密钥签名(即INTERACT_ACROSS_USERS_FULL是签名权限,您必须还使用系统密钥进行签名),否则它将不授予您“签名”权限。 @Mr.Hyde - Andrew T.
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接