Skip to content

Releases: ldxm666/MapAdKiller

MapAdKiller v2.0.2

Choose a tag to compare

@ldxm666 ldxm666 released this 30 Sep 06:24

v2.0.2(versionCode 202)—— 我的页两张卡:进页即消失、无留白

修复(用户真机逐轮反馈,最终形态)

  • 「百度运动」「全民共建」关掉后仍在:
    这两张卡是 JS 拿到 UGC 数据之后才渲染的,而摘卡的复扫原本只在 OnGlobalLayout 里跑
    —— 布局回调没触发的那几秒,卡片就明晃晃挂在页面上(用户:"刚进去一直在,要等一会儿才消失")。
    现在进入「我的」页后每 200ms 复扫一次(持续约 15 秒,之后自动停),
    卡片一被渲染出来就被摘掉,用户最多看到一闪。
  • 关闭后留下大片空白:早期版本是在页面画完之后才摘视图,而「我的」页是 AJX 自绘列表
    (按预计算坐标摆位,不会重排)→ 摘掉就留洞。
    现在摘除发生在布局阶段(配合上面的高频复扫),不产生空洞;
    并且 JS 若把卡再插回来,下一轮 200ms 复扫会当场再摘。
  • 注意:模块更新后必须重启目标 App(LSPosed 注入发生在进程启动时)——
    adb shell am force-stop com.baidu.BaiduMap 再打开。用户上一轮"卡片还在"的原因正是模块装得比进程晚。

一并交付(v2.0.2 前几轮已修)

  • 首页左上角运营气泡(新鲜事 / 一键穿越 / 古今地图)按资源 id 命中清除
    (event_entry_container / left_container,运行时按名解析,不怕数值重排)。
  • 搜索框热词轮播钉死为默认提示词「查找地点、公交、地铁」。
  • 「我的车 / 导航车标 / 热门语音 / 热门活动」开关失效修复(撤销 gk 共享闸门的误伤)。
  • 更新提示:6 小时节流改为只在同一次运行内生效(冷启动必查)+ 设置页顶部整宽大按钮
    (绿=已最新 / 黄=立即更新 / 蓝=点此重试)。

真机验收

  • 冷启动 → 进「我的」→ 3 秒内:百度运动 / 全民共建 / 反馈中心 全部消失且无空白,
    只剩用户开着的那几张卡(热门语音 / 我的车 / 导航车标 …);全程 FATAL=0。
  • 首页:搜索框为默认词、左上角无气泡。

MapAdKiller v2.0.1

Choose a tag to compare

@ldxm666 ldxm666 released this 30 Sep 04:24

v2.0.1(versionCode 201)—— 开关失效修复 + 首页广告位清除

修复(都是用户真机报的问题)

  • 「我的车 / 导航车标 / 热门语音 / 热门活动」的开关失效(v2.0.0 引入):
    根因是 phoneInfo.gk 闸门 —— gk !== '0' 同时写在 8 张卡的 s-if 里,
    只要注入 gk=0,这些卡自己的开关就被压住(表现为"打开了还是不显示")。
    现在只在「这几张卡本来就都该隐藏」时才注入 gk;各卡改由 per-card 过滤控制,
    广告/运营卡也一并从共享闸门改成逐卡名摘除。真机日志:mine js 补丁里
    卡片名逐个列出(C.car/voice/carLogo/sport/contribution/common/...)。
  • 「全民共建 / 百度运动」关不掉:JS 层注入被 App 新版 bundle 加载机制挡住
    (biz_pkg_path 只覆盖外壳与资源包;内容入口 loadScriptFromString 一次都没触发;
    连"写新文件 + 同步 pkginfo.json 的 md5"也不被认)。
    改为视图层兜底:按标题锚点(百度运动 / 反馈中心)整块摘卡,
    复用首页同款 hideSection 的三重保险(满宽 / 高度上限 / 禁词消歧)。
    真机验证:两张卡消失,页面其余区块与页头不受影响。

新增(用户要求)

  • 首页左上角运营浮层清除:「一键穿越 / 古今地图 / 新鲜事」那类贴图广告,
    判据是"可点击 + contentDescription 命中白名单 + 位于屏幕左上",实测命中并 GONE;
    浮层是绝对定位的地图叠加层,GONE 不影响右侧「图层 / 反馈」按钮。
  • 搜索框热词轮播钉死:首页搜索框里的运营热词("青城山门票 / 成都海昌极地海洋公园…")
    不再轮播 —— 把 tv_searchbar_title(及其所属切换器子树)的文案钉成默认提示词
    「查找地点、公交、地铁」。不摘控件、不动搜索框。真机验证:60 秒后仍是默认词。
  • 两项都进了设置页新的**「首页广告位」**分组,默认关(= 已清除),可随时打开恢复。

