原生 Kotlin + Android SDK 编写的开屏广告自动跳过工具。通过无障碍服务识别开屏广告里的"跳过"控件并自动点击,全程本地运行。
- 语言:Kotlin 2.3.20,无任何第三方运行时依赖
- 权限:不申请网络、通知或存储权限;使用时需要开启无障碍服务
- 平台:compileSdk 35 / targetSdk 35 / minSdk 24(Android 7.0+)
- 版本:v1.2.14(versionCode 35)
- 许可:MIT
下载最新安装包(适用于 arm64-v8a 设备)
- 冷启动 App 后自动寻找并点击开屏广告的跳过控件
- 支持顶部与底部边缘带的多种真实形态:
跳过、跳过 2、跳过 02、跳过 5s、15秒后跳过、Skip、跳过广告、关闭广告、圆圈倒计时、胶囊容器、左上 / 左下 / 右下位置 - 一次跳过后不锁死:同一 App 内的第二个全屏广告、窗口切换、熄屏恢复后继续工作
- 部分已适配的页面在 Android 11 及以上可通过本地截图辅助识别;两帧确认后才尝试点击
- 白名单静默:桌面、系统设置、系统 UI、输入法及敏感应用不参与检测
- 内置机上运行诊断,不需要数据线就能看到"为什么没跳"
v1.2.14 新增可选的最近任务锁定入口,并完善后台运行说明。用户需在系统最近任务界面手动锁定卡片,效果取决于手机系统;此入口不代表服务不会被系统停止。
安装发布页的安装包后,按首页引导在系统设置中开启无障碍服务。首页显示服务已连接后即可退出界面使用;如遇未跳过的广告,可通过 使用指南 → 运行诊断 查看记录。
若经常遇到后台被清理,可按首页引导允许后台运行,并点击 经常被清理?点击设置最近任务锁定,打开独立卡片后在系统最近任务中手动锁定。普通主页默认不显示在最近任务中,该卡片仅在用户主动打开时出现。
部分游戏或清理工具会触发系统清理其他后台应用,使服务断开,即使无障碍开关仍处于开启状态。这类系统清理不等同于应用自身崩溃;若首页显示服务未连接,可在系统无障碍设置中关闭后重新开启。
诚实列出,避免期待错位:
| 做不到的事 | 原因 |
|---|---|
| 跳过所有没有无障碍节点的广告 | 图像辅助识别只覆盖部分已适配的页面,不是通用屏幕文字识别 |
| 跳过白名单内的应用 | 桌面、系统及敏感应用被排除在自动检测之外 |
| 跳过纯视频贴片(片头/片中)广告 | 已列入文本黑名单,避免误触播放器 |
| 自动恢复被系统撤销的无障碍授权 | 需要 WRITE_SECURE_SETTINGS,普通应用无权,只能人工重开 |
| 保证服务永不被系统停止 | 后台管理或其他应用触发的系统清理仍可终止进程,允许后台运行和锁定卡片也不能保证避免 |
不联网、不收集任何数据、不写入外部存储。截图仅在本机用于判断,诊断预览保存在内存中;诊断日志只写在应用私有目录(filesDir/skip_diag.log,上限 240 行),卸载即清除。
环境要求:JDK 17、Android SDK 35、Gradle 9.1 + AGP 9.0.1。
本仓库不包含 Gradle wrapper(gradlew),需要自备 Gradle 或先执行 gradle wrapper 生成。
# 1) 指向本机 Android SDK
echo "sdk.dir=<你的 Android SDK 路径>" > local.properties
# 2) 只编译校验(不产出 APK)
gradle compileReleaseKotlin
# 3) 产出调试 APK
gradle assembleDebug
# 产物:app/build/outputs/apk/debug/app-debug.apk签名:app/build.gradle.kts 从根目录 signing.properties 读取口令,也支持环境变量
SKIPAPP_STORE_PASSWORD / SKIPAPP_KEY_PASSWORD。signing.properties、*.keystore、
local.properties 均已被 .gitignore 排除,不要提交。没有密钥库时可用
keytool -genkey 自行生成,或去掉 signingConfig 后打未签名包。
发布前已进行本地回归验证,覆盖节点匹配、图像识别、截图确认与误触反例。测试素材、设备截图及排查日志不包含在本仓库中;本地通过不代表所有设备和广告都能跳过。
App 内:使用指南 → 🔎 运行诊断
- 服务状态、扫描帧数、命中候选次数、已发出点击次数(节点 / 手势分列)、系统拒收次数
- 最近一次扫描的包名与 Activity 类名
- 写着「跳过」却被拒的控件:文本、id、类名、位置、窗口、状态位、拒绝原因(中文)
- 识别不到跳过节点时,显示本段扫描情况及可用的截图判定
- 最近落盘记录可能包含不同运行过程,不能单凭它们确定服务退出原因
skipapp/
├── app/src/main/
│ ├── AndroidManifest.xml 主界面 + 无障碍服务声明,零权限
│ ├── java/com/antigravity/skipapp/
│ │ ├── SkipAccessibilityService.kt 核心跳过引擎
│ │ ├── MainActivity.kt 主界面与授权引导
│ │ ├── RecentLockActivity.kt 可选的最近任务锁定卡片
│ │ ├── DiagActivity.kt 机上运行诊断页
│ │ ├── DiagStore.kt 本地诊断记录
│ │ └── 其他源码 图像识别与观察记录
│ └── res/ 布局 / 文案 / 配色 / 图标 / 无障碍配置
├── build.gradle.kts settings.gradle.kts gradle.properties
├── app/build.gradle.kts app/proguard-rules.pro
└── LICENSE
- 无障碍服务由系统绑定,允许后台运行或调整电池限制可能有帮助,但无法保证服务始终不被系统停止。
- 无障碍开关开启表示已授权;首页还会显示服务是否实际连接。若未连接,可在系统无障碍设置中关闭后重新开启。
- 匹配层刻意保守:宁可漏跳,也不点头像、搜索、静音、客服、会员购买、教程跳过。
MIT。欢迎提 Issue 与 PR,特别是新的真实广告形态——语料越接近真机,规则越可靠。