意图防火墙和PM禁用组件有什么区别
本篇讲安卓组件管控里最容易混淆的一件事:Intent Firewall(意图防火墙)与 PackageManager(PM)都是把应用里某个组件关掉的手段,但下手的层面完全不同,直接决定了「关掉的组件会不会自己亮回来」。选控制器前先把这篇看明白;需要完整工具说明,见 blocker 组件管控 一站的机制对比。
相关文档:
两种机制各自的动作
PM 模式是「改状态」。 PackageManager 提供的 setComponentEnabledSetting 接口(或命令行的 pm disable)会把组件真正置为禁用,记录写进系统的 package_restrictions.xml。组件被禁后,应用再尝试启动它就会抛异常。
IFW 模式是「拦启动」。 Intent Firewall 是 Android 4.4.2 起内置在框架层的意图防火墙,规则放在 /data/system/ifw/ 下的 XML 文件里,改动即时生效。它完全不碰组件状态:应用去探测,得到的仍是「已启用」,只是每次启动请求都被防火墙拦下。
为什么组件会「复活」、应用会闪退
PM 模式的副作用来自它的「诚实」:应用启动被禁组件时收到异常,等于被明确告知「你被关了」,于是开发者可以捕获这个异常、再调用系统接口把组件重新启用——这就是不少用户反映「禁用的组件过阵子自己打开了」的原因。个别应用处理不好这个异常,还会直接崩溃。
IFW 模式下应用无从察觉:组件状态没变、异常也不会抛,应用只觉得「这个组件暂时没被拉起」。所以不会出现组件自动复活,也不会因为组件被禁而崩溃,日常长期挂着更省心。
怎么选
| 场景 | 建议 |
|---|---|
| 长期压制广告 SDK、自启组件 | IFW:应用感知不到,效果稳定 |
| 必须让组件彻底失效的场合 | PM:状态真实改变,但要有被应用「打回来」的心理准备 |
| 顽固组件 | 两种一起下:PM 停状态、IFW 拦启动 |
两种方式可以随时切换、并存使用。无论选哪种,动手前都值得先看一眼组件的用途说明,避免关掉应用正常运行依赖的部分——blocker 组件管控 站的规则页对常见广告联盟组件给出了匹配清单与副作用提示,可以对照着操作。