Android 权限

Android 权限提供多种控件,可提高用户的安全意识并限制应用访问敏感数据。在 Android 8.0 及更低版本上配置权限包括加入许可名单,否则,即使特权应用位于 priv-app 路径中,也会被停用。在 Android 9 及更高版本中,尝试使用未正确加入许可名单的应用的设备将无法启动。

Android 10 引入了角色的概念,即系统中与特定要求和特权关联的唯一名称。将角色分配给应用,以便授予它们用于特定用途的权限,并使用平台配置资源配置默认角色。

针对潜在有害应用 (PHA) 增加保护措施,可以改进

  • 潜在有害应用行为的透明度。
  • 用户对应用行为的控制。
  • 应用开发者在使用受权限保护的私有数据时的自由裁量权。

软件包安装和权限

在 Android 9 及更低版本中,软件包安装和权限控制功能包含在 PackageInstaller 软件包(//packages/apps/PackageInstaller)中。在 Android 10 及更高版本中,权限控制功能位于单独的软件包 PermissionController//packages/apps/PermissionController)中。图 1 说明了这两个软件包在 Android 10 中的位置。

Separation of package install
and permission control functionalities for system apps and as used by user-
installed apps

图 1. Android 10 中的软件包安装和权限控制功能

许可名单和访问权限

在 Android 6.0 及更高版本中,应用在运行时请求访问危险权限。Android 10 添加了 Activity Recognition (AR) 运行时权限,它会提示用户修改或允许危险权限。

Android 8.0 要求您在 /etc/permissions 目录中的系统配置 XML 文件中显式地将特权应用加入许可名单。在 Android 9 及更高版本中,必须将特权权限加入许可名单,否则设备将无法启动。

为了限制内部 API 可见性并防止应用意外访问平台库,Android 7.0 引入了原生库命名空间。它将系统库与应用库分开,设备制造商可以添加自己的原生库。

从 Android 10 开始,应用必须同时拥有签名权限和用户同意才能访问设备的屏幕内容。依赖于静默捕获功能(例如截取屏幕截图)的特权应用应改用 MediaProjection 类。

Android 15 要求您在 /etc/permissions 目录中的系统配置 XML 文件中,显式地非系统应用请求或系统应用更新新请求的平台签名权限加入许可名单。

透明度和隐私权

在 Android 6.0 及更高版本中,设备出厂 MAC 地址受到保护,Wi-Fi 服务提供商和数据包分析器无法访问。自 Android 10 起,其他限制措施限制应用访问不可变的设备标识符 (ID),除非这些应用已加入特权权限许可名单。(连接部分提供了关于设备标识符的相关讨论,因为这会影响运营商。)

在 Android 9 及更低版本中,用户在授予应用位置信息访问权限时会做出持久性选择。从 Android 10 开始,三态位置信息权限功能为用户提供了三个选项来允许应用访问设备的位置信息。这些权限要求适用于 Android 10 中的应用,而与目标 SDK 无关。

从 Android 10 开始,为其他透明度和隐私权功能配置权限

简化的配置

Android 6.0 及更高版本简化了权限配置。

  • init 启动的服务的环境功能将服务配置的所有方面都保留在一个 .rc 文件中。为不是由 init 启动的服务设置功能时,请改用 fs_config.c 配置文件系统功能。
  • Android 7.x 及更低版本扩展了 Android ID (AID) 机制,使用特定于设备的 android_filesystem_config.h 文件来指定文件系统功能和/或自定义设备制造商 AID。Android 8.0 及更高版本支持扩展文件系统功能的新方法
  • 在 Android 8.0 中,USB 命令处理从特定于设备的 init 脚本(HAL 层的替代方法)移出,并移入原生 USB 守护程序中。在搭载 Android 8.0 及更高版本的每台设备上,都必须实现 USB HAL 接口。