Android Marshmallow,"危险"保护级别和系统组件/应用程序

Tal*_*nel 9 android android-firmware android-permissions android-6.0-marshmallow

我正在开发一个将在固件上预安装(作为系统应用程序)的应用程序.

从文档到目前为止关于系统应用程序,新权限模型和保护级别之间的关系- 我不清楚系统应用程序何时需要(如果有的话)请求用户权限.

当我尝试使用WRITE_EXTERNAL_STORAGE权限时,我的问题就出现了.从文档中我可以看到它被标记为"危险"的许可.

- "危险"权限是否自动授予系统应用程序?

当我使用WRITE_EXTERNAL_STORAGE权限(作为系统应用程序)我得到安全异常,我不知道是否意味着即使我的应用程序安装为系统应用程序也很困难 - 用户必须请求"危险"权限.

还有一点需要提一下:
要将应用程序行为检查为系统应用程序,我将我的应用程序APK安装在sys-priv运行SDK预览3的nexus 5 的目录(设备已植根)上.这是我获得安全性异常的时候在使用方法时需要外部存储权限..

小智 8

经过大量的挖掘和调试,我终于找到了一些在系统应用程序的marshmallow上授予运行时权限的线索,这个堆栈溢出票证中有很多灵感.

关键逻辑在DefaultPermissionGrantPolicy中.在systemReady之后,PackageManagerService检查是否尚未设置此用户的默认运行时权限(即,这是一个新用户),如果是这样,PackageManagerService调用DefaultPermissionGrantPolicy.grantDefaultPermissions()来检查/授予权限:

public void grantDefaultPermissions(int userId) {
    grantPermissionsToSysComponentsAndPrivApps(userId);
    grantDefaultSystemHandlerPermissions(userId);
}
Run Code Online (Sandbox Code Playgroud)

在两种情况下,您的内置应用程序可能会自动获得运行时权限.

A> grantPermissionsToSysComponentsAndPrivApps - >将使用FLAG_PERMISSION_SYSTEM_FIXEDFLAG_PERMISSION_GRANTED_BY_DEFAULT授予运行时权限.

  • 如果您的系统应用程序的uid <10000,则将授予您对用户组的权限.
  • 如果您的系统应用程序适合所有以下条件,它将被授予权限.

    1. 是特权App(在/ system/priv-app /下)
    2. 是持久的(android:persistent ="true")
    3. 用平台签名签名.

B> grantDefaultSystemHandlerPermissions - >将使用FLAG_PERMISSION_GRANTED_BY_DEFAULT授予运行时权限.

  • 如果您的应用程序被视为"默认平台处理程序应用程序",(即您的应用程序"预期可以开箱即用",如相机,拨号程序,短信,日历.etc,您可以在方法grantDefaultSystemHandlerPermissions中阅读更多内容()).

除此之外,只要将targetSdk设置为23,您的系统应用程序就需要要求用户授予危险权限.


Com*_*are 5

引用第二次M预览的发行说明:

系统映像中包含的应用程序不再自动被授予危险权限.所有应用程序都应在运行时检查并请求权限.

这符合我记得当我第一次使用带有最终(?)6.0预览固件的Nexus 5上的相机应用程序时看到的内容 - 它也要求获得运行时权限.

因此,AFAIK,系统应用程序必须要求运行时权限,非系统应用程序也是如此.

  • @TalKanel:由于它以"否,系统应用程序不需要请求运行时权限"开头,然后改为"好吧,实际上,系统应用程序*需要请求运行时权限",如果它发生变化我会感到惊讶背部.我假设设备制造商/ ROM模块有一些方法可以预先填充授予权限的数据库.但由于用户始终可以撤消这些权限,因此您仍需要执行一些运行时权限检查. (2认同)