MapAdKiller

高德 / 百度 / 腾讯地图 去广告 Xposed (LSPosed) 模块 Ad-blocking LSPosed module for Amap / Baidu Maps / Tencent Maps

中文 | English


中文

一个纯本地运行的 LSPosed 模块(libxposed API 102:XposedModule 入口 + META-INF/xposed 元数据,无 legacy de.robv 依赖),针对国内三大地图 App 的开屏广告、首页运营横幅、信息流广告卡、第三方广告 SDK 做确定性拦截。所有 hook 点均来自对目标 APK 的静态逆向分析(jadx / apktool / androguard),证据表见 docs/ANALYSIS.md。

功能一览

目标 App 包名 拦截内容
高德地图 com.autonavi.minimap 开屏广告(强制走自家 NO_SPLASH 收尾路径,不卡启动)、实时广告拉取、首页轮播 Banner、后台推送运营弹窗、搜索页模板开屏、AJX 首页联动广告数据、工具栏「高德出行节」、「我的」页「好友动态」行、「我的」页「答题瓜分百万大奖」红包卡(后三项无开关,直接清除)
百度地图 com.baidu.BaiduMap 开屏广告(视图层 SplashViewContainer.addView 探测隐藏,广告零曝光且不卡开屏)、悬浮运营黄条("做任务领现金"类)、首页中部横幅、BMAd 开放封装;ADN 加载器与 SplashAdManager 闸门改为放行观察,不再断链路(v1.0.7)
腾讯地图 com.tencent.map 广点通 GDT SDK 初始化(initWith=false,连带 tangramsplash / 融合 SDK 全部失效)、开屏流水线任务、首页 Banner 数据绑定、POI 列表广告卡(视图层)

另含通用视图清扫兜底(ViewKiller):每次 Activity resume 后遍历视图树,命中已知广告类名/资源名即 GONE + 移除子树。

高德首页 / 「我的」页 UI 自定义(v1.0.5 起)

模块 App 内提供设置页,可逐项开关高德地图的首页与「我的」页元素:

分类 可配置项
主页标签栏 首页 / 探索 / 长按说话 / 打车 / 我的 —— 逐 tab 隐藏,剩余自动均分重排
首页工具宫格 10 个工具逐格隐藏,剩余格子行内补空;扩展工具页可单独开关
首页推荐内容 天气卡、周边景区、榜单帖、距离卡(公里/米)、精选榜单、攻略内容流、问问 AI、推荐频道栏、设置家等
「我的」页 订单栏、车辆服务栏、达人任务、运营卡栏、猜你喜欢、资质信息/协议中心
搜索栏下方快捷入口 美食 / 酒店 / 景点门票 / 加油充电 / 出行节 / 扫街榜 整排(默认关闭,设置页可开)
强制清除(无开关) 工具栏「高德出行节」、 「我的」页「好友动态」行、「答题瓜分百万大奖」红包卡
其他 隐藏桌面图标(可开关;隐藏后可用快捷设置磁贴或 adb shell am start -n io.github.ldxm666.mapadkiller/.MainActivity 打开设置页)

改动写入 LSPosed RemotePreferences,强停高德后重新打开即生效(普通 App 作用域无需重启系统)。

作用域闸门(v1.0.7):所有首页 /「我的」页规则都只在被认领过的 AJX 列表内生效 —— 认领证据必须是这两个页面独有的(工具宫格 ≥2 行、或 ≥3 个「我的」页条目、或 ≥2 个首页 chips)。 路线规划页一条都不满足,因此整页不受任何影响(旧版会把方案卡上的「2379公里」当成 距离卡锚点,把整块路线信息模块一起抹掉)。

实现要点:AJX 信息流卡片挂在列表适配器的 onBindViewHolder 上,在绑定完成的同一帧内判定并隐藏, 卡片一次都不会被绘制出来 —— 不是"渲染后再删"。

性能

