Repository navigation
WeKite 3.79:面板收起兜底 v5(8.0.77 上没有 K0 → 三级探测)
WeKite 3.79
只改一件事:「点聊天区收起表情面板」的兜底(第 5 版) —— 修 8.0.77 上彻底不生效的问题。
3.78 的问题:写死了 8.0.79 的混淆名
你 10-15 那份日志(同一台机器从 8.0.79 切到 8.0.77)把真因钉死了:
11:18:53 DexCacheManager: host version changed: 8.0.793182 -> 8.0.773141
11:44:32 W FloatingChatFooter: native panel collapse failed:
No method matching conditions in com.tencent.mm.pluginsdk.ui.chat.ChatFooter
| 阶段 | 判定成立(fired) | 调用失败 |
|---|---|---|
| 8.0.79 段 | 119 | 0 |
| 8.0.77 段 | 13 | 91 |
钩子本身没问题 —— 8.0.77 上三条钩子都装上了、也都叫到了(panel collapse guard installed on native listener com.tencent.mm.ui.chatting.a9),只有最后那次反射调用找不到方法:
- 8.0.79:
ChatFooter.K0(Z)V存在,方法体 =Q(0,z,-1); - 8.0.77:没有 K0,等价物叫
L0(Z)V,方法体 =N(0,z,-1)(与 79 的 K0 逐指令同构,只差被调方法的混淆名)。
⇒ 兜底在 8.0.77 上必然抛异常、被吞掉,表现就是「表情面板展开后点聊天区不收」。而键盘态看着还能收,是 hideImeFor() 顺手把系统键盘收了救回来的(日志里键盘态其实同样 failed)。
这次(v5)怎么改
三级探测,顺序即优先级,命中即缓存:
| 顺序 | 入口 | 说明 |
|---|---|---|
| ① | K0(Z) |
8.0.79 的现状路径,先试它 ⇒ 8.0.79 行为一字不变 |
| ② | setBottomPanelVisibility(GONE) |
8.0.77 / 8.0.79 两版同名且未混淆,方法体 39 条指令逐条同构:参数 ≠ 0 时调 K0/L0(true),之后还会通知面板可见性监听者 ⇒ 比直接调 L0 更完整,也是抗混淆的长期入口 |
| ③ | L0(Z) |
8.0.77 的等价物,②将来也被改名时的保底 |
顺带两处:命中结果缓存(不再每次触摸做反射查找);「三级全无」的失败日志从 91 行收敛成 1 行。
请你这样测
- 覆盖安装(versionCode 1178 > 已装版本,直接覆盖,不用卸载)→ 重启微信。
- 8.0.77 那台:进聊天 → 点表情按钮展开面板 → 点聊天区 → 应收起。
- 8.0.79 那台:同样操作 → 应和以前完全一样(回归检查)。
- 日志里各出现一行即可定案:
panel collapse entry resolved: setBottomPanelVisibility(GONE)⇒ 8.0.77 走对了新入口;panel collapse entry resolved: K0(Z)⇒ 8.0.79 仍是老路径;native panel collapse unavailable on 8.0.77…⇒ 三级全没命中(说明还有别的差别,我再换方向)。
装机注意
- 没动任何 DEX 锚点(本文件唯一锚点
methodRefreshBottomHeight未碰),预期不会弹「DEX 缓存更新」。 - ② 那条入口是离线取证(两版同名 + 方法体逐指令同构),这次装机就是它的真机验证 —— 万一 8.0.77 仍不收,日志会直接指出下一步方向。
构建:run 253(id 38681367817)/ commit ba6b3657 / 门禁正向 3 + 负向 1 条新标记,反向对 v3.78 的包恰好 4 条 FAIL、零无关 FAIL。