appops 中文文档 下载 App

permission flags 是什么为什么 App Ops 需要它

三层独立的权限控制

Android 完整的权限控制由三层构成:

层级系统组件App Ops 能否操作说明
1. 运行时权限(runtime permission)PackageManagerShizuku 模式可设置系统面板里能看到的权限开关
2. appopsAppOpsServiceShizuku/DPM 模式都可操作App Ops 直接操作的隐藏权限层
3. permission flagsPackageManager只有 Shizuku 模式可设置决定运行时权限的可修改性和条件性

permission flags 是什么

permission flags 是附加在每个运行时权限上的标志位,决定了该权限的额外行为。重要的 flags 包括:

为什么 App Ops 必须关心 permission flags

App Ops v5.0.0 之前的版本只管理 appops 层,完全忽略了 permission flags。这在 Android 11 上导致严重问题:

问题场景

在 Android 11 上,系统有"每次都询问"权限状态。要实现这个状态,需要:

  1. 运行时权限(runtime permission)设为 allow
  2. appops 设为 ignore(让系统每次都检查是否临时授予)
  3. permission flags 设为 FIXED(锁定,让系统不能自动重置)

App Ops 旧版本只做了第 1、2 步,没做第 3 步——系统重置时发现没有 FIXED 标志,就把 appops 从 ignore 重置为 allow,"每次都询问"状态就失效了。

三种工作模式的 flags 能力对比

能力Shizuku 模式DPM 模式已移除的 Root 模式
读取 permission flags✅❌❌
设置 permission flags✅❌❌
修改 runtime permission✅部分❌
修改 appops✅✅✅

结论:只有 Shizuku 模式具备完整的三层操作能力。这也是为什么:

Android 11 自动重置的真正原因

Android 11 引入的 appops 自动重置机制有两个触发条件:

  1. 系统认为"运行时权限状态和 appops 状态不一致"
  2. permission flags 中没有 FIXED 或 USER_FIXED

当 App Ops 设置"运行时权限 allow + appops ignore"但没设 FIXED flag 时,系统重置机制会检测到"不一致"且没有锁定标志,就把 appops 改回 allow 以"同步"两层状态。

Shizuku 模式如何正确处理

Shizuku 模式提供了完整的 Binder 接口,让 App Ops 可以通过 Java API:

  1. 在设置 appops 的同时读取和修改 permission flags
  2. 检测运行时权限状态和 appops 状态的组合是否正确
  3. 在系统可能重置的场景下提前设置 FIXED 标志位

这就是 App Ops v5.0.0 重写后"权限设置更正确"的根本原因——不再只管 appops,而是三层一起管理。

对用户意味着什么

详见 权限自动恢复问题。