开机自启与前台服务 —— Android 后台限制下 AdAway 的常驻机制
为什么 AdAway 需要开机自启
每次设备重启,Android 的 hosts 文件会重置为系统默认值(只有 localhost 那一行)。AdAway 必须在开机后立刻把完整的 hosts 表重新应用回去,否则重启后拦截就失效了。
这和 root 模式下"Magisk Systemless Hosts" 的配合:Magisk 在开机早期(init 阶段)就注入 Systemless Hosts 模块,AdAway 则在系统完全启动后才可能运行。两者时序不同,但效果互补——Magisk 保证 hosts 文件的挂载链,AdAway 保证 hosts 内容本身正确。
为什么需要前台服务
从 Android 8.0 (Oreo) 开始,系统对后台进程做了严格限制:
- 后台进程无法自由创建服务,必须使用前台服务 + 通知栏常驻
- Doze 模式:设备闲置后系统会限制后台进程的网络访问和唤醒
- App Standby Buckets:把应用分成活跃/工作集/常用/极少使用四档,不同档位有不同后台权限
AdAway 申请了"运行前台服务"和"开机启动"权限,目的是:
- 开机后第一时间重新应用 hosts
- 在 Android 可能杀掉后台进程时,前台服务让它优先保留
- 即使被 Doze 限制唤醒,至少 hosts 文件已经应用到系统,拦截不会断
不同拦截模式的自启机制差异
Root 模式
Root 模式下 hosts 文件是 被动生效 的——系统直接读 /system/etc/hosts(或 Magisk 分区的 hosts),不需要 AdAway 进程在跑。
所以 AdAway 进程本身可以被杀:
- hosts 文件还在 → 拦截继续生效
- AdAway 进程不在 → 定时更新 hosts 不会执行、VPN 状态监控不工作
前台服务更多是为了 定时更新 hosts 而不是拦截本身。
VPN 模式
VPN 模式下 AdAway 进程是 主动拦截 的——虚拟网卡需要 AdAway 进程来处理每个 DNS 请求。
如果 AdAway 进程被杀:
- VPN 连接断开 → 所有 DNS 请求恢复原样 → 广告全部回来
- 前台服务的主要作用就是保持 VPN 连接存活
所以 VPN 模式下前台服务的重要性远高于 root 模式。
通知栏图标
AdAway 的前台服务会显示一个常驻通知:
- Root 模式:通知栏的 AdAway 图标 + "广告拦截已启用"
- VPN 模式:通知栏的 VPN 钥匙图标 + AdAway 名称 + 拦截统计
这是 Android 前台服务的强制要求——不能有隐形的前台服务。一些用户觉得这个通知烦人,可以在系统设置里屏蔽(长按通知 → 关闭通知渠道),但这可能影响 Android 对 AdAway 前台服务的判断。
电池优化例外
Android 的电池优化功能会把长时间没使用的 APP 加到"睡眠"列表,限制其后台活动。建议:
- 设置 → 应用和通知 → AdAway → 电池 → 后台限制
- 选择"无限制"(App 可以自由运行)
特别注意 Doze 模式:AdAway 在 Doze 下无法唤醒自己去更新 hosts,但 hosts 本身还在生效。如果你用了 Auto 更新 hosts(偏好里配置),可能需要额外允许 AdAway 在 Doze 下运行。
小米/三星/华为的特殊性
国产 ROM 通常比原生 Android 更激进地限制后台进程。你可能需要额外操作:
- 小米 MIUI:安全中心 → 自启动管理 → 开启 AdAway 自启动;神隐模式里锁定 AdAway
- 三星 One UI:设置 → 电池和设备维护 → 电池 → 后台限制 → 把 AdAway 加到"永不睡眠"列表
- 华为 EMUI:手机管家 → 启动管理 → 手动管理 AdAway → 允许自启动 + 关联启动 + 后台活动
不做这些,AdAway 很可能被 ROM 杀掉进程,VPN 断开,广告回来。
一句话总结
Root 模式:AdAway 进程不是必须的,但自启 + 前台服务让 hosts 文件保持更新。
VPN 模式:AdAway 进程活着就等于拦截活着,前台服务是生命线。