运行时权限

在 Android 6.0 及更高版本中,Android 应用权限模式旨在使权限更易于用户理解、更实用且更安全。该模式将需要危险权限(请参阅受影响的权限)的 Android 应用从安装时权限模式切换为运行时权限模式:

  • 安装时权限

    Android 5.1 及更低版本)用户在安装或更新应用时向应用授予危险权限。设备制造商和运营商可以在不通知用户的情况下,预安装已预先获取相关权限的应用。

  • 运行时权限

    (Android 6.0 - 9) 用户在应用运行时向应用授予危险权限。何时申请权限(例如,在应用启动时或用户访问特定功能时申请权限)取决于应用,但用户可授予/拒绝应用访问特定权限组的权限。OEM/运营商可以预安装应用,但除非通过例外流程,否则无法预先授予权限。(请参阅创建例外情况。)

    (Android 10) 用户可以更深入地了解情况,并控制哪些应用具有运动状态识别 (AR) 运行时权限。运行时权限对话框会提示用户选择是始终允许、在使用时允许还是拒绝权限。在将操作系统升级到 Android 10 的过程中,已授予应用的权限将保留,但用户可以转到设置并进行更改。

运行时权限可防止应用在未经用户同意的情况下获取对私有数据的访问权限,还可以为用户提供应用正在寻求或已被授予的各类权限的额外上下文和详细信息。运行时模式鼓励开发者帮助用户了解应用请求权限的原因,并向用户透明展示,以便用户更好地决定是授予还是拒绝权限。

受影响的权限

Android 6.0 及更高版本要求危险权限必须使用运行时权限模式。危险权限是具有更高风险的权限(例如 READ_CALENDAR),此类权限允许请求授权的应用访问用户私人数据或获取设备控制权(这可对用户造成不利影响)。要查看危险权限列表,请运行以下命令:

adb shell pm list permissions -g -d

Android 6.0 及更高版本不会更改常规权限的行为。这些都是非危险权限,包括常规权限、系统权限和签名权限。常规权限是具有较低风险的权限(例如 SET_WALLPAPER),此类权限允许请求授权的应用访问隔离的应用级功能,对其他应用、系统或用户的风险非常小。在 Android 5.1 及更低版本中,系统在安装应用时,自动向请求授权的应用授予常规权限,并且不会提示用户进行批准。如需详细了解权限,请参阅 <permission> 元素文档。

Android 10 中的硬性限制和软性限制

除了可能具有危险性之外,权限要么受硬性限制,要么受软性限制。无论是哪种情况,必须将受限权限列入白名单。未列入白名单的硬性限制的行为与未列入白名单的软性限制有所不同:

  • 硬性限制)无法向应用授予未列入白名单的权限。
  • 软性限制)未列入白名单的应用会根据它们请求的特定权限进行操作。所请求权限的公共文档中描述了相应的行为。

安装应用时,安装程序(例如 Google Play 商店)可能会选择不将应用的受限权限列入白名单。权限受平台限制,并且仅当应用满足每个平台政策的特殊条件时才可授予权限。例如,受到硬性限制的权限类型包括短信和通话记录权限。

列入白名单的操作在安装期间及以下情况下执行:

  • 在从 Android 9 升级到 10 期间,应用已安装。
  • 已预授予某个权限或预安装某个应用。
  • 已定义的角色在将权限列入白名单时需要某个权限。
  • 安装程序(例如 Google Play 商店)将权限标记为已列入白名单。

用户无法手动将权限列入白名单。

要求

运行时权限模式适用于所有应用,包括预安装应用和在设置过程中提供给设备的应用。应用的软件要求如下:

  • 在搭载 Android 6.0 及更高版本的所有设备上,运行时权限模式必须保持一致。此一致性可通过 Android 兼容性测试套件 (CTS) 测试来保证。
  • 应用必须提示用户在运行时授予应用权限。如需了解详情,请参阅更新应用。在少数例外情况下,可向默认应用和处理程序授予权限。这些默认应用和处理程序将提供设备预期操作所必需的基本设备功能(例如,设备中用于处理 ACTION_CALL 的默认拨号程序应用可以获得访问电话的权限)。如需了解详情,请参阅创建例外情况
  • 拥有危险权限的预加载应用必须以 API 级别 23 为目标并保持运行时权限模式。也就是说,应用安装期间界面流程不得偏离 PermissionController 的 AOSP 实现,且用户可以撤销预安装应用的危险权限等。
  • 无头应用必须使用 Activity 来请求权限,或与其他拥有必要权限的应用共享 UID。如需了解详情,请参阅无头应用

