Android O 开始,特许权限白名单

本文介绍Android系统中特许权限白名单的概念及其配置方法。从Android 8.0开始,设备实现人员可以通过白名单机制控制特权应用所获得的权限。文章详细说明了白名单文件的组织方式及生成方法,并提供了缺失权限的查找与自定义白名单的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://source.android.google.cn/devices/tech/config/perms-whitelist?hl=zh-cn

特许权限白名单

特权应用是位于系统映像 /system/priv-app 目录下的系统应用。过去,设备实现人员几乎无法控制可以向特权应用授予哪些签名|特许权限。从 Android 8.0 开始,实现人员可以将特权应用显式加入到 /etc/permissions 目录下的系统配置 XML 文件的白名单中。未在这些 XML 文件中明确列出的应用不会被授予特许权限。

添加白名单

应用的权限白名单可列在位于 frameworks/base/etc/permissions 目录下的单个或多个 XML 文件中,如下所示:

  • /etc/permissions/privapp-permissions-OEM_NAME.xml
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

对于如何组织内容,没有严格的规则。设备实现人员可以决定内容结构,只要将 /system/priv-app 下的所有应用均列入白名单即可。例如,Google 针对由 Google 开发的所有特权应用提供了一个白名单。我们建议使用以下组织方式:

  • 对于已包含在 Android 开源项目 (AOSP) 树中的应用,将其权限列在 /etc/permissions/privapp-permissions-platform.xml 中。
  • 对于 Google 应用,请将其权限列在 /etc/permissions/privapp-permissions-google.xml 中。
  • 对于其他应用,请使用以下格式的文件:/etc/permissions/privapp-permissions-DEVICE_NAME.xml

生成白名单

要针对系统映像上提供的所有应用自动生成白名单,请使用位于以下位置的 AOSP 命令行工具:development/tools/privapp_permissions/privapp_permissions.py。要生成特定于设备的 privapp-permissions.xml 的初始版本,请执行以下操作:

  1. 编译系统
. build/envsetup.shlunch PRODUCT_NAMEmake -j

2.运行 privapp_permissions.py 脚本以生成一个 privapp-permissions.xml 文件,该文件会列出需要列入白名单的所有签名|特许权限:

development/tools/privapp_permissions/privapp_permissions.py

此工具会打印可在 /etc/permissions 下作为单个文件或拆分为多个文件的 XML 内容。 如果设备已在/etc/permissions 目录下包含白名单,则该工具将仅打印出差异内容(也就是说,只打印缺少的将列入白名单的签名|特许权限)。这对审核也很有用,当添加新版本的应用时,该工具会检测所需的其他权限。

3. 将生成的文件复制到 /etc/permissions 目录下,系统在启动过程中将从这里读取这些文件。

自定义白名单

AOSP 包含可视需要自定义的白名单实现。 对于包含在 AOSP 中的应用,其权限已在 /etc/permissions/privapp-permissions-platform.xml 中列入白名单。

默认情况下,privapp_permissions.py 脚本生成的输出会自动授予特权应用所请求的任何权限。如果有应被拒绝的权限,请修改 XML 以使用“拒绝权限”标记而非“权限”标记。例如:

<!--
    This XML file declares which signature|privileged permissions should be
    granted to privileged applications that come with the platform
    -->
    <permissions>
<privapp-permissions package="com.android.backupconfirm">
    <permission name="android.permission.BACKUP"/>
    <permission name="android.permission.CRYPT_KEEPER"/>
</privapp-permissions>
<privapp-permissions package="com.android.cellbroadcastreceiver">
    <!-- don't allow application to interact across users -->
    <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/>
    <permission name="android.permission.MANAGE_USERS"/>
    <permission name="android.permission.MODIFY_PHONE_STATE"/>
    <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
    <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
</privapp-permissions>
    ...

查找缺少的权限

在启动新设备时,可通过启用过渡日志模式来查找缺少的权限:

ro.control_privapp_permissions=log

违规行为会在日志文件中予以报告,但仍然会授予权限。 这样可在提供违规行为列表的同时,使设备仍然处于工作状态。错误消息格式如下:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions whitelist

所有违规行为均必须通过将应用加入白名单来予以解决。如果未加入,这些应用将不会被授予缺少的权限,即使它们位于 priv-app 路径中也是如此。

强制执行白名单

白名单列好后,可通过设置版本属性 ro.control_privapp_permissions=enforce 来启用运行时强制执行。

注意ro.control_privapp_permissions 属性状态必须符合 CDD 部分 9.1 的要求

### 如何在Android中为内置应用配置和授予运行时权 对于内置应用程序,在 Android 中配置和授予运行时权的过程遵循特定的安全机制。由于这些应用通常由设备制造商预安装并可能拥有特殊权,因此处理方式有所不同。 #### 权声明 为了使任何应用能够请求敏感数据或执行某些操作,必须先在其 `AndroidManifest.xml` 文件中声明所需权。对于内置应用而言,这一步骤同样适用: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ``` 此类权声明告知操作系统该应用打算使用的功能范围[^2]。 #### 动态权请求 自 Android 6.0 (API level 23) 起引入了动态权模型,这意味着即使是在清单文件里声明过的危险级别的权也需要在运行期间向用户申请授权。然而,对于系统级的应用程序来说,它们可能会自动获得一些默认权而不必每次都弹窗询问用户同意。 当涉及到像读取电话状态这样的高风险行为时,则需特别注意权保护等级以及是否具备相应的特许条件。例如,从 API 级别 29 开始,访问不可重置标识符(如IMEI)需要持有 `READ_PRIVILEGED_PHONE_STATE` 这样的特权权,而这仅适用于系统组件而非普通第三方软件[^1]。 #### 用户交互与管理 尽管内置应用可以简化部分流程,但仍有必要提供清晰的用户体验来让用户控制哪些服务被允许使用个人资料或其他重要资源。通过设置界面中的“应用详情页”,最终使用者可以选择开启或关闭各个已知项下的具体许可选项。 #### 示例代码展示如何实现基本的权检查逻辑: ```java if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); } ``` 这段 Java 代码片段展示了开发者应怎样编写用于检测当前是否有摄像头使用权的方法,并适时发起请求以获取必要的批准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值