判断 android-ad-cleaner 适不适合自己,先看两件事就够了:规则是从本地文本读进来的,拦截是在无障碍服务里做界面匹配并触发点击或跳过。前一件事决定你能不能自己维护、改完是否立刻生效;后一件事决定它的权限范围、常驻代价,以及它其实只能处理界面上的那一类广告。两件事里有任何一条不成立,这个工具的适用范围就要缩小。
这类工具的边界由规则来源和生效方式共同决定。规则来自本地文本,意味着你能用文本编辑器查看和修改,也可能被一次误改或一次覆盖弄坏,是否会自动更新要单独确认。拦截依赖无障碍常驻,意味着它只能读到当前界面暴露出来的控件信息,关闭服务后立即失效。先确认规则文件能定位、能读出结构,并且你愿意长期保留这个服务,再考虑拦截效果。
找到规则文件的位置与条目结构
规则位置的判断顺序建议是:先在应用内找入口,再退回文件管理器定位,最后才考虑用命令查看。多数同类工具会在「规则管理」「设置」「关于」这类页面里放一个导出或查看规则的入口,点开后通常会把本地文本复制到一个你能访问的目录,常见位置是应用的外部私有目录或下载目录,形如 /sdcard/Android/data/<包名>/files/ 或 /sdcard/Download/。应用内没有导出入口时,用文件管理器打开上述路径,按修改时间排序找最近变动的文本文件,一般能定位到。
找到文件后先别改,用文本编辑器打开通读一遍,看单条规则的字段构成。不同实现的字段名不一样,字段名要以你本地文件的实际内容为准,这里只描述结构:一条规则通常由“匹配对象、匹配方式、匹配内容、命中后动作”几部分组成,可能还带优先级或备注。下面是一个字段名需要替换的示意骨架,只用来对照结构,不要当成真实格式:
# 以下字段名仅为示意,请按本地文件真实字段替换
{"target": "com.example.app", # 匹配哪个应用
"match_type": "text_contains", # 精确 / 包含 / 正则,以文件实际写法为准
"match_value": "跳过", # 要匹配的控件文本或标识
"action": "click", # 命中后做什么
"note": "开屏跳过按钮"}
验证方式很简单:复制一份原文件留底,只改一条规则的匹配值,保存后重启应用或重新加载规则,在对应界面上看行为有没有变化。有变化说明你改的就是生效的那份文件;没变化说明应用读的是另一份,或者规则有缓存,需要先在应用内触发一次重新加载。
确认规则是否需要手动更新
规则会不会自己变,是判断长期维护成本的关键。先在应用内找有没有「检查更新」「更新规则」这类按钮,有按钮且点了之后规则文件修改时间发生变化,说明存在更新通道;如果应用里根本没有这类入口,就要按纯本地文本对待,靠你自己替换。
修改时间对比是最直接的检查动作。在文件管理器里看该文件的详细信息,或者用命令看时间戳:
adb shell ls -l /sdcard/Android/data/<包名>/files/
记下当前时间,正常使用几天后回来看这条时间戳有没有被动过。时间戳不动、文件内容也不变,就可以确定规则不会自动更新。此时不要把希望寄托在“过阵子应该会好”上,而是自己维护:保留一份当前可用的规则文件作为基线,遇到规则失效时只增量添加条目,别整体重写;每次修改前留一份带日期的备份,出错能回退。规则变多之后,建议在条目里保留备注字段,否则过一段时间你自己也分不清哪条是干什么的。
看无障碍常驻意味着什么权限范围
无障碍服务能读到的信息,比普通应用权限宽得多。开启后,它可以获取当前活动窗口的控件树,通常包括控件的文本内容、内容描述、类名、所属包名、是否可点击、界面层级关系,以及窗口内容变化这类事件通知。部分实现还能执行点击、滑动等手势,用来完成“关掉广告”这一步。普通应用只能看到自己进程内的界面,跨应用读界面这件事本身就属于无障碍的能力范围,不是靠普通权限能做到的。
常驻的代价也要一并算进去:服务需要在系统设置里保持开启,通常伴随常驻通知,被系统回收或应用被杀后拦截会中断,重启后是否自动恢复取决于你设备的设置。验证方法是进系统设置的「无障碍」页看该服务状态,再在通知栏看有没有常驻项,然后手动强停应用,观察拦截是否立即失效。
关闭服务后的直接后果是:规则文件还在,但没有任何东西去执行匹配,所有依赖界面识别的拦截全部停止,工具退化成一份纯文本。如果你只是想临时停用,关闭服务比卸载更轻,但也意味着这段时间内广告恢复原状,这一点要在预期之内。
列出它拦不到的场景
基于界面匹配的拦截,能处理的只是“广告以独立控件或独立界面出现”这一种形态。下面几类通常拦不到,判断标准也放在一起:
- 应用内嵌广告。广告和正文在同一个窗口、同一个进程里,没有独立包名可分。无障碍能看到的是若干控件节点,只能靠文本或控件标识去猜哪一个是广告。判断标准:广告跟着内容一起滚动,或关掉后正文布局没有明显切换,基本属于这一类。这类规则容易误点正文元素。
- 视频贴片广告。画面在播放器内部渲染,控件树拿不到帧内容,进度条和跳过逻辑也常在播放器自己手里。判断标准:广告以视频流形式加载,有独立倒计时但界面节点里读不到可点的跳过控件。
- 服务端下发素材、动态布局。素材、文案、控件标识可能每次不同或做了混淆,写死的匹配值命中率会下降。判断标准:同一位置的广告样式和文字经常变,或控件标识看起来是随机串。
- WebView 内的 H5 广告。控件树通常只到 WebView 这一层,内部页面内容读不到具体节点,除非页面本身渲染出可读文本。判断标准:广告区域看起来像网页,长按能选中文字但控件树里查不到对应节点。
- 纯图片形式的跳过按钮。没有文本可匹配,只能靠控件尺寸、位置这类特征去猜,稳定性差。判断标准:按钮上没有文字,只有图形。
给出装前自查的三条判断
把上面几条边界转成三个可以当场做的动作,做完再决定装不装:
- 规则文件能不能被我读到并看懂?动作:进应用找导出或规则管理入口,用文本编辑器打开,确认字段能对上号。读不到、也找不到任何入口,说明你无法自己维护,规则失效时只能等应用更新。判断为不适合时,先不要指望长期使用,或者只把它当临时手段。
- 我愿不愿意长期开着一个无障碍服务?动作:进系统无障碍设置看这类服务的说明和权限提示,再想一下自己设备上是否已经开了别的无障碍服务。不愿意,或者设备上有安全类应用会因此报提示,就不适合装。
- 我常遇到的广告是不是界面级的?动作:挑两三个最常出现广告的应用,看广告是独立开屏界面还是嵌在内容里,跳过按钮上有没有文字。大部分是内嵌或视频贴片,那这个工具对你的实际帮助有限;只有开屏跳过这类明确场景,才值得为它开启常驻服务。
三条里有一条明显不成立,处理方式都很简单:不装,或者装了但把无障碍服务关掉、只留规则文件。判断依据来自你自己的设备行为和文件内容,别人给的经验只能作参考,最终要结合环境确认。