Android上的系统应用和特权应用有什么区别?

时间:2013-11-08 20:41:10

标签: android android-source

所以在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 个答案:

答案 0 :(得分:71)

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

  

某些系统应用程序比其他系统应用程序更多

     

“signatureOrSystem”权限不再适用于所有应用   驻留在/ system分区。相反,有一个新的   / system / priv-app目录,只有其中包含APK的应用程序   目录可以不使用signatureOrSystem权限   共享平台证书。这将减少表面积   可能利用系统捆绑的应用程序试图获得   访问受权限保护的操作。

     

ApplicationInfo.FLAG_SYSTEM标志继续表示它的含义   在文档中:它表明应用程序apk是   捆绑在/ system分区上。一个新的隐藏标志FLAG_PRIVILEGED   已经介绍,反映了访问这些的实际权利   权限。

更新:自Android 8.0以来,随着Privileged Permission Whitelisting的增加,priv-app略有改变。除了处于priv-app之外,还必须将您的应用添加到白名单中以获得各种系统权限。有关这方面的信息,请访问:https://source.android.com/devices/tech/config/perms-whitelist