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