基础层(6 题)
#1 Android 输入系统整体架构? 🔥
参考回答
Native InputReader 读内核 /dev/input 设备节点→分类转 NotifyMotionArgs→InputDispatcher 队列→按 WMS 焦点与 Z-order 找目标窗口→通过 socket 发到 App ViewRootImpl→Java 层 dispatchInputEvent→View 树 dispatchTouchEvent。SystemServer 侧 WMS 与 InputManagerService 协作,App 侧最终到 View 分发。
面试官可能继续追问
-
Android 16 里 InputFlinger 和旧 Input 关系?
Android 16 强化 Input 管线与 SF 协同;核心仍是 Reader→Dispatcher→Window。 -
键盘和触摸同一路径吗?
同 InputReader 读设备;Dispatcher 分 Key/Motion 队列,目标窗口策略类似。
#2 InputReader 做什么? ⭐
参考回答
InputReader 在 system_server 进程(Input 线程)监听 evdev,映射设备到 InputDevice,解析 raw event 为标准化 Notify* 结构(坐标变换、校准、多指)。支持触摸屏、触摸板、 stylus。读线程与 Dispatcher 解耦,通过 InputListener 回调投递,避免阻塞分发。
面试官可能继续追问
-
Android 16 坐标转换谁做?
InputReader 结合 display transform、旋转、per-display 映射到 logical 坐标。 -
没触摸事件时也读吗?
阻塞/epoll 等待;无事件不占用 Dispatcher。
#3 InputDispatcher 做什么? 🔥
参考回答
InputDispatcher 维护待分发队列与连接(每个窗口 InputChannel 一对 socket)。按策略选 foreground window、处理 ANR 监测(约 5s 无响应则焦点窗口 Timeout)、支持 intercept(如屏幕边缘手势由 Policy 先消费)。找到目标后序列化 MotionEvent 写入 App 侧 InputEventReceiver。
面试官可能继续追问
-
Android 16 Input ANR 日志关键字?
Input dispatching timed out+ 焦点窗口 package/Activity。 -
oneway 输入丢事件吗?
正常不丢;队列积压或 App 不读 socket 会触发 ANR 或 coalesce(视类型)。
#4 View 树如何收到触摸? ⭐
参考回答
ViewRootImpl 注册 InputChannel→InputEventReceiver(主线程 Choreographer)回调→ViewRootImpl.dispatchInputEvent→ViewPostImeInputStage→DecorView dispatchTouchEvent→自上而下或 onInterceptTouchEvent 拦截→目标 View onTouchEvent。ACTION_DOWN 决定后续序列目标,直到 UP/CANCEL。
面试官可能继续追问
-
Android 里事件一定主线程吗?
InputReceiver 关联 Looper;处理须在主线程,与 UI 一致。 -
CANCEL 何时发生?
父 View 拦截、窗口失焦、被更高窗口盖住、系统手势抢占。
#5 dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 顺序? ⭐
参考回答
事件先到 Activity dispatchTouchEvent(若重写)→Window→DecorView。ViewGroup 先 dispatchTouchEvent→自身 onInterceptTouchEvent 是否拦截→不拦截则递归子 View;子不处理则父 onTouchEvent。一旦某 View 处理 DOWN,后续 MOVE/UP 直送该 View(除非拦截 CANCEL)。
面试官可能继续追问
-
Android 工程 Click 和 Touch 区别?
Click 由 Touch 序列+长按超时触发;onTouchEventreturn true 才收后续事件。 -
父 View 能抢子 View 事件吗?
onInterceptTouchEvent在 MOVE 时仍可拦截,发 CANCEL 给子 View。
#6 滑动冲突常见思路? 💡
参考回答
内外层滑动方向不一致时:外层 DOWN 时不拦截,MOVE 超阈值且方向匹配则 onInterceptTouchEvent true;或自定义 requestDisallowInterceptTouchEvent 让子 View 临时禁止父拦截。RecyclerView+ViewPager 经典组合用嵌套 scrolling 或官方 NestedScrolling 机制协调。
面试官可能继续追问
-
Android 16 CoordinatorLayout 怎么帮冲突?
Behavior 监听 nested scroll,统一协调 AppBar 与列表。 -
同向嵌套 ScrollView 问题?
只一个能滚;须拆层或改横向/纵向分工。
进阶层(5 题)
#7 焦点窗口如何决定触摸目标? 🔥
参考回答
WMS updateFocusedWindowLocked 设置 mFocusedApp/mCurrentFocus→InputDispatcher 查询 InputWindowHandle 列表(Z-order、TouchableRegion、可见性)→从顶向下 hit test。非焦点窗口默认不收触摸(除特殊 flag)。Dialog/Popup 获独立 Window 时成为新焦点。
面试官可能继续追问
-
Android 16 分屏两边都能摸吗?
各 Display/区域有 focused window;坐标落在哪块给哪边。 -
TYPE_APPLICATION_OVERLAY 触摸?
若有 focus 且 touchable 可收;否则穿透下层(视 flags)。
#8 MotionEvent 主要动作与指针? ⭐
参考回答
ACTION_DOWN/UP/MOVE/CANCEL;多点 POINTER_DOWN/UP;getX/getY 相对 View;getRawX/Y 屏幕绝对。getActionIndex 表当前变化指针。事件对象可复用(historical MOVE);处理勿长期持有引用。Android 16 仍支持 pressure、toolType(finger/stylus)。
面试官可能继续追问
-
Android 工程多点缩放怎么写?
ScaleGestureDetector或自算两指距离;注意 POINTER 事件。 -
MOVE 批处理 historical 干啥?
高精度轨迹;绘制平滑曲线可读 historical coords。
#9 InputChannel 与跨进程传递? ⭐
参考回答
WMS 添加窗口时创建 InputChannel(socket pair),一端 Dispatcher,一端 App ViewRootImpl。事件 Flatten 为序列化字节跨进程,无 Binder per-event。连接断则窗口不收输入。Batched 消费降低唤醒次数。
面试官可能继续追问
-
Android 16 为何用 socket 不用 Binder?
高频低延迟;避免 Binder 线程池压力。 -
窗口 remove 后 Channel 呢?
随 WindowState 销毁 unregister。
#10 ViewRootImpl 在输入链路的角色? 🔥
参考回答
连接 WMS 窗口与 View 树:注册 InputChannel、在 doProcessInputEvents 把 Native 事件转 Java MotionEvent、经 InputStage 链(Early/Native/ViewPostIme)过滤、调 View.dispatchPointerEvent。与 Choreographer 同 Looper,输入处理慢会阻塞下一帧。
面试官可能继续追问
-
Android 16 Systrace 输入看什么?
InputReader、InputDispatcher、deliverInputEvent、ViewPostImeInputStage。 -
disable 硬件加速影响输入吗?
不直接影响命中;影响绘制性能间接卡顿。
#11 系统手势与 InputPolicy? 💡
参考回答
InputReader/PhoneWindowManager 策略可拦截边缘 back、下拉 statusBar、三键导航区域。手势先被 Policy 或 SystemUI 消费,App 收 CANCEL 或不收 DOWN。Android 14+ predictive back 在系统层预览,不直接进 App 直到 commit。
面试官可能继续追问
-
Android 16 全面屏手势冲突?
底部上滑 home;App 可用setSystemGestureExclusionRects声明排除区(有限)。 -
沉浸式下 back 手势谁优先?
系统 edge back 优先于 App 边缘控件,除非 exclusion 合理。
核心层(5 题)
#12 触摸事件完整链路怎么口述? 🔥
参考回答
硬件 IRQ→内核 input 驱动→InputReader 读 evdev 转 NotifyMotion→InputDispatcher 入队→WMS 提供 focus 与 window 几何 hit test→InputChannel 写 App→ViewRootImpl InputEventReceiver→dispatchTouchEvent 遍历 View 树→消费或丢弃→未消费可能 fall through。全链路毫秒级,App 主线程慢则 ANR。
面试官可能继续追问
-
Android 面试画输入图?
横向:Reader→Dispatcher→WMS handles→ViewRoot→ViewGroup/View。 -
和 Binder 关系?
事件不走 Binder;窗口注册时 WMS 经 Binder 建 InputChannel。
#13 Input ANR 如何产生与排查? 🔥
参考回答
焦点窗口 App 主线程超过约 5s 未处理完当前 Input 事件(或未完成 finishInputEvent),InputDispatcher 报 Input dispatching timed out,附带 waiting 的 Motion/Key。常见原因:主线程同步 IO、死锁、重绘阻塞、Binder 同步等待。traces.txt 看 main 线程栈。
面试官可能继续追问
-
Android 16 和 Handler ANR 区别?
Input ANR 专指输入超时;Service/Broadcast 各有阈值;都可能 main 线程堵。 -
如何复现 Input ANR?
主线程Thread.sleep(6000)在onTouchEvent。
#14 事件拦截与自定义 ViewGroup? ⭐
参考回答
自定义 ViewGroup 重写 onInterceptTouchEvent 决定 DOWN/MOVE 是否拦截;onTouchEvent 处理未被子消费的事件。requestDisallowInterceptTouchEvent(true) 通知父级勿 intercept(父仍可强制)。正确返回 true/false 决定是否接收后续序列,错误导致点击无响应或滑不动。
面试官可能继续追问
-
Android 工程 ListView 里按钮点不了?
父 item 拦截或未正确requestDisallowInterceptTouchEvent。 -
return false 在 DOWN 后果?
不收后续 MOVE/UP,除非子 View 处理。
#15 Stylus/Palm rejection 基础? 💡
参考回答
InputReader 识别 toolType、pressure、button;设备可 palm rejection 忽略误触。Stylus .hover 产生 ACTION_HOVER_MOVE 不按下。Android 16 部分设备支持笔侧键;App 用 MotionEvent 属性区分 finger/stylus 做不同逻辑。
面试官可能继续追问
-
Android 16 手写笔低延迟?
设备层预测与独立采样率;App 仍主线程处理需轻量。 -
触摸板桌面模式?
InputReader 映射为 mouse/scroll;走不同 classification。
#16 Input 与 WMS、ATMS、View 如何衔接? 💡
参考回答
ATMS 决定哪个 Activity resumed→WMS 设 focus WindowState→InputDispatcher 只优先发给该窗口 InputChannel→ViewRoot 转 View 分发。窗口不可 touch(FLAG_NOT_TOUCHABLE)或 obscured 则跳过。Z-order 变(Popup)即时更新 handles。View 层 onTouchEvent false 不表示事件回 Dispatcher,通常丢弃。
面试官可能继续追问
-
Android 16 透明 Activity 触摸穿透?
窗口需FLAG_NOT_TOUCHABLE或 region 透明且不 focus;否则挡下层。 -
多个 Window 同 Activity?
Dialog Window 自有 Channel,焦点在 Dialog 时主 Window 不收触摸。
Android 17 面试增量(1 题)
#17 Input ANR 与 DeliQueue 如何区分排查? 🔥
参考回答
Input ANR:约 5s 内未消费 ACTION_DOWN(主线程卡在 dispatchMessage、同步 Binder、死锁);日志关键字 Input dispatching timed out。Handler ANR 同类根因。Android 17 lock-free MessageQueue 只减少入队争锁,不缩短单条消息处理时间。排查:traces 看 main 栈顶;Perfetto 对齐 deliverInputEvent 与 Choreographer#doFrame。
面试官可能继续追问
-
lock-free MQ 能避免 Input ANR 吗?
不能;重onReceive/同步 IO 仍会阻塞输入分发。 -
和 WMS 焦点关系?
InputDispatcher 只向 WMS 焦点窗口投递;焦点错则像「点不动」。
面试策略速查
| 面试等级 | 建议掌握 |
|---|---|
| 初级 | ★★★☆☆ |
| 中级 | ★★★★☆ |
| 高级 | ★★★★★ |
必背知识(🔥)
Input 架构、InputReader/Dispatcher、焦点 hit test、View 分发三方法、ViewRootImpl、完整链路、Input ANR
高频追问
「Reader 和 Dispatcher 区别」「事件怎么到 View」「DOWN 为何重要」「滑动冲突怎么办」「Input ANR 怎么查」
加分项(💡)
InputChannel、系统手势 Policy、Stylus、gesture exclusion
容易踩坑
以为触摸走 Binder;忽略 DOWN 定目标;onTouchEvent false 还想收 MOVE;混淆 raw 与 local 坐标;主线程耗时触发 Input ANR
完整链路一句通
Input 一条线:evdev→InputReader 标准化→InputDispatcher 排队→WMS 焦点与 Z-order hit test→InputChannel 送 ViewRootImpl→主线程 dispatchTouchEvent→ViewGroup intercept/子 View onTouch→消费或 CANCEL→主线程阻塞超 5s→Input ANR→与 WMS 焦点、ATMS resumed Activity、Choreographer 同帧协同。

相关推荐
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/g984160547/article/details/163179375




