PermissionController

PermissionController Mainline 模块包含隐私权政策以及与授予和管理权限相关的界面(例如,用于授予和管理权限的政策和界面)。

关于 PermissionController

PermissionController 模块处理与权限相关的界面、逻辑和角色,以允许应用访问特定用途。它控制以下各项

  • 运行时权限授予(包括向系统应用授予权限)
  • 运行时权限管理(包括权限分组)
  • 运行时权限用量跟踪
  • 角色

从 Android 12 开始,Role 的框架和系统服务器类已移入模块,以使 Role 完全模块化。

在 Android 10 中,软件包安装程序应用被拆分为多个部分,以便能够更新权限逻辑。作为可更新的 Mainline 模块,PermissionController

  • 仅通过稳定的 @SystemApi 与框架互动(不使用 @hide API)。
  • 处理优先级 > 0 的权限相关 Intent。
  • 提供一种机制,使 OEM 能够自定义主题。
  • 提供系统和应用程序可以绑定的服务,包括角色管理、权限撤销和基本权限信息(用于“设置”)。
  • 支持对未使用的应用自动撤销权限(Android 11 中的新功能)。

在 Android 9 中,权限控制是 com.android.packageinstaller 的一部分。

对未使用的应用自动撤销权限

在 Android 11 中,PermissionsController 模块可以自动撤销长时间未使用的应用的运行时权限。以 SDK 30 或更高版本为目标平台的应用默认情况下启用自动撤销,而以 SDK 29 或更低版本为目标平台的应用默认情况下停用自动撤销。启用后,自动撤销会影响所有运行时权限,但会豁免所有预先授予的权限,包括政策和系统固定的权限以及默认或按角色授予的权限。有关详情,请参阅自动重置未使用的应用的权限

软件包格式

PermissionController 模块的格式在不同版本之间有所不同。

  • 在 Android 11 或更高版本中,PermissionController 模块采用 APEX 格式,并且是可更新的。软件包名称为 com.google.android.permission

  • 在 Android 10 中,PermissionController 模块采用 APK 格式,并且不可更新。软件包名称为 com.google.android.permissioncontroller

模块边界

在 Android 12 中,Permission 模块代码从 packages/apps/PermissionController(即 platform/packages/apps/PackageInstaller 项目)和 frameworks/base/apex/permission(这是 frameworks/base 项目的子目录)移出。

packages/modules/Permission 的新项目结构如下

  • 来自 frameworks/base/apex/permission 的文件
  • 来自 packages/apps/PermissionController 的 PermissionController 文件

OEM 可以使用示例命令来帮助将其补丁从原始项目目录移动到新项目目录。

从 frameworks/base/apex/permission 移动补丁

root/frameworks/base/$ git format-patch -1 --relative=apex/permission commit --stdout > patch-file.txt

root/packages/modules/Permission$ git am -p2 patch-file.txt

从 packages/apps/PermissionController 移动补丁

root/packages/apps/PermissionController$ git format-patch -1 commit --stdout > patch-file.txt

root/packages/modules/Permission$ git am -p2 --directory=PermissionController patch-file.txt

自定义

OEM 可以使用运行时资源叠加层 (RROS)自定义权限 UI 主题(颜色、边距、字体和可绘制对象)。