所有隐藏都发生在首帧绘制之前(绑定前先挂 alpha 0,判完同帧决定),所以看不到「先亮一下再消失」。 实测首页列表来回猛滑 10 次:2778 帧 / 掉帧 7 帧(0.25%),50th 8ms、90th 19ms。

安装

  1. 需要 root + LSPosed(libxposed API 102;实测 KernelSU + ZygiskNext + LSPosed v2.1.1 / Android 16)
  2. 安装 MapAdKiller.apk
  3. 在 LSPosed Manager 中启用本模块(staticScope=true 固定作用域:高德/百度/腾讯,见 app/META-INF/xposed/scope.list)
  4. 重启目标 App 生效(无需重启手机)

构建(无需 Android Studio / Gradle)

纯命令行工具链:JDK + Android SDK build-tools(aapt2/d8/apksigner)。

# Windows PowerShell
.\app\build.ps1
# 产物: dist/MapAdKiller.apk

依赖路径在 build.ps1 顶部可改($Sdk / $Bt / $Aj / $Jdk)。Xposed API 使用仓库内 app/stub-src/ 的 compile-only 桩(签名与 API 82 一致,运行时由框架提供,不打进 APK)。

已知边界

  • 广告为服务端概率下发,"某次没广告"不能作为验证依据;请以 logcat MapAdKiller: 日志为准(adb logcat -s LSPosedFramework | grep MapAdKiller)
  • 百度地图首页"爱去榜/旅游攻略"为百度自家内容推荐(非广告 SDK 下发),不在本模块范围
  • 百度地图 22.0.0 起不再强改 SplashAdManager.F()/z() 的返回值(混淆方法名重排后强改会把 App 锁死在开屏)。广告改由视图层 SplashViewContainer.addView 探测隐藏;另加一层开屏 watchdog, 非主页面的 decor 里若仍挂着可见开屏容器就 finish() 放行 —— 与手动按返回键是同一个操作
  • 高德"探索"tab 内嵌 AJX 画布渲染的内容卡片无法在原生视图层定位,暂未处理
  • 打车 tab "单单省"角标等平台促销徽标未处理
  • 目标 App 大版本更新可能导致混淆方法名漂移,hook 未命中时日志会输出 miss 行,欢迎提 issue 附日志

隐私

模块不联网、不采集任何数据;所有逻辑仅修改目标 App 进程内的广告组件行为。

License

GPL-3.0-or-later


English

