Repository navigation
广告跳过 v1.0
First release of 广告跳过 (Ad Skipper) — an Android accessibility service that automatically taps the 跳过 button on app splash ads. Everything runs on-device; the app has no ad-related network traffic.
2026-08-08 refresh: the attached APK was rebuilt from
d0d7c25and now includes the L2 hardening from #7 — the ML Kit OCR client is a guarded process-wide singleton, so on ROMs where client construction fails (stripped-down AOSP builds), L2 self-disables cleanly instead of aborting whole detection passes, and the healthy path no longer creates a recognizer client per pass.
Detection pipeline
Four detectors run as a short-circuiting cascade — each layer only runs when the previous one misses:
| Layer | Method | Latency | Covers |
|---|---|---|---|
| L1 | Accessibility node-tree keyword match | <10 ms | Standard buttons with 跳过/Skip text |
| L2 | On-device OCR (ML Kit, Chinese model) | ~100 ms | Flutter/Unity/games that hide their UI tree |
| L3a | Bundled YOLO11n skip-button detector on ncnn (Vulkan compute, CPU/NEON fallback, ~5 MB, mAP50 0.992) | ~20–300 ms | Countdown rings, styled/image-only buttons |
| L3b | Local VLM grounding (llama.cpp + InternVL3-2B GGUF, optional in-app download) | ~2–4 s | Long-tail cases YOLO misses |
Highlights
- Splash-window polling — detection runs on a fixed 750 ms cadence for the first 8 s of each app session instead of relying on accessibility events. This wins the race against splash ads that render after the launch transition and emit no events (verified against real-world hot-start splash ads on MIUI), skips the first 500 ms where OEM starting-window snapshots show stale frames, and re-taps surviving targets (max 3 per session).
- False-positive guards — image-based layers only run inside the splash window; launchers, home-screen search overlays and the minus-one screen are never touched; the app's own label is excluded from keyword matching; per-package cooldowns prevent tap loops.
- Foreground keepalive service so aggressive OEM task killers don't reap the service.
- Built-in verification — a mock splash ad (首页 → 模拟广告测试, enable 自测模式 in 设置) exercises the full pipeline end-to-end; per-app/per-layer skip statistics on the 统计 tab.
- Configurable — keyword list, per-app whitelist, per-layer toggles, VLM thread count/timeout, debug overlay.
Requirements
- Android 11+ (API 30, needed for the accessibility screenshot API)
- arm64-v8a
- No Google Play services needed — L2 uses the bundled ML Kit model (in-APK), and degrades gracefully to L1+YOLO if unavailable
Install
- Download
ad-skipper-v1.0.apkbelow and install it. - Open the app and follow the prompt to enable the accessibility service (设置 → 无障碍 → 广告跳过).
- Optional: download the InternVL3-2B model on the 模型 tab to enable the VLM fallback layer.
APK versionCode 2026080812, versionName 1.0, signed with:
SHA-256 (cert): 55:40:C1:F2:4F:5D:44:86:C5:96:EF:76:0A:8C:E9:8C:8E:68:FE:45:AF:C9:E9:54:1C:C6:3D:EF:3E:7A:76:B5
SHA-256 (apk): 9dd3b5bd186866b844c002fdb44b8cdb5970b3b61c044deae632491a95f116d8
Known limitations
- Image-based layers (YOLO/VLM) are deliberately restricted to the 8-second splash window after an app (re)start; mid-app ads are handled by the keyword layers only.
- The VLM layer stays inactive until a model is downloaded in the 模型 tab.
- On MIUI/HyperOS, lock the app in recents and disable battery restrictions for reliable long-term operation.