Android棉花糖,"dangerous"防护等级和系统components/apps

Android Marshmallow, "dangerous" protection level and system components/apps

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

到目前为止关于 system apps, new permissions model, and the protection levels 之间关系的文档 - 我不明白系统应用程序何时需要(如果有的话)请求用户许可。

当我尝试使用 WRITE_EXTERNAL_STORAGE 权限时,我的问题就开始了。从文档中我可以看到它被标记为 "dangerous" 权限。

- "dangerous" 权限会自动授予系统应用程序吗?

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

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

引用 the release notes for the 2nd M preview:

Apps included in the system image are no longer granted dangerous permissions automatically. All apps should check for and request permissions at runtime.

这符合我第一次在带有最终(?)6.0 预览版固件的 Nexus 5 上使用普通相机应用程序时看到的内容——它也要求运行时许可。

所以,据我所知,系统应用程序必须请求运行时权限,非系统应用程序也是如此。

经过大量的挖掘和调试,我终于找到了一些为系统应用程序授予棉花糖运行时权限的线索,在中得到了很多启发。

关键逻辑在DefaultPermissionGrantPolicy。 systemReady 后,PackageManagerService 会检查该用户的默认运行时权限是否还没有设置(即这是一个新用户),如果是,PackageManagerService 调用 DefaultPermissionGrantPolicy.grantDefaultPermissions() 到 check/grant 权限:

public void grantDefaultPermissions(int userId) {
    grantPermissionsToSysComponentsAndPrivApps(userId);
    grantDefaultSystemHandlerPermissions(userId);
}

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

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

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

    1. 是特权应用程序(在/system/priv-app/下)
    2. 是持久的(android:持久="true")
    3. 已使用平台签名。

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

  • 如果您的应用被认为是 "default platform handler app",(即您的应用是 "expected to work out-of-the-box",如相机、拨号器、短信、日历等,您可以在方法 grantDefaultSystemHandlerPermissions()).

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