逐个关掉 receiver 看谁在关联 验证唤醒链有没有断
验证唤醒链有没有断
关掉 receiver 只是第一步——你需要实际触发那个系统事件(解锁、连网、开机),看被关掉 receiver 的应用还会不会被唤醒。
验证流程
场景一:开机自启验证
- 关掉所有目标应用的
BOOT_COMPLETEDreceiver - 重启手机
- 开机后先别碰任何应用,等 3-5 分钟让系统稳定
- 打开最近任务列表(不要手动打开任何应用)
- 看被关掉 receiver 的应用有没有在运行
- 打开设置 → 电池 → 后台活跃应用,确认有没有目标应用
结论:如果目标应用还在运行 → BOOT_COMPLETED 之外还有别的自启手段(比如应用的 MainActivity 被其他应用调起、或厂商系统级自启)。
场景二:解锁唤醒验证
- 关掉目标应用的
SCREEN_ON/USER_PRESENTreceiver - 锁屏
- 等 30 秒(让应用完全退出后台)
- 解锁屏幕
- 立刻打开最近任务列表 → 看目标应用有没有被拉起来
- 看通知栏有没有它的推送通知
结论:解锁后应用没被拉起来 → 成功;还被拉起来 → 还有其他 receiver 监听了解锁事件(比如 LOCKED_BOOT_COMPLETED、USER_PRESENT 的变体)。
场景三:网络切换唤醒验证
- 关掉目标应用的
CONNECTIVITY_CHANGEreceiver - 打开飞行模式等 10 秒
- 关闭飞行模式 → 让 Wi-Fi/移动数据重连
- 连上网后等 30 秒
- 打开最近任务列表 → 看目标应用有没有被拉起来跑数据同步
结论:连网后应用没被唤醒 → 成功;还被唤醒 → 可能走了另一个网络变化 receiver(比如 CONNECTIVITY_ACTION 的变体或 ACTION_WIFI_STATE_CHANGED)。
场景四:关联唤醒验证(打开 A 牵出 B)
- 关掉应用 B 的那些监听 A 相关 intent 的 receiver
- 杀掉 A 和 B 两个应用(都不在后台)
- 从桌面正常打开 A(不要从最近任务恢复)
- A 完全启动后 → 打开最近任务列表
- 看 B 有没有被拉起来
结论:B 没被拉起来 → 成功;还被拉起来 → B 可能走了别的唤醒通道(比如 content provider 触发的、或 A 直接用 startService 拉 B)。
IFW vs PM 验证注意点
- PM 方式:验证前先杀掉所有目标应用(PM 关组件时应用如果还在运行,已启动的 service 不会被停掉)
- IFW 方式:验证前杀掉应用就行——IFW 的拦截规则是立即生效的,下次启动就会被拦
没断怎么办
如果验证失败(应用还是被唤醒):
- 回去 Bloker → 再扫一遍那个应用的 receiver 列表
- 看有没有名字相近的(比如
BOOT_COMPLETED之外还有QUICKBOOT_POWERON,小米系统特有的开机广播) - 换成 IFW + PM 双控制器组合(如果之前只用了 IFW 单通道)
- 确认 root 权限没问题(权限不够可能规则没生效)
验证通过后
- 留这个规则,不要打开恢复
- 如果是 PM 方式,过一天再回 Bloker 看开关有没有被自动打开(防复活)
- 如果是 IFW 方式,基本不用担心复活