Android 隐藏的 appops 权限机制是怎么回事
appops 是什么
Android 系统中有一个叫做 appops(Application Operations)的系统服务。它定义了一系列"应用操作"(application operation, op),这些操作描述了应用能够执行的具体行为。
其中部分操作与系统权限对应(比如 OP_CAMERA 对应"相机权限"),其余则对应单独的系统没有开放控制的功能(比如 OP_READ_CLIPBOARD 读取剪贴板,但并不存在一个"读取剪贴板权限"可以在系统设置里开关)。
appops 与系统权限的关系
原生 Android 使用 appops 来追踪权限使用,同时也部分用于权限控制。每个应用都有自己的 appops 设置,当应用尝试执行某个操作时:
- 系统先检查该应用是否被授予了对应的运行时权限
- 同时检查该操作对应的 appops 设置
- 如果没有授予运行时权限,应用收到错误
- 如果 appops 被设为忽略,应用不会收到错误,但只会收到空白数据——这是 App Ops 的核心价值
为什么原生 Android 不提供 appops 修改界面
从历史来看,Android 的 appops 服务早在 Android 4.3 就引入了"隐藏权限"功能,但谷歌从未在系统设置里开放用户可配置的界面。可能的原因包括:
- appops 是 Android 内部实现细节,谷歌认为不应当暴露给普通用户
- 不同 Android 版本中 appops 的行为差异较大,谷歌不愿意为它提供稳定的用户体验承诺
- 部分厂商定制 ROM 会添加自己的 appops 权限,谷歌不想统一管理这部分差异
正因如此,App Ops 这类第三方工具才有了存在的必要。
appops 的两种模式
每个 op 在系统中都有两种 mode:
- package mode:针对应用包名的设置
- uid mode:针对用户 ID 的设置(当应用以不同用户身份运行时有不同的设置)
uid mode 有更高优先级——只有当 uid mode 为默认值时,系统才会使用 package mode。这直接影响 App Ops 权限设置在不同 Android 版本上的生效行为,详见 Android 版本差异。
能修改哪些 appops
App Ops 能修改的 appops 范围完全取决于你的 Android 系统版本,通常系统版本越高能修改的越多。厂商自定义 ROM 可能会添加自己的 appops 项,也可能移除某些标准项。
App Ops 应用内可以在"设置 → 行为 → 全部权限"中查看当前系统支持的所有 appops 列表。
