因此,在4.3中有一个系统应用的概念。放置在/system/app中的APK被授予系统特权。从4.4开始,就有了“特权应用”的新概念。特权应用程序存储在/system/priv-app目录中,似乎受到不同的对待。如果您在PackageManagerService下面查看AOSP源代码,您将看到新的方法,如
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开发的人来说,了解这类应用程序之间的区别是很重要的。
发布于 2013-11-20 18:49:13
因此,经过一番研究后,很明显,priv-app中的应用程序有资格获得系统权限,就像以前的应用程序一样,可以通过在系统应用程序中获得系统权限。我能找到的唯一官方Google文档是以提交消息的形式出现的:提交散列: ccbf84f44c9e6a5ed3c08673614826bb237afc54。
有些系统应用程序比另一些系统更有系统。 "signatureOrSystem“权限不再适用于驻留在/system分区中的所有应用程序。相反,有一个新的/system/priv-app目录,只有app位于该目录中的应用程序才允许使用signatureOrSystem权限而不共享平台证书。这将减少可能利用系统捆绑应用程序的表面积,以获得权限保护操作的访问权限。 ApplicationInfo.FLAG_SYSTEM标志继续表示文档中的内容:它指示应用程序apk被捆绑在/system分区上。引入了一个新的隐藏标志FLAG_PRIVILEGED,它反映了访问这些权限的实际权限。
更新:截至Android8.0,priv略有变化,增加了特权权限Whitelisting。除了在priv-app中,您的应用程序还必须添加到白名单,以获得各种系统权限。有关这方面的信息可以在这里找到:https://source.android.com/devices/tech/config/perms-whitelist
https://stackoverflow.com/questions/19868138
复制相似问题