说明

  • 开关语义不变:true = 显示。改完「我的」页开关重开该页即生效;首页开关强停 App 后生效。
  • 高德 / 腾讯侧能力与 v2.0.0 一致,未改动。

MapAdKiller v2.0.0

Choose a tag to compare

@ldxm666 ldxm666 released this 30 Sep 01:51

MapAdKiller v2.0.0(versionCode 200)—— 合并 BMapClean

这一版把另一个独立模块 BMapClean(百度地图界面精简)整体并入本模块。
模块 id / 应用名 / 签名全部不变(io.github.ldxm666.mapadkiller),所以是就地升级:
LSPosed 里原来的启用状态、作用域勾选(高德 / 百度 / 腾讯)和已有配置全部沿用,
不用重装也不用重新勾选。原来那个 io.github.ldxm666.bmapclean 包可以直接卸载。

新功能一:设置页左右滑动分页

原来的单页长列表按 App 拆成三页,左右滑动切换,顶部标签也能直接点:

页 内容
百度地图 首页底部入口栏 / 工具宫格 / 回家去公司 / 天气 / 推荐信息流 / 「我的」页 + 模块状态卡
高德地图 首页标签栏 / 工具宫格 / 推荐内容 / 「我的」页 / 搜索框内页 + 去广告卡片
其他 隐藏桌面图标 / 工具宫格排序 / 调试日志 / 去广告说明

新功能二:版本检查与更新提示

  • 每次打开设置页自动查最新版本:多源回退,没有代理也能用 ——
    gh-proxy.com 反代 → jsDelivr CDN → jsDelivr(fastly) → GitHub 官方 → gh-proxy 反代 raw。
    结果缓存 6 小时,点版本行强制刷新;全部源失败只显示「未获取」,不会弹错误框。
  • 界面顶部显示当前版本 + 线上最新版本:已是最新 = 绿色,有新版本 = 黄色。
  • 发现新版弹窗,四个出口:镜像下载(gh-proxy,无代理可用)/ GitHub 下载 / Telegram 群 / 稍后更新。
  • 同时显示最佳适配应用版本并对照本机实际版本:
    百度地图 22.0.0 / 高德地图 17.00.0.2005 / 腾讯地图 11.6.0(一致 ✔ / 不一致 ✘)。

并入的百度侧能力(原 BMapClean v0.4.3)

  • 首页:底部入口栏逐项开关 + 剩余项自动均分、工具宫格 15 格逐项、回家 / 去公司、天气(地图右侧 + 底部行程卡)、推荐信息流
  • 「我的」页 —— 视图层方案三次回归后彻底废弃,改为数据层 + JS 层:
    • 数据层:改写 Talos JS 网络响应(qt=ads 的活动/资源位按 ads.content[].type 摘条目)、
      改写手机信息下发(补 phoneInfo.gk=0,一次关掉 天天领钱 / 出行保+借钱 / 我的店铺 / 导航车标)
    • JS 层:改写 TalosBridge.loadJSFile 的 biz_pkg_path 指向打过补丁的副本,
      在页面 JS 里把 sport / contribution / common(宫格) 从 cardList 摘掉
    • 真机结果:我的页只剩 头像 / 足迹卡 / 客服中心,无留白、无误伤

修复

  • 百度「我的」页必崩:拦截器读完响应体必须无条件换新 body,否则
    NetworkingModule$c.onResponse 二次 string() 抛 IllegalStateException: closed,
    OkHttp Dispatcher 线程 FATAL(真机栈为证,已修)。
  • 分页一次滑动只翻一页(松手时按拖动起始页判断,不再叠加)。

安装 / 更新

MapAdKiller v1.1.0

Choose a tag to compare

@ldxm666 ldxm666 released this 29 Sep 12:14

MapAdKiller v1.1.0(versionCode 110)

版本口径统一:从本版起,模块对外版本恒为 1.1.0 / versionCode 110,
module.prop» / AndroidManifest.xml» / 设置页 / Release tag 全部一致。

