关键字
adb logcat | grep -iE "HwInputMethodManagerService|SecInputMethodManagerService
|InputMethodManagerService|InputEvent|WindowManager|HwIME_Pro|WindowManager_visibility"
----输入法莫名弹出
一般情况下,输入法显示都是由于应用进程调起输入法导致输入法显示,而非输入法主动显示
- 通过焦点切换确定时间点【FocusChange】
- 查看输入法由谁调出【InputMethodManager】
## log关键词
inputMethodManager|FocusChange
adb logcat | grep -iE "inputMethodManager|FocusChange"
//备忘录调起输入法
09-24 15:44:42.712 1423 2073 I HwAftPolicyService: handleFocusChange focusPid=0, focusWindowTitle:null
09-24 15:44:42.891 23064 23064 I ViewRootImpl[NotePadActivity]: windowFocusChanged: hasFocus false inTouchMode true
09-24 15:44:42.918 1423 2073 I HwAftPolicyService: handleFocusChange focusPid=23064, focusWindowTitle:com.huawei.notepad/com.example.android.notepad.NoteEditor
09-24 15:44:43.045 23064 23064 W InputMethodManager: startInputReason = 1
09-24 15:44:44.961 23064 23064 I InputMethodManager: showSoftInput
## 通过focuschange 推动调起输入法的时间,接下来全局搜索23064进程号代表进程
## 确定是谁掉起的
----输入法无法弹出
-
无法弹出需要诊断是否是调用了showsoftInput之后仍无法弹出
- 未走入到showsoftInput中-------为对应载体的问题
分析思路
- 主要查看点击的时间点【inputEvent】与输入法调出的时间点【InputMethodManager】间隔
- 判断是否输入法问题
log关键字 InputMethodManager|inputEvent|FocusChange
案例:王者荣耀里面,点击文字输入框,点了好几次才弹出软键盘,不是很灵敏 分析过程: 1.用户无效点击时间为21.38.48---21.38.50.027 2.直到切换焦点activity到SGameActivty上后,才调用输入法的showSoftInput 结论: 王者荣耀中,输入法调起不是由点击事件发起,而是由应用程序主动调起 因此输入法多次点击无法弹出,实际上是由于应用调用输入法之前出现延迟,为应用端问题。
----输入法莫名隐藏
主要由几种方式
- 应用程序调用hidesoftinput,导致输入法面板隐藏------》对应应用
- 全面屏手势触发,导致输入法隐藏-----》手势导航
- 焦点切换导致输入法隐藏—》焦点切换到应用
- 输入法crash导致崩溃面板消失-----》
分析思路
-
输入法隐藏标志【InputMethod EXITING】
-
用户操作位置【InputEvent】
-
输入法框架调用【InputMethodManager】
-
手势导航调用【interceptKeyBeforeQueueing:key】
-
切换应用时间点找出之前的应用【FocusChange】
、
log关键字 InputMethod EXITING|InputEvent|InputMethodManager|interceptKeyBeforeQueueing:key|FocusChange
输入法知识点
----输入法框架(IMF)
-
IMF(包括三个主要的部分)
-
输入法服务:inputMethodManager(IMM)
-
概念:管理各部分的交互,是一个客户端的API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统化 服务,可通过COntext.getSystemService()来获取一个InputMethodManager的实例。
-
-
输入法应用:InputMethod(IME)
-
概念:实现允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法合适隐藏或者显示 它的UI。同一时间只能有一个IME运行。
-
-
客户端:Client Application
-
概念:通过输入法管理器控制焦点和IME的状态,一次只能有一个客户端使用IME.
-
-
----结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn2ojlT4-1664770844667)(模块知识点图片/输入法结构图.png)]
----IMMS的实现
InputMethodManagerService.java 是整个文档中,一切与输入法相关的总控制中心。它通过管理下面三个模块来实现系统的输入法框架
- WindowManagerService
- 负责显示输入法,接受用户事件
- InputMethodService
- 输入法内部逻辑,键盘布局,选词等,最终把选出的字符通过commitText提交出来。
- InputMethodManager
- 由UI控件(View,TextView,EditText等)调用,用来操作输入法。比如,打开关闭,切换输入法等。
正常案例
----备忘录调起输入法
09-24 15:06:50.765 23064 23064 I InputEvent: (372,828):(372,828)0-1-0 ##下发事件
09-24 15:06:50.772 23064 23064 I InputEvent: Moving, count=1
09-24 15:06:50.813 23064 23064 I InputEvent: (372,828):(372,828)1-1-0
09-24 15:06:50.816 1423 2685 V SecInputMethodManagerService: Client requesting input be hidden, pid=10047
09-24 15:06:50.816 1423 2685 I HwInputMethodManagerService: showinput: hide secure input mIsNeedWaitShow = false
09-24 15:06:50.816 1423 2685 V InputMethodManagerService: Client requesting input be shown, requestedUid = 10047
09-24 15:06:50.816 1423 2685 D InputMethodManagerService: showCurrentInputLocked: mCurToken=android.os.Binder@e747ced ## 不同输入法的token值不一样
09-24 15:06:50.824 1423 7376 D InputMethodManagerService: onInputShow ## IMMS向IME下发显示输入法
09-24 15:06:50.826 7383 7383 I HwIME_Pro: ImeService>>>onStartInputViewInternal
09-24 15:06:50.834 7383 7383 I HwIME_Pro: ImeService>>>setCandidatesViewShown:true
09-24 15:06:50.834 7383 7383 I HwIME_Pro: java.lang.Throwable
09-24 15:06:50.834 7383 7383 I HwIME_Pro: at com.baidu.input_huawei.ImeService.setCandidatesViewShown(Proguard:6716)
09-24 15:06:50.842 7383 7383 I HwIME_Pro: ImeService>>>onWindowShown ##显示输入法空白界面
09-24 15:06:50.843 1423 6022 I InputMethodManagerService: showImePostLayout token = android.os.BinderProxy@4562325
09-24 15:06:50.852 1423 7677 I WindowManager: updateFocusedWindowLocked: changed =false displayId=0 topFocusedDisplayId=-1 shouldSleep=false newFocus=Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor} calls=com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6594 com.android.server.wm.WindowManagerService.relayoutWindow:2948 com.android.server.wm.Session.relayout:215 android.view.IWindowSession$Stub.onTransact:918 com.android.server.wm.Session.onTransact:141 android.os.Binder.execTransactInternal:1161 android.os.Binder.execTransact:1130 <bottom of call stack>
09-24 15:06:50.869 1423 2081 I WindowManager: performshow Window{a09b7de u0 InputMethod} tok.waitingToShow=false isTransitionSet=false parentHidden=false vis=0 tok.isVisible=false hasSurface=true policyVis=true destroying=false animating=false
09-24 15:06:50.872 1423 2081 I WindowManager: performshow Window{a09b7de u0 InputMethod} tok.waitingToShow=false isTransitionSet=false parentHidden=false vis=0 tok.isVisible=false hasSurface=true policyVis=true destroying=false animating=false
09-24 15:06:50.882 1423 6022 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a018
09-24 15:06:50.883 1423 7677 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a018
09-24 15:06:50.887 1423 7677 I WindowManager: reportResized : win = Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor} drawState = HAS_DRAWN
09-24 15:06:50.888 1423 7677 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a018
09-24 15:06:50.889 1423 2075 I WindowManager: vis:a018,appearance:1000,isFullscreen:true,win:Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor}
09-24 15:06:50.896 1423 2079 I WindowManager: updateFocusedWindowLocked: changed =false displayId=0 topFocusedDisplayId=-1 shouldSleep=false newFocus=Window{b006cfa u0 com.huawei.notepad/com.example.android.notepad.NoteEditor} calls=com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6594 com.android.server.wm.DisplayContent.layoutAndAssignWindowLayersIfNeeded:4043 com.android.server.wm.WindowManagerService$H.handleMessage:6087 android.os.Handler.dispatchMessage:109 android.os.Looper.loop:228 android.os.HandlerThread.run:67 com.android.server.ServiceThread.run:44 <bottom of call stack>
09-24 15:06:50.899 1423 2079 I WindowManager: navColorWin was set to default navbar color so should add SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR a01
09-24 15:17:07.232 1423 7376 D InputMethodManagerService: onInputHide ## IMMS向IME下发显示输入法
09-24 15:17:07.234 7383 7383 I HuaweiIME: at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9526)
09-24 15:17:07.234 7383 7383 I HuaweiIME: at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9428)
09-24 15:17:07.234 7383 7383 I HuaweiIME: at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9381)
09-24 15:17:07.234 7383 7383 I HuaweiIME: at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:9775)
09-24 15:17:07.234 7383 7383 I HuaweiIME: at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:271)
09-24 15:17:07.234 7383 7383 I HwIME_Pro: ImeService>>>onWindowHidden ## IME显示输入法界面
09-24 15:17:07.239 1423 6671 V InputMethodManagerService: hideMySoftInput, pid=7383, token=android.os.Binder@e747ced
09-24 15:17:07.241 7383 7383 I UserTrack: HandleFKey:filename=InputEventHandler.java,line=1242,args=[8]
案例分析
----华为键盘与华为安全键盘切换时,会发现闪
华为安全输入法和普通输入法是两个服务,根据输入法的不同类型来启动不同的输入法。
【问题根因】:输入法google设置的是一个输入法服务,在输入法隐藏的时候两者回调走不同的路线。在输入法切换的时候输入框的焦点
切换focusln和focusOut是同时发出的,存在focusln先达到,而后focusOut后达到,前者发起显示的首后者才开始了隐藏,
导致了输入法显示又消失的现象。但是此时并没有改变任何的状态。所有不会影响冲走的的业务
【解决计划】:CCB挂起处理
**