权限迁移

更新到 Android 6.0 或更高版本后,授予 Android 5.x 应用的权限仍然有效,但用户可以随时撤消此类权限。

在从 Android 9 更新到 Android 10 的过程中,所有受硬性限制的权限都会列入白名单。如需详细了解如何实现前台/后台拆分权限,请参阅 Android 10 隐私权更改(从在后台请求访问位置信息开始)。

集成

在向 Android 6.0 及更高版本集成应用运行时权限模式时,必须先更新预安装应用,然后才能使用新模式。您也可以为核心功能的默认处理程序/提供程序定义例外情况,定义自定义权限,以及自定义 PermissionController 中使用的主题背景。

更新应用

系统映像上的应用和预安装应用不会自动被预先授予权限。我们建议您与预安装应用的开发者(OEM、运营商和第三方)合作,根据开发者指南对应用进行必要的修改。具体来说,您必须保证对预安装应用进行修改,以避免用户在撤消权限时造成应用的崩溃和其他问题。

预加载应用

在 Android 9 及更低版本中,使用危险权限的预加载应用必须以 API 级别 23 或更高级别为目标,并保持 Android 6.0 及更高版本的 AOSP 权限模式。例如,应用安装期间界面流程不得偏离 PermissionController 的 AOSP 实现。用户甚至可以撤消预安装应用的危险权限。

Android 6.0 到 Android 9.0 会在安装流程中授予一些权限。不过,从 Android 10 开始,安装流程(由 Package Installer 应用执行)与权限授予(在 Permission Controller 应用中)将是不同的功能。

无头应用

只有 Activity 可以请求权限。服务无法直接请求权限。

  • 在 Android 5.1 及更低版本中,无头应用无需使用 Activity 即可在安装或预安装时请求权限。
  • 在 Android 6.0 及更高版本中,无头应用必须使用以下方法之一来请求权限:
    • 添加 Activity 以请求权限(这是推荐方法)。
    • 与具有必要权限的其他应用共享 UID。仅当您需要将多个 APK 视作单个应用进行处理时,才推荐使用此方法。

这样做是为了避免突兀的权限请求让用户迷惑。

自定义 PackageInstaller 界面

如有需要,您可以自定义权限界面主题背景,只需更新 PackageInstaller 所用的默认设备主题背景(Theme.DeviceDefault.SettingsTheme.DeviceDefault.Light.Dialog.NoActionBar)即可。但是,由于一致性对应用开发者来说至关重要,您不可以自定义权限界面出现时的位置、定位和规则。

要包含其他语言的字符串,请将此类字符串提交给 AOSP。

创建例外情况

通过使用 PackageManager 中的 DefaultPermissionGrantPolicy.java 类,您可以向作为核心操作系统功能的默认处理程序或提供程序的应用进行预授权。示例:

ACTION_CALL (Dialer) Default
Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default
Phone, Contacts, SMS

自定义权限

您可以将自定义权限和组定义为常规或危险级别,并将 OEM/运营商特有的权限添加到现有权限组中,该功能与 Android 5.x 和更低版本中的功能相同。

在 Android 6.0 及更高版本中,如果您添加了新的危险权限,该权限的处理方式必须与其他危险权限的处理方式相同(在应用运行时请求权限,且用户可以撤消权限)。具体而言:

  • 您可以向当前组添加新权限,但不可以修改危险权限和危险权限组的 AOSP 映射(换句话说,您不能从组中删除权限再将该权限分配给其他组)。
  • 您可以向安装在设备上的应用添加新的权限组,但不能向 Android 平台清单中添加新的权限组。

测试权限

Android 含有兼容性测试套件 (CTS) 测试,可验证各个权限是否映射到正确的组中。Android 6.0 及更高版本中的 CTS 兼容性要求必须通过此类测试。