Android 14 权限等级剖析
Android 14 引入了新的权限等级,为应用程序访问敏感信息和功能提供了更细粒度的控制。了解这些新的权限等级及其应用场景对于开发人员至关重要。
1. 概述
Android 一直以来都使用权限机制来控制应用程序对系统资源和用户数据的访问。随着 Android 版本的更新,权限机制也在不断完善,以提高安全性并降低隐私风险。
Android 14 引入了新的权限等级,进一步细化了对应用程序权限的控制。新的权限等级可以更好地划分不同权限的风险级别,并为开发人员提供更灵活的权限管理方案。
2. 权限等级概述
Android 14 中的权限等级主要分为以下几类:
- 普通权限(normal):风险最低的权限等级,应用程序在安装时自动获得。这类权限通常不会对用户隐私或安全造成重大风险,例如访问网络、读取手机状态等。
- 危险权限(dangerous):可能对用户隐私或安全造成风险的权限等级,需要用户明确批准才能授予。这类权限包括读取联系人、访问位置、使用相机等。
- 签名权限(signature):仅授予与声明权限具有相同签名的应用程序。这类权限通常用于应用程序间通信或共享数据,例如读取已知来源的存储文件。
- 签名或系统权限(signatureOrSystem):仅授予签名应用程序或系统映像中的包。这类权限用于需要更高级别安全性的操作,例如管理设备存储。
- 特权权限(privileged):风险最高的权限等级,仅授予特权应用程序。这类权限可以访问最敏感的系统功能,例如修改系统设置、管理用户账户。
- 开发权限(development):可选地授予开发应用程序,用于调试和测试目的,例如调试网络连接、读取调试日志。
- 应用操作权限(appop):与应用操作相关的特殊权限,一些操作不需要在 Manifest 中申请权限,例如显示通知、保持弱锁、激活 VPN。
- 低于 Android 6.0 的权限(pre23):授予低于 Android 6.0 的应用程序,由于兼容性原因而保留,例如读取外部存储。
- 安装程序权限(installer):授予安装程序应用程序,用于安装和卸载应用程序。
- 验证程序权限(verifier):授予验证程序应用程序,用于验证应用程序签名。
- 预装权限(preinstalled):授予预装在系统映像上的任何应用程序,用于预装应用程序所需的功能。
- 设置向导权限(setup):授予设置向导应用程序,用于引导用户完成初始设备设置。
- 即时应用程序权限(instant):授予即时应用程序,用于轻量级、模块化的应用程序体验。
- 运行时权限(runtime):授予目标运行时权限的应用程序(Android 6.0 及以上),用户可以在运行时授予或拒绝权限,例如访问麦克风、录制视频。
- OEM 权限(oem):如果其保护级别为签名,则请求应用程序驻留在 OEM 分区,并且 OEM 已将该应用程序列入白名单,以接收此权限。通常由 OEM 用于其专有功能。
- 供应商特权权限(vendorPrivileged):授予供应商分区中的特权应用程序,用于供应商特定的硬件或功能。
- 文本分类器权限(textClassifier):授予系统默认文本分类器,用于过滤垃圾邮件和其他有害内容。
- 健康权限(wellbeing):授予 OEM 定义的健康应用程序,用于访问健康相关数据。
- 文档管理器权限(documenter):授予文档管理器,用于管理文档文件。
- 设备配置器权限(configurator):授予设备配置器,用于配置设备设置。
- 事件报告批准者权限(incidentReportApprover):批准共享事件报告的应用程序,用于收集和分析设备使用数据。
- 系统应用程序预测器权限(appPredictor):授予系统应用程序预测器,用于预测用户行为并提供个性化体验。
3. 每个权限等级的详细说明
普通权限(normal)
- 应用程序在安装时自动获得权限。
- 对其他应用程序、系统或用户的风险最小。
- 示例:访问网络、读取手机状态。
危险权限(dangerous)
- 需要用户明确批准。
- 可能访问敏感数据或对设备进行控制。
- 示例:读取联系人、访问位置、使用相机。
签名权限(signature)
- 仅授予与声明权限具有相同签名的应用程序。
- 通常用于应用程序间通信或共享数据。
- 示例:读取已知来源的存储文件。
签名或系统权限(signatureOrSystem)
- 仅授予签名应用程序或系统映像中的包。
- 用于需要更高级别安全性的操作。
- 示例:管理设备存储。
特权权限(privileged)
- 仅授予特权应用程序。
- 访问最敏感的系统功能。
- 示例:修改系统设置、管理用户账户。
开发权限(development)
- 可选地授予开发应用程序。
- 用于调试和测试目的。
- 示例:调试网络连接、读取调试日志。
应用操作权限(appop)
- 与应用操作相关的特殊权限。
- 一些操作不需要在 Manifest 中申请权限。
- 示例:显示通知、保持弱锁、激活 VPN。
低于 Android 6.0 的权限(pre23)
- 授予低于 Android 6.0 的应用程序。
- 由于兼容性原因而保留。
- 示例:读取外部存储。
安装程序权限(installer)
- 授予安装程序应用程序。
- 用于安装和卸载应用程序。
验证程序权限(verifier)
- 授予验证程序应用程序。
- 用于验证应用程序签名。
预装权限(preinstalled)
- 授予预装在系统映像上的任何应用程序。
- 用于预装应用程序所需的功能。
设置向导权限(setup)
- 授予设置向导应用程序。
- 用于引导用户完成初始设备设置。
即时应用程序权限(instant)
- 授予即时应用程序。
- 用于轻量级、模块化的应用程序体验。
运行时权限(runtime)
- 授予目标运行时权限的应用程序(Android 6.0 及以上)。
- 用户可以在运行时授予或拒绝权限。
- 示例:访问麦克风、录制视频。
OEM 权限(oem)
- 如果其保护级别为签名,则请求应用程序驻留在 OEM 分区,并且 OEM 已将该应用程序列入白名单,以接收此权限。
- 通常由 OEM 用于其专有功能。
供应商特权权限(vendorPrivileged)
- 授予供应商分区中的特权应用程序。
- 用于供应商特定的硬件或功能。
文本分类器权限(textClassifier)
- 授予系统默认文本分类器。
- 用于过滤垃圾邮件和其他有害内容。
健康权限(wellbeing)
- 授予 OEM 定义的健康应用程序。
- 用于访问健康相关数据。
文档管理器权限(documenter)
- 授予文档管理器。
- 用于管理文档文件。
设备配置器权限(configurator)
- 授予设备配置器。
- 用于配置设备设置。
事件报告批准者权限(incidentReportApprover)
- 批准共享事件报告的应用程序。
- 用于收集和分析设备使用数据。
系统应用程序预测器权限(appPredictor)
- 授予系统应用程序预测器。
- 用于预测用户行为并提供个性化体验。
4. 如何在应用程序中使用权限等级
在应用程序中使用权限等级,需要遵循以下步骤:
-
在 Manifest 文件中声明所需的权限。
在 Manifest 文件的
<uses-permission>
标签中声明您应用程序所需的权限。例如,要请求访问位置权限,请添加以下行:<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
-
对于危险权限,需要在运行时请求用户的批准。
对于需要用户明确批准的危险权限,您需要在运行时请求用户的同意。可以使用
ActivityCompat.requestPermissions()
方法来实现。例如:if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); } else { // 已经拥有权限,可以执行相关操作 }
-
使用
ContextCompat.checkSelfPermission()
检查应用程序是否具有权限。可以使用
ContextCompat.checkSelfPermission()
方法检查应用程序是否具有特定的权限。例如:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
// 已经拥有权限,可以执行相关操作
} else {
// 没有权限,需要请求或提示用户
}
- 使用
ActivityCompat.requestPermissions()
请求用户授予权限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
} else {
// 已经拥有权限,可以执行相关操作
}
- 在
onRequestPermissionsResult()
方法中处理用户的权限授予结果。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 用户授予了权限,可以执行相关操作
} else {
// 用户拒绝了权限,可以提示用户或采取其他措施
}
}
}
5. 权限等级的最佳实践
- 仅请求必要的权限。 您的应用程序应仅请求其正常运行所需的最少权限。避免请求不必要的权限,以免降低用户信任并增加隐私风险。
- 告知用户为什么要请求权限。 当您请求权限时,请向用户解释为什么需要该权限以及您的应用程序将如何使用它。这有助于建立用户信任并提高透明度。
- 尊重用户的隐私。 谨慎使用您获得的权限,并确保仅将用户数据用于其预期的目的。遵循数据隐私法规并保护用户数据安全。
- 使用运行时权限功能。 对于危险权限,请使用运行时权限功能,以便用户可以在运行时授予或拒绝权限。这使他们可以更好地控制其隐私并根据需要调整权限设置。
- 定期审查应用程序的权限使用情况。 定期审查您的应用程序使用的权限,以确保您没有请求或使用不必要的权限。
6. 总结
Android 14 引入的新权限等级提供了更细粒度的控制,可提高安全性并降低隐私风险。开发人员应了解新的权限等级并以负责任的方式使用它们。