应用权限最佳实践

权限请求保护设备上可用的敏感信息,只有在访问信息对于应用的运行必不可少时才应使用。本文档提供了一些建议,说明您如何在不请求访问此类信息的情况下实现相同(或更好)的功能;它并非对 Android 操作系统中权限的工作方式进行详尽的讨论。

有关 Android 权限的更一般性概述,请参阅权限概述。有关如何在代码中使用权限的详细信息,请参阅请求应用权限

Android 6.0 及更高版本中的权限

在 Android 6.0(API 级别 23)及更高版本中,应用可以在运行时向用户请求权限,而不是在安装之前请求。这允许应用在实际需要受服务保护的服务或数据时请求权限。虽然这不会(必然)改变整体应用行为,但它确实会对处理敏感用户数据的方式带来一些变化。

增加情境上下文

系统会在运行时提示用户(在您的应用上下文中)是否允许访问这些权限组涵盖的功能。用户对请求权限的上下文更为敏感,如果您的请求与应用的目的不符,那么向用户提供详细说明您为何请求权限就更为重要。只要有可能,您都应该在请求时以及用户拒绝请求后的后续对话框中提供请求说明。

为了提高权限请求被接受的可能性,请仅在需要特定功能时才进行提示。例如,只有当用户点击麦克风按钮时,才提示访问麦克风。用户更有可能允许他们预期的权限。

更大的权限授予灵活性

用户可以在请求权限时和在设置中拒绝访问单个权限, *但* 他们仍然可能会对由此导致的功能中断感到意外。最好监控有多少用户拒绝了权限(例如,使用 Google Analytics),以便您可以重构应用以避免依赖该权限,或者更好地解释为什么您的应用需要该权限才能正常工作。您还应该确保您的应用在用户拒绝权限请求或在设置中关闭权限时能够处理异常。

增加的事务负担

系统会要求用户分别授予权限组的访问权限,而不是作为一个整体授予。这使得最大限度地减少您请求的权限数量至关重要。这增加了用户授予权限的负担,因此增加了至少一个请求被拒绝的可能性。

需要成为默认处理程序的权限

某些应用依赖于访问与通话记录和短信相关的敏感用户信息。如果您想请求与通话记录和短信相关的特定权限并将您的应用发布到 Play 商店,则必须在请求这些运行时权限之前,提示用户将您的应用设置为核心系统功能的 *默认处理程序*。

有关默认处理程序的更多信息(包括向用户显示默认处理程序提示的指南),请参阅仅在默认处理程序中使用的权限指南

了解您正在使用的库

有时,您的应用中使用的库需要权限。例如,广告和分析库可能需要访问 LOCATION 权限组才能实现所需的功能。但从用户的角度来看,权限请求来自您的应用,而不是库。

正如用户会选择使用较少权限来实现相同功能的应用一样,开发者也应该审查其库并选择不使用不必要权限的第三方 SDK。例如,如果您正在使用提供位置功能的库,请确保您没有请求 FINE_LOCATION 权限,除非您正在使用基于位置的目标定位功能。

限制后台访问位置

当您的应用在后台运行时,访问位置 应该对应用的核心功能至关重要,并向用户展示明显的益处。

测试两种权限模型

在 Android 6.0(API 级别 23)及更高版本中,用户在运行时授予和撤销应用权限,而不是在安装应用时这样做。因此,您必须在更广泛的条件下测试您的应用。在 Android 6.0 之前,您可以合理地假设,如果您的应用正在运行,则它具有应用清单中声明的所有权限。现在,用户可以为 *任何* 应用打开或关闭权限,而不管 API 级别如何。您应该进行测试以确保您的应用在各种权限场景下都能正常运行。

以下提示将帮助您查找在运行 API 级别 23 或更高版本的设备上权限相关的代码问题。

  • 确定您应用的当前权限和相关的代码路径。
  • 测试跨权限保护的服务和数据的用户流程。
  • 使用各种已授予或已撤销权限的组合进行测试。例如,相机应用可能会在其清单中列出 CAMERAREAD_CONTACTSACCESS_FINE_LOCATION。您应该测试这些权限分别处于打开和关闭状态下的应用,以确保应用能够优雅地处理所有权限配置。
  • 使用adb工具通过命令行管理权限
    • 按组列出权限及其状态
      $ adb shell pm list permissions -d -g
    • 授予或撤销一个或多个权限
      $ adb shell pm [grant|revoke] <permission-name> ...
  • 分析你的应用中使用权限的服务。

其他资源