夜雨聆风学习资料网

ARTICLE · 1322523

不 root 关掉安卓快应用,少被广告拽走

不 root 关掉安卓快应用,少被广告拽走

起因是一个错题本 APP:每次打开,开屏广告会把我甩到京东。抓了日志才发现,它不是直接跳京东,而是先拐一道系统预装的快应用。这篇写清楚怎么查、怎么关、关了会失去什么。手上是华为机器,但快应用是厂商联盟的标准,小米、OPPO、vivo、荣耀都有自己那一份,方法通用,包名各自不同。

一条 adb 命令 · 无需 root · 可随时恢复

01 · 现象:开屏广告把人甩走

家里孩子用的一个错题本 APP,点开之后开屏广告一闪,手还没动,人已经在京东的活动页上了。这种事大家都遇到过,通常的反应是骂一句然后返回。我想知道它到底怎么跳的。

02 · 准备:要什么工具,以及风险

全程不需要 root,但需要三样东西。

一、adb。安卓官方的调试工具,在 Google 的 SDK Platform-Tools 里,Windows / macOS / Linux 都有。macOS 用 Homebrew 的话brew install --cask android-platform-tools一条命令完事;Windows 下载压缩包解压,在那个目录里开命令行。装好了敲adb version有版本号就是成了。

二、一根能传数据的线。有些随手机附带的线、尤其是车载和充电头配的,只有电源针脚,插上只充电、不认设备。adb devices列不出东西时,先换根线再怀疑别的。

三、开发者模式 + USB 调试。设置 → 关于手机 → 连点「版本号」七下,系统会提示已进入开发者模式;再回设置 → 系统和更新 → 开发人员选项 → 打开「USB 调试」。各家菜单路径略有差别,搜「开发人员选项」能找到。

三步走完,最后 adb devices 显示出 device 才算成了

插上线之后手机会弹一个「允许 USB 调试吗」的对话框,要点允许——这个框只在屏幕解锁时弹,所以先解锁再插线。然后:

[终端 · 确认连上了] $ adb devices -l List of devices attached 2MH02********201   device  usb:2-1 model:ADY_AL00

看到device就行。显示unauthorized是手机上那个框还没点;什么都没有就是线或驱动的问题。 

03 · 抓现场:日志里有名有姓

跳转这种事不用猜,系统自己记着。手机连上之后,挂上这条logcat抓跳转的命令:

adb logcat -c adb logcat | grep -iE "START u0.*cmp="

然后去开那个 APP,等它跳一次。日志里会打出一串,关键是这几行(时间戳是真实的,包名我隐去了一个):

