Skip to content

WeKite 3.79:面板收起兜底 v5(8.0.77 上没有 K0 → 三级探测)

Choose a tag to compare

@SymonChu SymonChu released this 15 Oct 05:12
· 4 commits to master since this release

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 行。

请你这样测

  1. 覆盖安装(versionCode 1178 > 已装版本,直接覆盖,不用卸载)→ 重启微信。
  2. 8.0.77 那台:进聊天 → 点表情按钮展开面板 → 点聊天区 → 应收起。
  3. 8.0.79 那台:同样操作 → 应和以前完全一样(回归检查)。
  4. 日志里各出现一行即可定案:
    • 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。