A local-only LSPosed module that deterministically blocks splash ads, home banners, feed ad cards and third-party ad SDKs in the three major Chinese map apps. Every hook point was derived from static reverse-engineering (jadx / apktool / androguard) of the target APKs — see docs/ANALYSIS.md.

  • Amap (com.autonavi.minimap): splash (forced into the app's own NO_SPLASH path — no launch hang), real-time fetch, home carousel banner, background push ops-popups, search-page template splash
  • Baidu Maps (com.baidu.BaiduMap): splash across all three channels (native/openapi/push), the mediation layer feeding 6 ad networks (Business/GroMore/Meishu/Octopus/Qumeng/Recommend), floating promo yellow bar, mid-banner
  • Tencent Maps (com.tencent.map): GDT SDK init kill (initWith=false neutralizes tangram splash + fusion SDK), splash pipeline tasks, home banner binding, POI list ad cards (view layer)

Plus a generic ViewKiller sweep on every Activity.onResume matching known ad view classes and resource ids.

Requires root + LSPosed (tested on KernelSU + ZygiskNext + LSPosed v2.1.1, Android 16). Build without Android Studio: .\app\build.ps1 (JDK + SDK build-tools only).

Ads are probabilistically server-delivered — verify via logcat -s LSPosedFramework | grep MapAdKiller (HOOKED / KILLED / forced NO_SPLASH lines), not by one ad-free launch.

Licensed under GPL-3.0-or-later.

Releases

9-1.0.9

Stable

9/26/2026, 5:07:40 PM

MapAdKiller v1.0.9 (versionCode 9)

  • 榜单/特色推荐卡统一开关
  • 液态玻璃设置页
  • 隐藏桌面图标后 LSPosed 入口常驻
  • 幽灵格机制(修复乱闪与点击穿透)
  • 更多工具/秒送识别与修复

Assets

1

1.0.7

Stable

9/18/2026, 1:24:02 PM

v1.0.7 (2026-09-18)

修复:高德首页「删了标签,悬浮栏没被占满」

藏掉标签只改了槽位宽(weight 平分),但那一层选中胶囊 id=tab_bg_layer 的宽度
是高德自己按 totalWidth / 标签总数 算死的,它不知道我们藏了几个。
于是 5 个标签变 2 个之后胶囊还是 201px,首页 / 我的悬在 1/4、3/4,中间和两头全是空的。

现在每个可见槽位的胶囊层会被撑成槽位宽度本身 —— 等价于高德自己按 2 个标签排出来的样子。
真机实证:TAB-FILL slot=503 visible=2 rowW=1006,整条悬浮栏占满。

修复:「部分隐藏」会把路线规划页的信息模块一起抹掉(严重)

根因是整棵 decor 树照单全收:路线页备选卡片的里程文案 2379公里 / 34米
命中了首页信息流的「距离标签」规则(isDistanceLabel),collapseHost 顺着父链
爬到列表宿主,把「24小时22分 / 大众常选 / 封路」那一整排路线信息模块 GONE 掉。

现在加了页面闸门(铁律 G):首页与「我的」页都带底部悬浮标签栏
(LiteTabBar > TabItemLayoutV2),路线页 / 搜索页 / 导航页没有。
认不出标签栏就整轮放弃,一个节点都不碰;列表绑定钩子同样受这道闸门约束。
真机实证:进入路线页后 COLLAPSE / BIND-HIDE 归零,三个备选路线卡片完整。

新增:隐藏桌面图标(可开关)

LAUNCHER intent-filter 移到 activity-alias(.LauncherAlias)上,
设置页新增「隐藏桌面图标」开关,切的就是这个组件的 enabled 状态。

  • 隐藏时挂一条常驻通知当回家的路(点按回设置页),并申请 POST_NOTIFICATIONS;
  • 手动兜底:adb shell am start -n io.github.ldxm666.mapadkiller/.MainActivity;
  • 在 LSPosed 管理器里把模块停用不受影响,桌面图标状态存在系统组件表里。

真机实证:disabledComponents: io.github.ldxm666.mapadkiller.LauncherAlias,
resolve-activity -c LAUNCHER 返回 No activity found,通知正常常驻。

新增:「收藏夹」独立开关

宫格第 3 行是轮播格(景点游玩 / 离线地图 / 通行费助手 / 收藏夹 / 更多工具 …
在几个槽位里换着显示)。「收藏夹」以前被并进「更多工具」的别名,
受「扩展工具页」和「更多工具」双重夹击,不管怎么设都是隐藏的。

  • 从 TOOL_EXTRA_LABELS 里摘出来,TOOL_ALIAS 归一成自己的键;
  • 留不留,只看这一格此刻显示的那个文案自己的开关,不再看 cellKey
    (那是首见文案钉住的键,轮播格钉错了就永远放不出来);
  • 「保过一次就永久保」:轮播轮到收藏夹时会把格子放出来,并把它从隐藏登记表里摘掉;
  • 收行判据改成配置驱动(markKeep)并支持反悔:
    以前按当时的 width/height 判空行,AJX 首帧还没量过时整行会被误判成空行收掉,
    而 squashedRows 每轮重申 GONE+height=0 —— 那一行就永久死了。

新增:隐藏搜索页金刚区(美食 / 酒店 / 加油站 / 休闲玩乐 / 扫街榜)

搜索页顶部那排分页运营位,设置页新增「高德 · 搜索页」分区独立开关(默认显示)。

识别方式是结构投票:只有当某个容器子树里同时挂着 >=4 个分类文案时才认它,
命中从上往下第一个满足的祖先(最小那个),再往上走几层把分页小圆点一起收掉。
单看一个「美食」绝不动手 —— 首页信息流、我的页、宫格里都有它。
这条规则不属于首页,所以跑在页面闸门之前。
真机实证:SEARCHCAT-HIDE Container [31,13 1017x223],金刚区与圆点一起消失,
搜索框 → 快捷 chip → 历史记录 之间不留空带。

修复:百度地图卡在开屏,要按返回键才进主页(严重)

根因:广告 SDK 自动检索把 com.meishu.sdk.core.ad.splash.SplashAdLoader#loadAd
一起吞了(不 proceed、返回默认值)。百度开屏正是等这条回调往下走的,
回调永远不来 → 开屏流程永远收不了尾,屏幕还留一层不消失的暗色蒙层。

修法:凡是开屏链路(类名或方法名含 splash / kaiping)的加载方法一律不吞,
原方法照常执行。开屏广告不需要在这一层拦 —— 视图层已经用 alpha=0 兜底,
零曝光且完全不影响开屏自己的收尾节奏。

修复:百度开屏广告被 GONE 掉同样会掐死收尾

视图层原来对开屏广告根做 setVisibility(GONE)。真机实证:GONE 之后
「跳过 5s」倒计时与收尾回调一起死,同样表现为卡开屏。
改成 setAlpha(0f) —— 视图照常 measure/layout/跑动画/收回调,只是看不见。
真机实证:日志从 hidden 变 hidden(alpha0),倒计时 5s→4s 正常走,
百度冷启动 1 秒内进入 MapsActivity,无蒙层、无广告曝光。

修复:首页「去幸福路步行街」快捷卡被压成半张(用户报「半遮住、很难看」)

根因:那张卡里也有一个写着「打车」的按钮,ascendSmallCell 照样爬到了它的容器
(161x95,父容器 1006x210),于是它被当成工具宫格的一格;packRow 随后
按工具格尺寸(158 宽)把整张卡重排 —— 卡片文字被压成 84px 宽,
「去幸福路步行街」只剩「去幸」两个字。

真机日志证据:TOOL-HIDE 打车 [801,57 161x95] + TOOL-REPACK [0,0 1006x210] cells=4。

修法:两道形状闸门。工具格实测 158x147 / 158x164,所以

  • applyTools 里先问 looksLikeToolCell():宽 120220 且高 120200 才算宫格格子;
  • packRow() 入口再加一道同样的闸门,任何被误判的容器都不会被重排。

真机实证:TOOL-HIDE 打车 [636,0 158x164](真格子),
卡片文案恢复 w=617(与停用模块时的基线完全一致),TOOL-REPACK 不再误伤。

修复:「设置家 / 设置单位 / 常去地点」不再连带整张卡

这一排和「去XX」快捷卡常常在同一个 AJX item 里,原来走 collapseHost
会把整张 item 一起收掉。现在 hideChipsRowOnly() 只摘那一排
(最小、且子树里挂着 ≥2 个 chips 文案的祖先),真机日志 CHIPS-HIDE。

修复:「更多工具」页白屏 + 收藏夹看不见(严重)

两个症状同一个根因:搜索页金刚区的规则跑到「更多工具」页上去了。

applySearchCats() 按设计跑在首页闸门之前(搜索页没有底部标签栏),
而「更多工具」页的「服务」区里全是同一批分类词 —— 美食 / 洗车养车 / 洗牙 /
休闲玩乐 / 订酒店… 于是整页被当成金刚区收掉,用户点进去就是一片白。

同一个根因还让「收藏夹」看着像没生效:那一页的入口全被收没了,
开关开不开当然都看不见(开关本身一直是好的)。

另外标签级即时隐藏(消闪烁那段)以前不分页面:只要文案命中就盖掉,
于是「更多工具」页里的「代驾 / 旅游度假 / 景点游玩…」变成"有图标没字",
就是用户说的「偶尔跳出其他工具出来」。

修法(两道):

  • 金刚区规则加结构护栏:命中的容器祖先链上必须有 HorizontalScroller
    —— 搜索页金刚区是分页横向滚动条里的一排,「更多工具」页的分类宫格不是;
  • 标签级即时隐藏加归属护栏:工具键必须真的是宫格格子(looksLikeToolCell),
    规则键必须真的在首页(homeCtx)。

真机实证(A/B 对照):

停用模块:更多工具页 30 条文案正常渲染,「最近使用」里 收藏夹 / 驾车 / 租车 都在
启用模块:同样 30 条文案,收藏夹在,白屏消失
模块动作全部落在首页(TOOL-HIDE 几何全是 158x147 / 158x164)
搜索页:SEARCHCAT-HIDE Container [31,13 1017x223] 照常命中

新增:首页运营推广卡槽位开关(「去XX」/ AI叫车 / 顺风车…)

首页底部那个槽位是高德的轮播推广位,标题一天能换好几张。实测同一台机器上
连着几十分钟就换了五张:

去幸福路步行街    / 有座不拥挤 · 行程有保障     / 打车
帮我预约车辆      / 通勤高峰担心拥堵、叫不到车 / AI叫车
帮我叫一辆空气清新的车 / 怕叫到臭车?试试个性化叫车 / 去打车
预约顺风车,一口价超便宜 / …                 / 去预约
顺路搭模式上线了  / 拼座7折起 · 乘客邀请直接拼入 / 去预约

盯文案永远追不上,所以最后落到结构上。真机 uiautomator 实测这五张卡版式完全一致:

标题  [185,2093] w≈580~617 h=55
副标  [185,2161] w=150~179 h=39   (两个 chip)
按钮  [845,2130] w=112 h=47       (右侧药丸)

判据:整屏宽(≥90%)+ 高 180320 + 一个 ≥5 字的标题 + 一个 27 字的短按钮,
并且这个节点本身就是列表 item(父级是 AjxList2)。

三条护栏:

  • 宫格 item 是 1080x508,高度直接出界;
  • 「我的」页那些整屏宽的行里必有 MY_* 文案,一律排除;
  • 天气 / 限行卡形状也撞得上,按「°C / 天气 / 限行 / 气温 / 降雨」排除。

两个实现要点(都踩过):

  1. 扫文案时直接读视图(AJX 的 Label 把文字挂在 contentDescription 上),
    不能查 anchors 索引 —— 索引里只有"被规则认领过"的文案,新面孔永远等不到;
  2. 绑定那一刻 item 还是 0x0,判不了几何 —— 所以除了 bind 钩子,
    每一轮 applyPass 在布局稳定后还会再找一遍(PROMO-HIDE)。

真机实证:BIND-HIDE home_quick_card [0,0 0x0] —— 命中的正是没写进任何文案表的
「顺路搭模式上线了 / 去预约」那一版。

新增:「去XX」快捷打车卡单独开关

首页底部那张「去幸福路步行街 / 有座不拥挤 / 行程有保障」的智能目的地卡,
设置页新增独立开关(默认显示)。

判定用的是「标题形状 + 旁证」两条:标题以「去」开头、长度 2~16、不是工具键也不是
chips 键;并且往上 8 层内能找到挂着「有座不拥挤 / 行程有保障 / 打车…」的小块。
只有形状命中就乐观登记,旁证由每一轮 applyPass 再判 —— 因为标题 setText 的时候,
旁边那行小字往往还没写进去,当场判定必然落空。

真机实证:BIND-HIDE home_quick_card [37,507 1006x242],卡片整条消失,
页面收得干净,不留空带。

增强:常驻重申心跳

resume 时只排 6 轮 APPLY(最晚 4.2s),之后 applyPass 停手;而 AJX 在滚动 /
重渲染时会把被压掉的 item 复活。现在加了一条只跑 reassert() 的 300ms 心跳,
并在 onBindViewHolder 里对已判定要收的 item 立刻重新按回去。

修复:隐藏不再写 lp.height = 0

AJX 重绑时会 setVisibility(VISIBLE) 但保留我们写的 height=0,
那张卡就变成"半张、文字被切"的残片。改成只 GONE:GONE 的节点根本不会绘制,
从机制上不可能产生残片。

其它

  • 页面闸门同时让「我的」页之外的误伤面归零;
  • versionCode 7 → 8。

Assets

1

v1.0.6

Stable

9/13/2026, 8:09:47 AM

v1.0.6 (2026-09-13)

新增:广告 SDK 自动检索 + 学习 + 持久化

不再只靠内置的厂商前缀表 —— 内置表永远只能找到已经写进去的厂商。现在:

  • 自动发现:扫描目标 App 自身 APK 里的 dex 字符串表(纯 Java 解析 string_ids,
    只读短字符串、不遍历全文件,无 DexKit / 无 native 依赖),既匹配内置前缀,
    也按广告特征词找出可疑类,再从类名反推厂商根包名;
  • 安全闸门(重要):广告特征词必须落在类名前 4 段命名空间内 + 基础设施根黑名单。
    否则会误学 —— 实测高德曾被学出 com.alipay / com.google / com.huawei /
    com.taobao / com.alibaba 等 15 个非广告包,真拦下去会把登录、支付、地图本体一起打死;
  • 持久化:hook 侧拿到的 RemotePreferences 是只读实现
    (UnsupportedOperationException: Read only implementation),
    且超时/广播跨进程唤起在 HyperOS 上会被拦 → 改用 ContentProvider 通道
    (ContentResolver.call() 按需唤起设置 App 进程)把学到的东西交给 App 侧落盘,
    并加了一层本地 prefs 暂存兜底;
  • 下次直接拦:学到的厂商前缀跨进程保存,三家地图下次启动读到即生效。

设置页新增「已捕获广告 SDK:N 个」一行,点开可看清单、可一键清空重新学习。

修复:框架类被全局 hook 导致百度闪退 / 腾讯 ANR(严重)

SDK 自动 hook 最初沿父类链往上走,从 SDK 类一路升到 android.view.View /
android.app.Dialog / android.content.ContextWrapper 并挂上了钩子:

SDK BLOCK android.app.Dialog#show          ← 全局 Dialog 被拦
SDK CTX   android.app.Activity#startActivityIfNeeded
SDK CTX   android.content.ContextWrapper#startService
→ ANR in com.tencent.map / 百度地图闪退

这与 v1.0.2 白屏事故同源,是本模块第一红线。已改为只处理声明在 SDK 类自己身上的
方法,并加框架包硬闸门(android. / java. / dalvik. / androidx. / kotlin 一律不动)。
实测三家 App FATAL=0 / ANR=0,框架类 hook 残留 0。

修复:状态显示与实际不符

原来用 StatusCheck.amEnabled() 自检 —— 它依赖"模块被注入自己的进程",
实测 LSPosed 不会这么做,于是明明已激活却显示未激活。
改为两个可验证的真实信号,并配红/绿点:

● 已激活 · LSPosed 2.1.1                 (LSPosed 服务可达)
● 作用域已勾选 · 高德 / 百度 / 腾讯(3/3) (向服务查询 getScope())

修复:设置 App 启动即崩

NoClassDefFoundError: io.github.libxposed.api.XposedInterface$Hooker
  at Config.prefs → SdkAutoBlock.loadLearned → MainActivity.sdkSummary

io.github.libxposed.api.* 是只编译不打包的 stub,App 进程里没有这个包。
已加 hookSide 闸门:App 侧一律不触碰 H / Config.prefs()。

优化:百度开屏广告隐藏提速 3 倍

原来只有等"跳过"文字出现才认得出广告,广告先亮 1 秒。补上实测命中的 token
(qumeng / advlib / splashcountdown)并加 onPreDraw 探针:

旧: BMAP splash ad hidden t=1000ms hit=skip-btn:...SplashCountdownView
新: BMAP splash ad hidden at=350ms hit=qumeng:com.qumeng.advlib...

优化:高德首页内容流

信息流卡片改为挂列表适配器的 onBindViewHolder,在绑定完成的同一帧内判定并隐藏;
并补挂 onPreDraw 复查 —— 新帖的文字往往在 onBindViewHolder 返回后才写入,
只在绑定时刻判会漏。实测滚动过程中 100+ 次 BIND-HIDE,几何全为 0x0(从未被绘制)。

其他

  • 品牌统一:设置页标题 MapAdKiller,分类标题标明作用域(高德 · 首页工具宫格 等)
  • 修复「已捕获广告 SDK」计数不刷新(onCreate 时的空快照 vs 点开时的实时值不一致)
  • 替换模块图标

Assets

1

v1.0.5

Stable

9/11/2026, 1:22:06 PM

v1.0.5 (2026-09-11)

新增:高德首页 / 「我的」页 UI 自定义(并入原 AmapEnhancer 引擎)

把独立模块 AmapEnhancer 的整套 UI 引擎合并进本模块(包名仍是
io.github.ldxm666.mapadkiller,百度 / 腾讯 hook 原样保留)。模块 App 现在带有设置页,
改动写入 LSPosed RemotePreferences,Hook 侧同名 group 读取,写入即生效。

可配置项:

  • 主页标签栏:逐 tab 显示/隐藏(首页 / 探索 / 长按说话 / 打车 / 我的),
    剩余 tab 自动均分重排,不变形
  • 首页工具宫格:10 个工具逐格显示/隐藏,剩余格子行内左对齐补空;
    另加「扩展工具页」开关(景点游玩 / 离线地图 / 通行费助手 / 收藏夹 / 旅游度假,默认隐藏)
  • 首页推荐内容:天气卡 / 周边景区 / 榜单帖 / 距离卡(公里与米)/ 精选榜单 /
    攻略内容流 / 问问 AI / 推荐频道栏 / 设置家等 chips
  • 「我的」页:订单栏 / 车辆服务栏 / 达人任务 / 运营卡栏 / 猜你喜欢 / 资质信息与协议中心

关键修复:一条推荐区规则把整个工具宫格抹掉

旧引擎让「文本锚点」直接决定「收缩到哪个祖先」。宫格第 3 行轮播出的 景点游玩
命中了推荐区锚点里的「景点」子串 → 被当成 feed_scenic → 沿父链爬到 AJX 列表 item
——而那个 item 就是整个工具宫格 → GONE + 高度归零。整排工具因此消失。

修复:先判定归属面,再执行动作;工具格/行/宫格登记为受保护节点,
任何「收缩 item」的爬升路径一旦穿过受保护节点立即中止。

关键修复:排版重叠错乱

曾尝试跨行把 更多工具(宫格第 3 行)搬进第 1 行的空槽,
实测会被 AJX 自有模型的下一次布局覆盖,两套几何叠在一起 → 标签重叠。
现已退回安全实现:只做行内左对齐压实 + 空行压 0 高,绝不改格子的父节点。

根治:信息流卡片改为「绑定即隐藏」,不再渲染后再删

实测 AJX 列表适配器 ...ajx3.widget.view.list.a 是混淆的,字段只有
IAjxContext / zr / nv0 —— native 侧不存在条目数据列表,数据在 JS 引擎里,
Java 层没有可直接过滤的数据结构。因此改为挂载该适配器的 onBindViewHolder,
在条目绑定完成的瞬间(仍在本次 layout pass 内、这一帧还没绘制)判定并隐藏:

  • 真机实测 29 次 BIND-HIDE,几何全是 0x0 —— 卡片一次都没有被绘制出来
  • 不再依赖「下一帧再扫全树」,也不再 600ms 常驻轮询

其他修复

  • 配置不保存:edit().apply() 是异步落盘,切完开关立刻退出设置页会丢写入 → 改 commit()
  • 设置页开关显示错:LSPosed 服务是异步绑定的,绑定前 readState() 只能回退默认 true,
    重开设置页会看到「全开」→ 现在绑定成功后按真实存储重刷,绑定前开关禁用
  • 频道栏摘不掉:它的文案既不走 Label.setText(String) 也不走 Label.setAttribute("text",…),
    文本锚点完全失效 → 改为结构识别(HorizontalScroller + ≥3 个高 60~170、宽 ≤250 的 chip;
    注意要忽略 53x11 的下划线指示条,否则永远匹配不到)
  • 锚点丢事件:车辆服务 这类锚点在 setText 时其 HorizontalScroller 尚未 attach,
    旧实现重试 3.5 秒后放弃 → 改为常驻 WeakHashMap 索引,每轮重试到挂载为止
  • 工具名与实际文案不一致:火车票机票→火车票、高德扫街榜→高德扫街(别名归一)
  • 我的页条目带装饰字符(实际是 -资质信息 / 协议中心-)导致精确匹配永远失败 → 归一后匹配
  • 距离卡只认「公里」,漏掉同城卡的「597米」→ 补上米

性能

  • 每个锚点不再各自 postDelayed(500ms) + 150ms×20 重试,隐藏/重排合并到下一帧执行一次
  • 配置改为每轮 getAll() 快照一次,锚点判定读内存(原先每次判定都走一次 RemotePreferences IPC)
  • 去掉 600ms 常驻全树轮询,改为 resume 后按 100/350/800/1500/2600/4200ms 收敛几轮

其他

  • 替换模块图标
  • module.prop 补齐收录所需标准字段(name / version / versionCode / author / description)

Assets

1

v1.0.4

Stable

9/10/2026, 10:45:14 AM

v1.0.4:与 v1.0.3 代码完全一致的重新发布版本。

v1.0.3 的发布说明曾被收录站点以乱码快照缓存,本版本通过版本号升级(versionCode 5)
强制重新索引。功能内容:

  • 修复 v1.0.2 起 Hooker 接口方法名错误(hook -> intercept)导致的全部 Hook 静默失效(AbstractMethodError)
  • 修复百度 21.20.30 启动白屏/卡开屏(回退未经真机验证的开屏 Hook)
  • 适配百度 21.20.50:自营开屏绕过数据闸门,新增 SplashViewContainer.addView 探测拦截(品牌层/倒计时流程不受影响)
  • hookAll 跳过 abstract 方法;Hook 首次触发记录 HIT 日志

真机回归:高德 17.x / 百度 21.20.50 / 腾讯 11.x(Android 16, LSPosed API 102)

Assets

1

v1.0.3

Stable

9/10/2026, 10:35:07 AM

v1.0.3 关键修复与适配:

  • 修复 v1.0.2 起 Hooker 接口方法名错误(hook -> intercept)导致的全部 Hook 静默失效(AbstractMethodError)
  • 修复百度 21.20.30 启动白屏/卡开屏(回退未经真机验证的开屏 Hook)
  • 适配百度 21.20.50:自营开屏绕过数据闸门,新增 SplashViewContainer.addView 探测拦截(品牌层/倒计时流程不受影响)
  • hookAll 跳过 abstract 方法;Hook 首次触发记录 HIT 日志

真机回归:高德 17.x / 百度 21.20.50 / 腾讯 11.x(Android 16, LSPosed API 102)

Assets

1

1.0.2

Stable

9/8/2026, 10:34:17 AM

v1.0.2: libxposed API 102 refactor; sync Amap 17.00 / Baidu 21.20.30 / Tencent 11.5.0; cached SDK splash (SplashViewContainer) kill; in-app ad expansion (POI/route/floating promo); ad-badge ViewKiller.

Assets

1

1.0.1

Stable

9/4/2026, 5:20:46 AM

v1.0.1: 高德 14 / 百度 34 / 腾讯 8 hook 点 + ViewKiller 兜底。换用 io.github 命名空间包名。

Assets

1