84% of drive-by splash ads fire on a shake, and our skip-button matcher misses 'Skip 5s'
A 15 September study found 28 of 130 defence and app combinations stopped a splash-ad redirect. The one tool that always worked taps the skip button, which is what a phone agent's overlay reflex does, and ours fails on a countdown label.
84.1% of the 778 semi-drive-by splash ads found in 31,823 Android apps open their advertiser when the phone moves, not when anything is tapped. A study posted on 15 September 2026 tested 13 defence configurations against 10 popular apps and 28 of the 130 combinations stopped the redirect. The one tool that worked on all 10 is an accessibility skipper that taps the skip button, and the ad still stayed on screen for about a second. We ran our own rig's close-control matcher against the labels a skip button carries, and it misses "Skip 5s".
What the paper measured
"Can We Stop The Ads?", arXiv:2609.17316, is by Shuhao Zhang, Xinyu Liu, Ziyu Shao, Yuqing Yang, Yan Long and co-authors. A splash ad is the full-screen page an app shows before its first real screen. The semi-drive-by kind navigates to a third party (a shopping app, a mini-program) on a light touch anywhere in a hot area, or on a shake, twist or tilt. The prevalence figures come from Wu et al. 2026, which the paper reproduces as its Table 1.
Across all four markets the detection rate is 2.44% of tested apps. The 10 popular apps the authors chose for the defence test, among them Baidu Maps, Weibo, Tencent Video and QQ Browser, each carry at least one touch or motion trigger (their Table 2). The defence test ran on a Pixel 6 and a Xiaomi MIX 2S.
| Configuration | Needs | Stopped | Failed | No baseline ad | App broke | Source |
|---|---|---|---|---|---|---|
| Li Tiaotiao 2.2 | Accessibility | 10 | 0 | 0 | 0 | Table 5 |
| TrackerControl | VPN | 5 | 5 | 0 | 0 | Table 5 |
| Ad Skipper, no VLM | Accessibility, screen access | 5 | 2 | 3 | 0 | Table 5 |
| AdAway (VPN) | VPN | 3 | 7 | 0 | 0 | Table 5 |
| Fuck AD | Root, runtime injection | 2 | 5 | 3 | 0 | Table 5 |
| NoShakingAD | Accessibility, debugging | 2 | 8 | 0 | 0 | Table 5 |
| Fuck Shake | Root, runtime injection | 1 | 6 | 3 | 0 | Table 5 |
| AdAway (root) | Root | 0 | 7 | 3 | 0 | Table 5 |
| FuckAdJump | Root, runtime injection | 0 | 7 | 3 | 0 | Table 5 |
| AdClose 4.3.7 | Root, runtime injection | 0 | 5 | 2 | 3 | Table 5 |
| GKD + Lin-arm rules | Accessibility | 0 | 10 | 0 | 0 | Table 5 |
| Ad Skipper with VLM, ShakeGuard | extra model; source build | not validated (20 cells): the VLM configuration crashed loading InternVL3 2B or Qwen2.5-VL 3B; ShakeGuard was not deployed on device | Table 5, Section 4.2 | |||
| All 130 combinations | 28 | 62 | 17 | 3 | Section 4.2 | |
Per-row counts are ours, tallied from the symbols in Table 5 of arXiv:2609.17316; the totals match the paper's own 28, 62, 17, 3 and 20. "No baseline ad" means the ad never appeared with the defence off, mostly Baidu, Baidu Maps and Baidu Input on the Pixel 6, and the paper does not count those as protection.
The authors saw splash ads more consistently on iOS than on Android
Every test above is Android. The paper's platform section is the part an iOS reader needs: "In our manual observations, splash ads appeared more frequently and consistently on iOS than on Android", with Baidu Maps showing one on nearly every observed iOS launch. Its references include an ad network's "Shake interaction configuration for iOS". And it quotes Wu et al. on an SDK that reads shake enablement and thresholds from a server response, so the installed app version does not decide whether a given launch can be redirected by motion.
A phone agent's first observation after launching such an app is the ad, not the app. It has two ways to lose. It can tap the hot area, because a full-screen image with a large button looks like the app's first screen. Or it can do nothing wrong and still be redirected, because the motion channel is not in its observation or its action space. On a rig, the phone on a stand gets bumped. In our coexist mode, a person picks the phone up.
Our matcher, tested today
_is_close_control in phoneshell/agent/overlays.py decides whether an
element is a close control. It accepts an identifier containing one of 14 known close identifiers, a
joined label that equals one of 19 entries in CLOSE_LABELS exactly, or an unlabelled
Button, Image or Icon between 16 and 60 points on both sides. We built elements with the labels below
and called it on 23 September 2026.
| Label on a 72 x 32 pt Button | Treated as close? | Source |
|---|---|---|
| Skip | yes | overlays.py, run 23 Sep 2026 |
| Skip 5 | no | overlays.py, run 23 Sep 2026 |
| Skip 5s | no | overlays.py, run 23 Sep 2026 |
| 5s | Skip | no | overlays.py, run 23 Sep 2026 |
| Skip Ad | no | overlays.py, run 23 Sep 2026 |
| Close ad | no | overlays.py, run 23 Sep 2026 |
| 跳过 (skip), 跳过 3, 关闭 (close) | no | overlays.py, run 23 Sep 2026 |
| (empty label, 72 x 32 pt) | no | overlays.py, run 23 Sep 2026 |
| (empty label, 40 x 40 pt) | yes | overlays.py, run 23 Sep 2026 |
A countdown in the label defeats an exact-match list, and so does a pill-shaped skip button wider than 60 points. We have not yet captured a live splash ad's accessibility tree on our iPhone, so we do not know which of these forms a given ad SDK exposes. The test says the matcher fails on the common visible forms. It does not say a real ad would carry one of them as its label.
What it means if you run or evaluate phone agents
No published iOS agent number includes splash ads, and not by choice. Our 80 tasks use 16 bundle ids, all Apple first-party. iOSWorld's 133 tasks run on 26 apps its authors built. Neither suite can show an ad, so both measure agents in a world where the first screen after launch is always the app. That is a fair benchmark and an unfair forecast.
Three changes follow for us, and probably for anyone with a label-driven overlay reflex. Match close
labels by token, not equality, so a leading or trailing countdown still hits. Add the Chinese skip and
close words, since the apps the paper studies are Chinese. And treat a foreground change within the
first seconds after launch, with no tap in between, as an environment event rather than an agent
error; our 76 foreground_app checks currently cannot tell a motion redirect from an
agent that opened the wrong app.
For evaluation more broadly: the defence that worked everywhere was the simplest one, an accessibility service tapping the skip control. Network blocking and root-level hooks failed more often than they worked. An agent that reads the accessibility tree is already that kind of tool, and the only question is whether its matcher is good enough, which is a test anyone can write.
Check it yourself
# the paper's tables and the iOS observation
curl -sL https://arxiv.org/html/2609.17316 -o splash.html
python3 -c "
import re,html
t=re.sub(r'\s+',' ',html.unescape(re.sub(r'<[^>]+>',' ',open('splash.html').read())))
for k in ('Of the 130 combinations','appeared more frequently and consistently on iOS','approximately one second'):
i=t.find(k); print(t[i-100:i+300],'\n---')"
# our matcher, from the repository root
python3 -c "
from phoneshell.perception.tree import Element
from phoneshell.agent.overlays import _is_close_control
for lab in ['Skip','Skip 5s','5s | Skip','跳过','Close ad']:
print(repr(lab), _is_close_control(Element(idx=0,type='Button',label=lab,x=300,y=60,w=72,h=32)))"
grep -n "time.sleep(3.0)" phoneshell/agent/overlays.py
What would prove this wrong
The claim is that a label-matching overlay reflex misses splash-ad skip controls often enough to
matter on iOS. We will install the iOS builds of Baidu Maps, Weibo and Tencent Video on the rig, cold
launch each 20 times, and record whether a splash ad appears, the skip control's accessibility label,
and whether the unmodified overlays.py dismisses it. If splash ads appear on fewer than 10
of the 60 launches, the iOS exposure is too small for this to matter. If they appear and the current
matcher dismisses at least 80% of them, the countdown forms we tested are not what the SDKs expose and
this note is wrong about our rig. Results by 31 December 2026, before and after the token-match fix.
Sources
- Zhang, Liu, Shao, Yang, Long et al., Can We Stop The Ads? Taxonomy and Characterization of Smartphone Splash Ads and Existing Countermeasures, arXiv:2609.17316, 15 September 2026
- HTML edition: Table 1 (prevalence, after Wu et al. 2026), Table 2 (trigger mechanisms), Table 5 (13 configurations x 10 apps), Section 3.2 (Android vs iOS), Section 4.2
- Blolabel, phoneshell-bench: 80 tasks over 16 first-party bundle ids