10

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

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

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

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

当我使用WRITE_EXTERNAL_STORAGE权限(作为系统应用程序)时,我遇到了安全异常,我不知道这是否意味着即使将我的应用程序安装为系统应用程序也很困难——用户必须请求“危险”权限。

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

4

2 回答 2

9

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

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

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

在两种情况下,您的内置应用程序可能会被自动授予运行时权限。

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

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

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

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

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

于 2016-07-28T07:09:52.267 回答
5

引用2nd M 预览版的发行说明

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

这与我记得当我第一次在带有最终(?)6.0 预览固件的 Nexus 5 上使用股票相机应用程序时看到的情况相吻合——它也要求运行时权限。

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

于 2015-09-06T12:49:52.833 回答