帅次头像
Android 应用高级面试:Input 近1年高频追问 16 题封面图

Android 应用高级面试:Input 近1年高频追问 16 题

文章目录

基础层(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 序列+长按超时触发;onTouchEvent return 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 同帧协同。

在这里插入图片描述

相关推荐

Android 高级工程师面试参考答案:性能优化

Android 高级工程师面试参考答案:语言基础与并发

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/g984160547/article/details/163179375

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--