所以在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开发的人了解这些应用程序之间的区别非常重要。
答案 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