Android13+下WebView内输入框获焦时键盘反复闪烁问题排查
我有一个渲染<WebView>的组件,代码如下:
... render(){ <View style={[styles.container, style]}> <WebView url={url} /> </View> ...
加载的页面内包含text和password类型的<input>表单。在Android 13+设备上,有时(同一设备也并非必现)当<input>获焦时,键盘会无操作自动反复开合。
查看adb logcat | grep 'focus'的输出,发现以下内容无限循环打印(即使应用正常运行时也是如此):
03-08 17:44:50.111 914 914 D SurfaceFlinger: [input] inputWindowCommands.focusRequests size is 1 03-08 17:44:50.201 1217 3504 V WindowManager: Changing focus from null to Window{1339cc7 u0 com.myapp.testapp/com.myapp.MainActivity} displayId=0 Callers=com.android.server.wm.RootWindowContainer.updateFocusedWindowLocked:595 com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6803 com.android.server.wm.ActivityTaskManagerService.setResumedActivityUncheckLocked:5755 com.android.server.wm.TaskFragment.onActivityStateChanged:807 03-08 17:44:50.228 914 914 D SurfaceFlinger: [input] inputWindowCommands.focusRequests size is 1 03-08 17:44:50.292 1217 3460 V WindowManager: Changing focus from Window{1339cc7 u0 com.myapp.testapp/com.myapp.MainActivity} to null displayId=0 Callers=com.android.server.wm.RootWindowContainer.updateFocusedWindowLocked:595 com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6803 com.android.server.wm.ActivityTaskManagerService.setResumedActivityUncheckLocked:5755 com.android.server.wm.TaskFragment.onActivityStateChanged:807 03-08 17:44:50.303 1217 3504 E ClipboardService: Denying clipboard access to com.myapp.testapp, application is not in focus nor is it a system service for user 0 03-08 17:44:50.311 914 914 D SurfaceFlinger: [input] inputWindowCommands.focusRequests size is 1
请问这种焦点切换循环的原因可能是什么?
可能的原因分析
WebView与系统窗口焦点冲突:Android 13+对窗口焦点管理的校验更严格,当WebView内的
<input>请求焦点时,系统可能误判窗口焦点状态,触发应用窗口在"获取焦点-失去焦点"之间反复切换,导致键盘随焦点变化开合循环。WebView版本兼容性bug:部分系统WebView或第三方WebView版本在Android 13+上存在焦点处理逻辑缺陷。输入框获焦时,WebView内部的焦点请求与系统窗口管理器的焦点更新逻辑产生竞态,引发焦点来回跳动。
剪贴板访问触发焦点异常:日志中出现
ClipboardService: Denying clipboard access错误,说明应用尝试访问剪贴板时因失去焦点被拒绝。如果页面输入框有自动读取剪贴板的逻辑(比如密码自动填充),会触发系统焦点检查,进而导致焦点状态反复变化形成循环。页面JS焦点逻辑干扰:加载的网页若存在自定义焦点管理代码(比如自动切换焦点、焦点事件监听后强制转移焦点),在Android 13+的焦点机制下,可能与WebView原生焦点处理逻辑冲突,引发无限循环。
系统层面偶发异常:同一设备非必现的特性表明,可能是系统资源紧张时,窗口管理器处理焦点请求出现延迟或错误,导致焦点状态反复更新。
内容的提问来源于stack exchange,提问作者gyosko

