所以在 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 开发的任何人来说,了解这些类型的应用程序之间的区别非常重要。