Android开发工程师面试题及答题要点
安卓开发的面试通常2-4轮,一面二面重技术基础和项目,三面偏系统设计和行为面。最容易挂的不是答不出八股,而是项目细节被追问三层就露馅,或者性能优化只背概念说不出实际做过什么。
专业基础
讲讲Handler机制,为什么子线程不能直接更新UI?
考察点:考察对消息机制的理解深度,以及能否把原理和实际场景串起来。
- 按流程讲:Handler发送Message到MessageQueue,Looper循环取出分发给目标Handler处理。
- 点出关键类关系:一个线程只有一个Looper,MessageQueue挂在Looper上,Handler绑定哪个Looper就在哪个线程回调。
- 子线程更新UI报错的原因:ViewRootImpl的checkThread机制,主线程的Handler在onCreate时未走完才偶尔『侥幸』通过。
- 可以补一句实战关联:比如用Handler做倒计时、防抖,体现你不只是背概念。
别踩:只背四大组件名词,说不出checkThread在哪一层拦截,追问两句就断片。
Activity的生命周期,onPause和onStop有什么区别?什么场景只走onPause不走onStop?
考察点:考察基础是否扎实,以及是否理解生命周期背后的资源分配逻辑。
- onPause时Activity仍部分可见(如弹了半透明Dialog样式的界面),onStop时完全不可见。
- 只走onPause的典型场景:新界面是透明或对话框样式,旧界面没被完全遮挡。
- 延伸讲资源策略:onPause做轻量收尾,onStop释放较重资源,onDestroy做最终清理。
- 能带出异常情况下的onSaveInstanceState更好,说明考虑过进程被杀重建。
别踩:把生命周期当固定顺序背诵,被问『为什么这么设计』就答不上。
Kotlin和Java比,你在项目里实际用了哪些特性,解决了什么问题?
考察点:考察是否真的写过Kotlin,还是只会语法皮毛。
- 挑2-3个你真用过的讲:如空安全减少了NPE崩溃、扩展函数让工具类更干净、协程替代回调。
- 每个特性配一个项目里的真实例子,说明改写前后的差别。
- 主动提协程的结构化并发和取消机制,这是现在安卓开发的高频考点。
- 如果项目还是纯Java,坦诚说明,但要讲清楚你在新代码中如何逐步引入Kotlin。
别踩:罗列十个特性却没有一个落地例子,显得只看过文档。
讲一下内存泄漏的常见场景和排查方式。
考察点:考察性能问题意识,以及有没有真用过排查工具。
- 先讲原理:对象生命周期长的持有短生命周期对象的引用,如静态Context、内部类Handler、未取消的监听。
- 举2-3个安卓典型场景:非静态内部类Handler持有Activity、单例注册回调未反注册。
- 排查路径要具体:用内存分析工具看支配树,找被谁引用着释放不掉。
- 修复方式对应讲:静态内部类+弱引用、onDestroy里反注册、Lifecycle感知组件。
别踩:只说『用工具检测』,说不出具体看什么指标、怎么定位到引用链。
项目经历深挖
挑一个你做过的最有挑战的模块,讲讲当时的技术方案和你的取舍。
考察点:考察真实参与度、技术决策能力,以及能否讲清『为什么这么做』。
- 用背景-问题-方案-结果四段式,控制在两分钟内讲完。
- 重点讲取舍:为什么选A不选B,比如包体积、维护成本、团队熟悉度。
- 量化结果:崩溃率下降、页面加载耗时从多少降到多少,哪怕是估算值也要有。
- 明确你个人负责的部分,别把团队成果说成全是自己的。
别踩:只描述功能做了什么,全程没有一句技术决策,面试官会判定你只是执行者。
你说的这个方案,如果流量翻十倍/数据量翻十倍,哪里会先出问题?
考察点:考察技术方案的边界意识和扩展性思维,看你是照抄方案还是真理解。
- 先别慌,承认当前方案的设计边界,说明当时为什么够用。
- 指出最可能先崩的点:如列表一次性加载、本地缓存无上限、主线程做重计算。
- 给出演进思路:分页、缓存淘汰策略、任务下沉到子线程或分批处理。
- 结尾补一句『如果预期有增长,当时会预留什么接口』,体现前瞻性。
别踩:硬撑说『没问题,都能扛』,反而暴露没想过容量问题。
这个功能当时为什么崩溃率偏高,你们是怎么定位和解决的?
考察点:考察线上问题排查的真实经验,是否参与过完整的发现-定位-修复闭环。
- 讲清发现渠道:监控平台报警、用户反馈还是灰度数据。
- 定位过程要具体:符号还原、根据堆栈找到出问题的代码路径、复现条件。
- 修复和验证:改了什么、怎么确认修复有效、有没有加防护避免同类问题。
- 能带出后续的规范改进(如统一空判断、加防御性代码)是加分项。
别踩:只说『改了代码就好了』,讲不出定位过程,像没亲手处理过。
项目里你提到用了XX框架,它内部是怎么实现的?
考察点:考察是否理解所用框架的原理,还是只会调API。
- 先讲核心机制一两句,比如它解决什么问题、用什么思路解决。
- 讲你读过源码或通过调试验证过的部分,别把博客结论当自己的理解。
- 结合项目里的实际问题讲:当时遇到什么坑,看了内部实现才明白。
- 不确定的部分直接说『这块我还没深入』,比编造安全得多。
别踩:把框架的营销话术当原理讲,追问一句『那它和另一个框架的区别』就露馅。
系统设计与性能
让你设计一个图片加载模块,你会怎么设计?
考察点:考察抽象能力:能否把三方库的能力拆解成缓存、线程、解码等基础问题。
- 按请求流程讲:请求进来先查内存缓存,再查磁盘缓存,都没有才走网络。
- 分块设计:三级缓存、线程池调度、解码尺寸压缩、生命周期取消请求。
- 主动提边界问题:列表快速滑动时请求取消、同一URL并发去重。
- 可以参考成熟开源库的思路,但要说『借鉴』而不是装作原创。
别踩:只说『用现成的库』,面试官明确要你设计时这样答等于放弃。
App启动慢,你会怎么排查和优化?
考察点:考察性能优化的方法论,是否有一套从测量到修复的完整流程。
- 第一步永远是测量:用工具看启动耗时分布,别上来就猜。
- 按阶段拆:Application的onCreate、首个Activity的渲染、首屏数据加载。
- 常见优化手段对应讲:延迟初始化、异步初始化、精简首屏布局、启动时避免IO。
- 强调改完要回归测量,用数据验证效果,而不是『感觉快了』。
别踩:罗列一堆优化名词,却说不出自己项目里实际改过哪一处、效果多少。
RecyclerView列表卡顿,你的排查思路是什么?
考察点:考察对主线程渲染机制的理解和实际调优经验。
- 先确认卡顿类型:是掉帧、还是滑动中频繁GC、还是数据加载阻塞。
- 布局层面:层级过深、过度测量;绑定层面:onBindViewHolder里做重活。
- 图片层面:未按目标尺寸解码导致内存抖动和GC频繁。
- 讲一个你实际优化过的案例,改了什么、帧率或滑动流畅度变化多少。
别踩:只答『用ViewHolder优化』,这是几年前的标准答案,显得经验陈旧。
行为面试
说一次你和后端/产品在接口设计上产生分歧的经历,最后怎么解决的?
考察点:考察协作沟通能力,以及分歧中你是讲道理还是讲情绪。
- 选一个真实但有结论的小分歧,别编戏剧化冲突。
- 讲清分歧点:比如字段设计、错误码规范、接口粒度。
- 重点讲你怎么推动共识:拿数据、拿用户影响、找技术负责人对齐,而不是硬顶。
- 结果要双赢收尾,并说一句你从中学到的协作方式。
别踩:把责任全推给对方,或全程回避冲突说『没什么分歧』,都显得不真实。
为什么从上家公司离开?
考察点:考察离职动机是否合理,以及入职后的稳定性风险。
- 一句话讲客观原因:业务调整、合同到期、寻求更匹配的技术方向。
- 不评价前公司和前领导,不带情绪。
- 把话题引向未来:这个岗位的什么技术和业务吸引你。
- 如果被裁或项目被砍,直接说,现在市场环境下这不丢人,遮掩反而可疑。
别踩:抱怨前公司或说『钱少事多』,哪怕是真的,也会被判定为风险候选人。
你平时怎么跟进安卓的新技术和新版本?
考察点:考察学习习惯和自驱力,安卓生态变化快,吃老本的人很快贬值。
- 说具体信息源:官方发布说明、技术社区、团队内部分享,别只说『上网看』。
- 举一个最近真学的东西:如某个新API、Compose或Kotlin新特性,讲你怎么用的。
- 最好有输出:写过笔记、做过demo、在组内分享过。
- 坦诚说精力有限会挑重点学,比假装什么都追更可信。
别踩:说『工作太忙没时间学』,等于宣告自己技术会持续贬值。
情景应变与反问
线上突然出现大量用户反馈App闪退,你作为值班开发,前十分钟做什么?
考察点:考察应急处理的优先级判断:先止损还是先查因。
- 第一优先级是止损:看影响面和版本分布,评估是否需要热修或回滚发布。
- 同步拉监控数据:崩溃堆栈、机型和系统版本分布、开始时间点,定位是否与某次发布相关。
- 拉相关人员同步信息:测试、后端、运维,确认是不是接口或配置变更引发。
- 查因和修复放在止损之后,别一头扎进代码里而忘了评估影响面。
别踩:直接说『开始看代码找bug』,暴露没有线上事故处理的全局意识。
需求排期很紧,产品要求一周内上线一个功能,你评估做不完,怎么办?
考察点:考察向上沟通和风险暴露的主动性,而不是闷头硬扛或硬顶。
- 先给出量化评估:完整做需要多少人天,卡在哪个环节。
- 带着方案去谈:砍范围、降质量标准分期上线、还是加资源,给选项而不是只说做不了。
- 明确风险:如果强行压缩会牺牲什么(测试覆盖、兼容性),让决策方知情。
- 一旦对齐了方案,就执行,别反复抱怨排期。
别踩:两个极端都危险:默默接下然后延期,或直接拒绝不给方案。
你有什么想问我们的?
考察点:考察你对这个岗位的在意程度,以及你关注什么层面的问题。
- 准备2-3个真问题:团队的技术栈和业务方向、入职后前三个月的期望、团队如何做代码评审和技术分享。
- 问一个和岗位强相关的问题,如『团队目前在向Kotlin/Compose迁移吗』。
- 别问薪资福利加班,这些留给HR环节。
- 问题体现你的判断:问技术演进和协作方式,比问『公司有什么团建』加分得多。
别踩:说『没什么想问的』,等于告诉对方你不怎么想来。
面试准备清单
| 什么时候 | 要做什么 |
|---|---|
| 面试前 3 天 | 把简历上每个项目按『背景-问题-方案-结果』重新过一遍,每个技术点准备两层追问的答案,重点补上量化的结果数据。 |
| 面试前 3 天 | 过一遍高频基础题:Handler、生命周期、内存泄漏、启动优化、RecyclerView卡顿,每题用自己的话讲一遍,别背原文。 |
| 面试前 1 天 | 查目标公司的App,实际用一用,记下2-3个可以聊的体验细节或你发现的可优化点,面试时主动提。 |
| 面试前 1 天 | 准备行为面素材:一次技术分歧、一次线上事故、一次排期冲突,各写成一分钟版本,确保细节经得起追问。 |
| 面试当天 | 提前准备纸笔,系统设计题边讲边画流程图,比纯口述清晰得多;手机静音,环境安静。 |
| 面试当天 | 反问环节的2-3个问题写在纸上备着,聊到后面容易忘;答不上的技术题坦诚说没深入研究,别硬编。 |