多亲 1s+ 键盘维修篇三(维修后按键连击)
上次拆机导致按键失灵,焊接后按键失灵问题解决了(参考:《多亲 1s+ 键盘维修篇二(拆机后按键失灵)》),但是新的问题出现了,按键连击:按下 0 键后,会同时触发 菜单键和拨号键。
由于焊接手艺不精,不想再拆开键盘,所以希望通过软件的方式解决这个问题:通过安装 xposed 框架,使用 xposed 模块来拦截多触发的按键。
获取 root 权限
参考资料
刷入补丁
将手机连接到电脑,使用 adb 重启到 fastboot 模式:
bash
adb reboot bootloader
手机重启后按 8 键进入,从 SD 卡刷入 zip。
刷完后重启。
安装 Magisk 管理 root 权限
直接使用 adb 安装 Magisk Manager:
bash
adb install magisk.apk
安装 xposed 框架
当前机型是基于安卓 4.4 版本,根据安装说明需要安装老版本的 xposed 框架,下载 de.robv.android.xposed.installer_v33_36570c.apk 安装。
安装 Xposed Installer 后,需要激活框架。
- 打开应用,点击框架。
- 点击安装方式,默认“经典(直接写入/system)”即可,这里需要勾选“禁用资源钩子”,不然会导致框架激活失败。
- 返回上一页,点击安装/更新,等待安装完成,重启手机。
开发 xposed 模块
根据网上找的几个教程,开始写一个 demo 模块,将模块安装到设备。
在 xposed 应用内激活模块,由于当前机型没有触摸功能,想要激活模块还需要打开模拟鼠标,点击勾选才能激活。
通过日志查看,可以监听到按键点击。
当按下 0 键的时候,会在短时间内顺序触发 82 5 19 7 这几个键值。对应的是:菜单键、拨号键、方向上键、0 键。
dispatchKeyEvent KeyCode = 82 EventTime = 441295 DownTime = 441295 Now = 1727369184315
dispatchKeyEvent KeyCode = 5 EventTime = 441296 DownTime = 441296 Now = 1727369184320
dispatchKeyEvent KeyCode = 19 EventTime = 441296 DownTime = 441296 Now = 1727369184325
dispatchKeyEvent KeyCode = 7 EventTime = 441300 DownTime = 441300 Now = 1727369184330
dispatchKeyEvent KeyCode = 82 EventTime = 441428 DownTime = 441296 Now = 1727369184360
dispatchKeyEvent KeyCode = 5 EventTime = 441555 DownTime = 441296 Now = 1727369184416
dispatchKeyEvent KeyCode = 19 EventTime = 441555 DownTime = 441296 Now = 1727369184417
dispatchKeyEvent KeyCode = 7 EventTime = 441555 DownTime = 441300 Now = 1727369184417
dispatchKeyEvent KeyCode = 5 EventTime = 98576 DownTime = 98576 Now = 1727445557281
dispatchKeyEvent KeyCode = 19 EventTime = 98576 DownTime = 98576 Now = 1727445557285
dispatchKeyEvent KeyCode = 7 EventTime = 98580 DownTime = 98580 Now = 1727445557292
dispatchKeyEvent KeyCode = 7 EventTime = 99601 DownTime = 98580 Now = 1727445557330
dispatchKeyEvent KeyCode = 7 EventTime = 99652 DownTime = 98580 Now = 1727445557346
dispatchKeyEvent KeyCode = 5 EventTime = 99656 DownTime = 98576 Now = 1727445557349
dispatchKeyEvent KeyCode = 19 EventTime = 99656 DownTime = 98576 Now = 1727445557351
dispatchKeyEvent KeyCode = 7 EventTime = 99656 DownTime = 98580 Now = 1727445557352
打印的堆栈信息如下:
dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:579)
com.zhetengbiji.keyhook.KeyHook$hook$1.afterHookedMethod(KeyHook.kt:43)
de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:645)
android.view.View.dispatchKeyEvent(Native Method)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2133)
com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1590)
android.app.Activity.dispatchKeyEvent(Activity.java:2436)
com.android.dialer.DialtactsActivity.dispatchKeyEvent(DialtactsActivity.java:540)
com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2054)
android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3922)
android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3896)
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3429)
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3479)
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3448)
android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3555)
android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3456)
android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3612)
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3429)
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3479)
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3448)
android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3456)
android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3429)
android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3479)
android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3448)
android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3588)
android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3772)
android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2064)
android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1758)
android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1749)
android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2041)
android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
android.os.MessageQueue.nativePollOnce(Native Method)
android.os.MessageQueue.next(MessageQueue.java:138)
android.os.Looper.loop(Looper.java:123)
android.app.ActivityThread.main(ActivityThread.java:5375)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:515)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:989)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132)
dalvik.system.NativeStart.main(Native Method)
先尝试在 com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent 方法 hook
kotlin