[logcat · 跳转链路] 20:31:06.525  START u0 cmp=错题本APP/com.yfanads.android.adx.core.TransparentActivity 20:31:06.559  Intent { act=VIEW             dat=openapp.jdmobile://virtual?params={...                 url=https://union-click.jd.com/sem.php                 ?source=ks-dsp&unionId=2627****52 ...}             cmp=com.huawei.fastapp/.app.processManager.DeepLinkActivity } 20:31:06.560  START u0 cmp=com.huawei.fastapp/.app.processManager.DeepLinkActivity

04 · 看懂它:同一个跳板,换着 SDK 用

我隔了六个小时抓了第二次。这回换了个广告 SDK,但跳板一模一样:

第一次 14:21 第二次 20:31 发起组件 com.octopus.ad / .TransparentActivity com.yfanads.android.adx.core / .TransparentActivity 中转 com.huawei.fastapp 同一个 京东联盟 ID 2627****52 同一个 落地页 某活动页 同一个
隔六小时再抓一次,换的只是广告 SDK,跳板和联盟 ID 都没变

两个不同厂商的 SDK、同一个跳板、同一个联盟 ID 和落地页。我把 APK 拉下来拆了一遍:1366 个组件里256 个是广告相关,涉及 22 个广告 SDK——穿山甲、快手、广点通、百度、京东、章鱼、beizi……其中有个类名不用猜:

[AndroidManifest · 节选] cn.vlion.ad.inland.ad.utils.VlionOpenJdDplinkActivity

权限清单里还有一条值得说:HIGH_SAMPLING_RATE_SENSORS,高采样率传感器(200Hz 以上)。普通的晃动检测用不到这么高的采样率。

05 · 走不通的路:停不掉第三方的组件

看懂链路之后,第一反应是把广告 SDK 那个跳转页停掉。试了,系统直接拒绝:

[终端 · 被拒] $ adb shell pm disable-user --user 0 \     错题本APP/com.octopus.ad.TransparentActivity  SecurityException: Shell cannot change component state for …/com.octopus.ad.TransparentActivity to 3

改第三方 APP 内部某个组件的启用状态,需要 root 或系统签名。adb shell 没这个权限,这条路在未 root 的机器上走不通。

06 · 走得通的路:跳板本身是系统应用

但链路中间那一跳不是第三方,是com.huawei.fastapp——系统应用。pm disable-user禁的是整个包,而shell 对系统应用有这个权限。两件事卡在不同的检查上:

$ adb shell pm disable-user --user 0 com.huawei.fastapp Package com.huawei.fastapp new state: disabled-user

不是华为机器怎么办。快应用是 2018 年几家厂商联合定的标准,各家都预装了自己的实现,包名不一样。我手上只有华为这一台,所以只有com.huawei.fastapp是我亲手验过的。别猜包名,让系统自己报:

 $ adb shell pm list packages | grep -iE \      "hybrid|instant|fastapp|quickapp|fastengine"

列出来的包名里挑那个明显是快应用引擎的,换进上面那条disable-user命令。小米系常见的是带hybrid字样的,OPPO 和 vivo 各有自己的叫法——以你这台实际列出来的为准,不以任何文章里抄来的名字为准(包括这篇)。

拿不准某个包是不是的话,先只做一半:

看它声明了哪些 scheme / 组件 

$ adb shell dumpsys package  | grep -iE "versionName|flags="  # 关掉之后验证这个 scheme 死了没 $ adb shell cmd package resolve-activity --brief \     -a android.intent.action.VIEW -d "hwfastapp://x" No activity found

最后一条返回No activity found,说明这条入口确实断了。各家的 scheme 不同,把hwfastapp://换成你在日志里实际看到的那个。

07 · 验证:它撞墙了,而且没有退路

关完再去开那个 APP。广告照旧出现,但跳转这一下:

[logcat · 跳转失败] 20:31:06.560  start activity: {com.huawei.fastapp/…             DeepLinkActivity} result = -92 20:31:06.560  W System.err: android.content.ActivityNotFoundException:             Unable to find explicit activity class             {com.huawei.fastapp/…DeepLinkActivity} 20:31:07.199  START u0 cmp=错题本APP/…MainAct   ← 回到自己的页面

关键在explicit activity class这几个字。它跳的是显式 Intent:指名道姓要华为快应用那个组件,不是发一个openapp.jdmobile://让系统去挑谁接。显式 Intent 找不到目标就直接抛异常,不存在「系统另找一家」。

而 SDK 显然没给这一步写兜底——异常都打到System.err了。所以链路到此为止,后面三行是它自己的页面,京东没再出现。APP 也没崩。

那 22 个 SDK 里还有谁想这么跳,都撞同一面墙。

— 07 · 验证

08 · 代价:你会失去什么

扫码或点链接直接运行快应用

(免安装的那种小程序)——没了

负一屏里的快应用卡片

——没了

装 APP、系统更新

——不受影响。应用市场里那几处fastapp字样都在它自有组件的类名里,不是对这个包的依赖

广告本身还在

,只是点了/摇了不再跳走

失去的是两个入口;装 APP、系统更新和广告展示本身都不受影响

另外:OTA 系统更新后可能被重新启用,更新完复查一次。恢复也是一条命令。

09 · 说说快应用

【以下是个人看法,不是日志能证明的事】

快应用是 2018 年国内安卓厂商联合搞的,对标微信小程序:小程序把流量都收进微信里,厂商想在系统层面留一个自己的入口。

七年过去,我身边没见过谁主动打开过一个快应用。想用小程序的人去微信,想用 APP 的人直接装,中间那层需求本来就不厚。可它预装在系统里,正常途径卸不掉。

真正让我在意的不是「没人用」,而是这件事:一个我从没主动用过的系统组件,能被任意第三方 APP 直接调起来、替它转发 deeplink。我没看过华为的 manifest,不对它怎么声明下结论;但日志里确实有一个普通第三方 APP(uid 10125)成功调起了它。

从用户这边看,这是笔不划算的交易:一个我用不上的功能,成了别人把我拽出自己手机的通道。以这类预装组件的装机量,它的调起面值得比现在更谨慎。

几句必要的说明

文中命令都在我自己的设备上跑的,目的是拿回对自己手机的控制。

pm disable-user

/pm enable是安卓官方的标准命令,不需要 root,不绕过任何技术保护措施,只要开 USB 调试就能用。全部可逆。

日志、组件名、错误码都可以自己复现,不必信我——方法就在上面。

我只有一台华为机器(EMUI 14.2 / Android 12),所以只有com.huawei.fastapp是亲手验过的。其他厂商的包名请用第 06 节那条命令让系统自己报,别照抄任何文章里的名字。

那条链路为什么是这个形状、各方之间有没有什么安排,我没有证据,文中也不做推测。

那个错题本 APP 的名字我隐去了。本文的重点是方法和跳板机制,不是指认一家具体公司。

USB 调试的风险见第 02 节。请读完那段再动手,并且用完关掉。

[附 · 命令清单]

# 0. 确认手机连上了(显示 device 才算) adb devices -l  # 1. 抓跳转:挂着它,然后去开那个 APP adb logcat -c adb logcat | grep -iE "START u0.*cmp="  # 2. 找出你这台的快应用包名 adb shell pm list packages | grep -iE \   "hybrid|instant|fastapp|quickapp|fastengine"  # 3. 关掉(华为是 com.huawei.fastapp,别家换成上一步的) adb shell pm disable-user --user 0 com.huawei.fastapp  # 4. 确认(有输出=已关) adb shell pm list packages -d | grep -iE "fastapp|hybrid|instant"  # 5. 恢复 adb shell pm enable com.huawei.fastapp  # 6. 收工:回设置里关掉 USB 调试

END

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料