App Ops 的忽略模式和拒绝模式有什么区别
为什么需要这两个不同的模式
系统权限面板只有两个选项:允许、拒绝。一旦选择"拒绝",应用在请求权限时会收到明确的错误返回值。大量应用检测到权限被拒绝后直接选择停止运行或反复弹窗索要权限。
App Ops 在系统允许/拒绝之外,提供了两个额外的精细控制——"忽略"和"仅在使用期间允许"。其中"忽略"是区别于系统面板的杀手锏。
四种权限状态对照表
| 状态 | 应用看到什么 | 实际数据 | 典型效果 |
|---|---|---|---|
| 允许(Allow) | 正常获得数据 | 真实数据 | 完全正常运行 |
| 仅在使用期间允许(Foreground) | 前台时正常,后台被拒绝 | 前台真实,后台空白 | 后台不跑耗电 |
| 拒绝(Deny/Force Stop) | 收到明确错误 | 无 | 应用可能停止运行 |
| 忽略(Ignore) | 看起来权限还在,但数据是空的 | 空白/零值 | 应用照常运行但拿不到数据 |
"忽略"是怎么做到的
Android 系统在检查 appops 时,如果 appops mode 设为 ignore,系统不会在权限检查层面报错,而是让应用继续调用数据获取接口——只是返回值会变成空列表、空字符串或默认值。
App Ops 界面里实际把"忽略"显示为"拒绝"(为了简化用户理解),但底层做的是 appops 设为 ignore 而非在权限层面强制 deny。这也是为什么 App Ops 文档会提醒"应用仍可以通过检查返回值是否为空来判断权限是否被忽略"——只是绝大多数应用没有做这个检测。
专治"不给权限就不运行"
这是 App Ops 最广为人知的使用场景。某些应用在启动时会检查:
- 定位权限被拒绝 → 直接退出并弹窗"请授予定位权限"
- 剪贴板权限被拒绝 → 不加载主界面
- 通知权限被拒绝 → 反复弹窗直到你同意
在 App Ops 里把这些权限设为"忽略"后,应用的权限检查会通过(系统说"权限是允许的"),但真正取数据时拿到的是空值。检测逻辑认为没问题,应用就能继续运行下去——只是它那点偷数据的勾当被无声地挫败了。
哪些应用最值得用"忽略"
- 新闻资讯类(非要定位才能看首页)
- 地图导航以外的常用应用(不需要定位就别给)
- 购物类应用(读取剪贴板是为了偷取你复制的链接比价)
- 社交工具(请求通讯录但明明没有匹配好友的功能)
- 开机自启应用(后台运行设为忽略阻止后台耗电)