Skip to content

WeKite 3.78:面板收起兜底 v4(跟着宿主监听器走 + 全量记账)

Choose a tag to compare

@SymonChu SymonChu released this 14 Oct 22:55
· 6 commits to master since this release

WeKite 3.78

只改一件事:「点聊天区收起面板/键盘」的兜底重做(第 4 版),并且把「为什么没收」做成日志。

3.77 那次我判断错在哪

读了你的 3.77 日志(01:45:00–01:47:20,507 行):

  • 三条钩子都装上了(外层 MMChattingListView -> MMPullDownView.onTouchEvent、内层 ScrollControlRecyclerView -> ScrollControlRecyclerView.onTouchEvent),
  • 但整段窗口一次 panel collapse fired 都没有 —— 也就是说钩子要么没被叫到、要么状态判断全不成立,而上一版那条「原生监听器收到触摸」的日志被我删掉了,导致这份日志没法自证「到底有没有点到」。
  • 另外那句 innerInOuterTree=true 说明我上一版「点消息不经过外层」的解释不成立(内层列表确实在外层子树里),所以真因还没找到 —— 这也是它比 3.76 更差的原因:3.76 至少偶尔还能收。

这次(v4)怎么改

  1. 不再猜哪个视图:直接从宿主自己的 View.mListenerInfo.mOnTouchListener 取出微信那个收面板监听器实例,钩它自己的 onTouch —— 触发点和微信原生收起完全同点。3.77 里这个入口在「监听器还没装上」时被我静默跳过了,现在改成「下一帧重试 + 失败写日志」,没有静默分支。
  2. onTouchEvent 与 dispatchTouchEvent 都挂(3.76 那版靠 dispatchTouchEvent 收到过 20 次触摸,3.77 只挂 onTouchEvent 是倒退)。
  3. 每条钩子前 8 次调用都记账:panel collapse touch [源]: action=… view=… ty=… ime=… kbFrame=… ⇒ 下一次的日志无论「钩子没被叫到」还是「判据不成立」都能直接看出来。
  4. 键盘判据两条并用(insets + 可见帧差),避免单一信号失灵就把整个判定静默跳过。
  5. 结构取证:列出本页所有自带 OnTouchListener 的视图(类名 + 身份哈希 + 监听器类名 + 是否已注册),用来判「微信的收面板监听器到底挂在哪个对象上」。
  6. 动作仍是微信自己的收起入口 + 键盘可见时补一手系统 IME 收起。

请你这样测(这次日志一定能定位)

  1. 覆盖安装后重启微信。
  2. 进聊天页 → 点输入框让键盘弹出 → 点聊天区(消息之间、列表下方空白都算)。
  3. 不管收没收,都导出日志给我。日志里会出现下面几类行,判读方式:
    • panel collapse guard installed on native listener … —— 最关键的那条钩子装上了;
    • touch-listener hosts (…) —— 本页带触摸监听器的视图清单(能看出原生监听器挂在谁身上);
    • panel collapse touch [源]: action=… ty=… ime=… kbFrame=… —— 我们的钩子确实被叫到了,并给出当时的展开态;
    • panel collapse fired: … —— 判定成立、已经执行了收起动作。
  4. 如果这三类一行都没有,说明那一下的触摸根本没走这些路径 —— 那我会改用「拿你的日志直接比对微信原生监听器流」的方式定位。

装机注意

  • 没动任何 DEX 锚点,不会弹「DEX 缓存更新」,直接覆盖安装。
  • 设置里「恢复底栏模糊」已在 3.77 删除(属预期)。