Blolabel
← Notes
analysis 6 min read

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".

Abstract technical illustration of a phone-shaped frame filled by a single opaque panel, with a small countdown ring in one corner and faint motion arcs around the frame suggesting the device being tilted

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.

Motion-triggered share of detected splash ads, by market 025%50% 75%100% share of detected ads that fire on motion VIVO (261) 95.4% Wandoujia (198) 90.9% YingYongBao (191) 88.0% Xiaomi (128) 36.7% All 778 84.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.

ConfigurationNeedsStoppedFailedNo baseline adApp brokeSource
Li Tiaotiao 2.2Accessibility10000Table 5
TrackerControlVPN5500Table 5
Ad Skipper, no VLMAccessibility, screen access5230Table 5
AdAway (VPN)VPN3700Table 5
Fuck ADRoot, runtime injection2530Table 5
NoShakingADAccessibility, debugging2800Table 5
Fuck ShakeRoot, runtime injection1630Table 5
AdAway (root)Root0730Table 5
FuckAdJumpRoot, runtime injection0730Table 5
AdClose 4.3.7Root, runtime injection0523Table 5
GKD + Lin-arm rulesAccessibility01000Table 5
Ad Skipper with VLM, ShakeGuardextra model; source buildnot validated (20 cells): the VLM configuration crashed loading InternVL3 2B or Qwen2.5-VL 3B; ShakeGuard was not deployed on deviceTable 5, Section 4.2
All 130 combinations2862173Section 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.

Seconds after launch while a splash ad is up 012 345 shake / tilt listener live for as long as the ad is on screen Li Tiaotiao dismissed at about 1 s (paper, manual observation) phoneshell observe label pass "Skip 5s" is not in CLOSE_LABELS: no match interstitial only if text is empty; then time.sleep(3.0) retry Timings for phoneshell are illustrative: the observe and label-pass widths are not measured. The 3.0 s wait is the constant in phoneshell/agent/overlays.py. Any motion inside the red band can redirect with no agent action at all.

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 ButtonTreated as close?Source
Skipyesoverlays.py, run 23 Sep 2026
Skip 5nooverlays.py, run 23 Sep 2026
Skip 5snooverlays.py, run 23 Sep 2026
5s | Skipnooverlays.py, run 23 Sep 2026
Skip Adnooverlays.py, run 23 Sep 2026
Close adnooverlays.py, run 23 Sep 2026
跳过 (skip), 跳过 3, 关闭 (close)nooverlays.py, run 23 Sep 2026
(empty label, 72 x 32 pt)nooverlays.py, run 23 Sep 2026
(empty label, 40 x 40 pt)yesoverlays.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

  1. 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
  2. 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
  3. Blolabel, phoneshell-bench: 80 tasks over 16 first-party bundle ids