专治不给权限就不运行 App Ops 忽略模式实战
问题场景
某些应用把权限检查作为启动的前提条件:
- 启动时检查定位权限 → 没有就弹"请授予定位权限"并强制退出
- 启动时检查存储权限 → 没有就不给进入主界面
- 启动时检查麦克风/传感器 → 没有就直接 crash 或显示白屏
这种行为被称为"强制权限检查"——应用并非真的需要这些权限才能运行,只是为了偷取数据或做广告画像而"卡权限"。
App Ops 的"忽略"模式是解决方案
在 App Ops 里把相关权限设为忽略:
- 系统层面:appops 设为 ignore,运行时权限仍保持 allow
- 应用层面:权限检查通过(PackageManager 说"已授予"),真正取数据时拿到空值
- 效果:应用正常启动运行,只是拿不到敏感数据
典型案例
案例一:新闻 App 强制定位
某新闻 App 启动时如果没拿到定位权限就不让用。App Ops 设置:
- 定位 appops → 忽略
- 效果:App 正常启动进入首页,只是"本地新闻"板块是空的(因为定位返回空数据),全国新闻正常浏览
案例二:购物 App 强制存储
某购物 App 强制索要外部存储权限才能进入主界面。App Ops 设置:
- WRITE_EXTERNAL_STORAGE / READ_EXTERNAL_STORAGE → 忽略
- 效果:App 正常浏览和搜索,下载/保存图片功能失效(存储返回空),不影响核心购物流程
案例三:游戏强制麦克风
某竞技游戏启动时强制检查麦克风权限。App Ops 设置:
- RECORD_AUDIO → 忽略
- 效果:游戏正常启动进入主界面和对局,只是游戏内语音功能失效(不影响单人模式)
案例四:工具 App 强制通讯录
某天气 App 在启动时强制索要通讯录权限(完全不知道它要通讯录干嘛)。App Ops 设置:
- READ_CONTACTS → 忽略
- 效果:天气正常查看,通讯录数据读取返回空,App 不会因此崩溃
效果不好时改用什么
如果某些应用检测到返回值为空(比如返回的坐标是 0,0 时主动判定无效并弹提示),可以考虑:
- 改用"拒绝"模式:虽然可能让应用退出,但有些应用在权限被拒绝时只弹提示而不强制退出
- 改用"仅在使用期间允许":让应用在前台有权限后台无权,折中方案
- 用 ProGuard/Xposed 等 hook 框架跳过权限检查(需要 Root,更激进但有效)
为什么"忽略"比"拒绝"好
| 模式 | 权限检查通过? | 应用能运行吗 | 数据能拿到吗 | 弹窗打扰? |
|---|---|---|---|---|
| 允许 | ✅ | ✅ | ✅(真实数据) | ❌ |
| 忽略 | ✅ | ✅ | ❌(空数据) | ❌ |
| 拒绝 | ❌ | ❌ 或弹提示 | ❌ | ✅ 反复弹窗 |
"忽略"模式完美平衡了——不弹窗、能运行、拿不到数据。这是 App Ops 区别于系统权限面板的核心价值。
验证效果
设置忽略后验证:
- 第一次打开应用,如果没弹窗说明忽略生效
- 应用正常进入主界面后,测试需要该权限的功能(如"附近的人")是否为空/不可用
- 观察应用是否正常运行不崩溃
如果应用正常但权限相关功能失效,说明忽略成功。