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

所以在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的软件包pipe理器添加活动,除非您是系统应用程序。 这并不排除特权应用程序,据我所知(这里有很多的逻辑,我可能是错的)。

我的问题是什么意思? 如果我的应用程序是有特权的,但不是系统,会有什么不同? 在PackageManagerService你可以find系统和特权应用程序之间不同的东西,它们并不完全相同。 特权应用背后应该有某种意识形态,否则他们只会说:

 if locationIsPrivileged: app.flags |= FLAG_SYSTEM 

并完成了它。 这是一个新概念,我认为从4.4开始进行AOSP开发的任何人都知道这些types的应用程序之间的区别是很重要的。

因此,经过一番深入的研究,很明显priv-app中的应用程序有资格获得系统权限,这与旧版应用程序有资格通过在system-app中声明系统权限的方式相同。 我能find的唯一官方Google文档是以提交消息的forms提交的:Commit hash:ccbf84f44c9e6a5ed3c08673614826bb237afc54

有些系统应用比其他系统应用更为系统

“signatureOrSystem”权限不再可用于/ system分区中的所有应用程序。 相反,有一个新的/ system / priv-app目录,只有那些在该目录中的APK被允许使用signatureOrSystem权限而不共享平台证书。 这将减less系统绑定应用程序可能利用的表面区域,以尝试访问受权限保护的操作。

ApplicationInfo.FLAG_SYSTEM标志继续表示它在文档中所说的内容:它表示应用程序apk已经捆绑在/ system分区上。 已经引入了一个新的隐藏标志FLAG_PRIVILEGED,它反映了访问这些权限的实际权限。

我的观点是,priv-app有root权限。 假设如果你在系统/应用程序中安装了一个根目录的应用程序,它仍然需要supersu来授予root权限。 但是,如果你在system / priv-app中安装相同的root应用程序,则根本不需要超级用户。 我已经观察了这一点,同时尝试一个ROM,清理所有的chineese应用程序安装adaway,titanium等。

从我在网上的红色,priv-app只用于谷歌的应用程序。 如果您仍然需要使用系统权限运行应用程序,则应继续使用/ system / app。 您在问题中发布的方法实际上是由Google应用使用的!