新增开关(默认开 = 已处理,可随时关)

  • 关闭首页搜索框热词轮播(文字流动 / 运营广告词) —— `hotword_off»
  • 关闭首页「去XXX 打车」打车浮窗(打车运营卡) —— `ride_card_off»

本次修复

  • 首页搜索框里的字会自己流动,有时还是广告:反编译 BaseSearchBar» 确认, 写 txt_hotword» 的出口只有 setHotWordTxt(..)» / setPreWordTextView(..)» 两个私有方法;
    新增 HotWordGuard» 挂这 4 条重载,把第一个 String 参数换成 App 自己的 string/title_search_hint»,热词品牌图标一并 GONE。
    真机日志:`HOTWORD-FREEZE '灌县古城' -> '查找地点、公交、地铁'»。
  • 首页总会冒出「去幸福路步行街 / 有座不拥挤 · 行程有保障 / 打车」打车浮窗:
    真机树实证是 AJX 卡片(列表 item 根 = AjxAbsoluteLayout(1006x242)»), 文案服务端下发(dex / resources / assets 全量扫描均无此串), 按「卡内文案锚点 + AJX 列表 item 结构」双判据整卡摘除(首帧之前 + 锚点兜底复扫)。 真机日志:RIDE-CARD-SWEEP '有座不拥挤' [37,391 1006x242]»。

其他

  • 搜索页去广告(`search_ad»)、首页/我的页 UI 自定义、三家开屏断源等历史能力全部保留
  • 详细证据与 hook 设计:`docs/FIX-v1.1.0-hotword-and-ridecard.md»

安装:需要 root + LSPosed(libxposed API 102)。更新模块后建议卸载重装再强停目标 App。
三个地图的包名作用域:com.autonavi.minimap» / com.baidu.BaiduMap» / `com.tencent.map»。

MapAdKiller v1.0.9

Choose a tag to compare

@ldxm666 ldxm666 released this 26 Sep 15:50

更新

新增

  • 榜单/特色推荐卡统一开关(发现好去处/尝尝这里等板块,覆盖首页/我的/路线/目的地,结构识别)
  • 液态玻璃设置页:抽屉导航、配置管理(保存/恢复/导入/导出)、联系作者入口、深色模式自适应
  • 隐藏桌面图标后 LSPosed 管理器入口常驻(CATEGORY_INFO 通道)
  • 顶部运营横幅 / 悬浮推广球强制清除
  • 「秒送」工具识别

修复

  • 工具格隐藏改为「幽灵格」:隐藏格不再被点击穿透,AJX 重建不再复活(乱闪修复)
  • 搜索页快捷入口整排隐藏修复
  • 更多工具页白屏修复

SHA-256: cbecdaeb31836c4ab2ffe9271b47148810d1335f3a70782dc9d2d29d986554ed

v1.0.8

Choose a tag to compare

@ldxm666 ldxm666 released this 24 Sep 04:29

修复已知 bug

v1.0.7

Choose a tag to compare

@ldxm666 ldxm666 released this 18 Sep 13:20

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。

v1.0.6

Choose a tag to compare

@ldxm666 ldxm666 released this 13 Sep 07:41

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 点开时的实时值不一致)
  • 替换模块图标

v1.0.5

Choose a tag to compare

@ldxm666 ldxm666 released this 11 Sep 13:05

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)

v1.0.3

Choose a tag to compare

@ldxm666 ldxm666 released this 10 Sep 10:17

关键修复 v1.0.2 起 Hooker 接口方法名错误(hook -> intercept)导致的全部 Hook 静默失效,并适配百度地图 21.20.50。

  • 修复 AbstractMethodError:v1.0.2 编译期 stub 的 XposedInterface.Hooker 方法名误写为 hook,真实 API 102 为 intercept,导致所有 Hook 运行时静默失败(高德无效 / Android 17 反馈均为此因)
  • 百度 21.20.30/21.20.50 启动白屏/卡开屏修复:回退未经真机验证的开屏 Hook(v1.0.2 实际误 Hook 了 android.view.View 的全局 attach),放开开屏必经路径的吞调用
  • 百度 21.20.50 自营开屏(淘宝闪购等)绕过数据闸门:新增 SplashViewContainer.addView 探测,命中 AD SDK 特征(优量汇/穿山甲/sigmob/kwai)或「跳过」按钮时隐藏广告子树,品牌层与倒计时流程不受影响
  • hookAll 跳过 abstract 方法;每个 Hook 首次触发记录 HIT 日志便于诊断

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