PM 方式直接改组件状态 为什么效果立竿见影但组件会复活
PM 路线的原理:写 package_restrictions.xml
PackageManager(简称 PM)方式是 Bloker 两种控制器之一。它调用 Android 系统的 setComponentEnabledSetting() API,或者直接执行 pm disable 命令行,把组件的启用状态写入 /data/system/users/0/package_restrictions.xml 这个系统文件。
效果:立竿见影
PM 方式改完组件状态后,组件的启用/禁用状态立即生效,系统层面就知道这个组件被禁了,任何应用尝试启动它都会拿到一个"组件不可用"的结果。
在 Bloker 界面上,你点一下组件的开关,开关状态立刻切换(变灰或变绿),这就是 PM 方式的即时反馈。
问题:应用能把禁用的组件"复活"
这是 PM 方式固有的、无法在 Bloker 层面解决的缺陷。
原理是这样的:
- 应用尝试启动一个被 PM 禁用的组件
- Android 系统抛出一个异常(
ActivityNotFoundException等) - 应用开发者在代码里捕获了这个异常
- 应用调用
setComponentEnabledSetting()把自己的组件重新启用 - 下次你打开 Bloker 看,开关又被拨回去了
这不是 Bloker 的 bug,是 Android 系统的设计允许应用这样做——应用管理自己的组件状态是合法行为,PM 方式改变的只是系统层面的状态,但应用在自己的进程里仍然可以修改。
哪些应用会复活组件
- 大厂应用(字节、腾讯、百度系)——它们的开发者对组件状态有感知,捕获异常后自动恢复
- 广告 SDK 集成较多的应用——SDK 可能内置了自恢复逻辑
- 系统应用的某个组件被禁后,system_server 可能会自动恢复
怎么判断你的 PM 规则有没有生效
关掉组件后,不要立刻回去看 Bloker 的开关——等一会儿(比如打开应用跑一圈,或者过几个小时)再回去看。如果开关被自动打开了,说明这个应用有自恢复逻辑,你需要换 IFW 方式(见下一组)。
PM 方式的其他优点
- 规则可以导出为文件,兼容 MyAndroidTools 格式
- 切换回 PM 方式时规则不会丢
- 重启手机后 PM 规则保留(写在系统文件里)
- 效果真的禁了组件状态,不是拦截