Android 面试题整理,来自真实面经
「Android 面试题整理,来自真实面经」
为什么我又开始整理面试题了
去年帮团队面了大概三十多个 Android 开发,从 P5 到 P7 都有,发现一个挺尴尬的现象:很多人简历上写着"精通 Kotlin/Compose/性能优化",真坐下来聊半小时,能讲清楚 Activity 启动流程的不到一半。不是候选人能力不行,是现在的面试准备太依赖八股文背诵了,面经满天飞,但质量参差不齐,有些答案本身就是错的,或者停留在 Android 5.0 时代的认知。
我自己也经历过这个阶段。2019 年跳槽时,在牛客网和 GitHub 上扒了一堆面经,结果面试时发现很多题目已经过时——比如还在问 Handler 的内存泄漏怎么解决,但实际工程里早就用 Kotlin Flow 或者 RxJava 了;再比如问 Service 的两种启动方式,而新项目根本不用 Service。那次经历让我意识到,面试题整理必须基于"真实面经",而且是近期的、来自一线大厂的、经过验证的。
这篇文章分享我过去一年收集和验证过的面试题资源,包括我花钱买过会员的、在 GitHub 上 star 过的、以及自己团队内部沉淀的。每样东西我都会说清楚值不值得投入时间,以及哪里容易踩坑。
GitHub 上的开源面经仓库:质量两极分化
GitHub 搜 "Android 面试" 能出来几千个仓库,但大部分是个人的零散笔记,更新停留在 2021 年。有两个仓库我长期关注,质量相对稳定。
第一个是 「AndroidInterview-Q-A」,地址在 https://github.com/stormzhang/AndroidInterview-Q-A,stormzhang 维护的,早期 Android 开发者应该都熟悉这个人。这个仓库的特点是题目覆盖面广,从 Java 基础到 Android 框架再到算法都有,而且每个题目有简要答案。我 2020 年准备面试时用过,当时感觉够用。但问题是更新频率太低,最近几次 commit 还是 2022 年的,Compose、Kotlin Coroutine、新版的 Gradle 配置这些内容基本没涉及。如果你面的是传统 Android 团队,维护老项目,这个仓库还能用;面字节、快手这种推进 Kotlin 和 Compose 比较激进的公司,很多题目对不上。
第二个是 「android-interview-questions」,https://github.com/MindorksOpenSource/android-interview-questions,Mindorks 出品,印度的一个技术社区。这个仓库的英文版更新比中文版勤快,题目组织方式是按知识点分类,比如"Concurrency"下面会细分 Thread、ExecutorService、Coroutine 的区别。我个人觉得它的 Kotlin 部分写得比国内大部分面经好,尤其是 suspend function 和 CPS 转换的解释,比很多中文博客准确。局限也很明显:印度市场的 Android 生态和国内差异大,比如他们 Firebase 用得很多,国内大厂自研的推送、埋点、APM 体系完全没覆盖;而且有些答案偏理论,缺少国内面试爱问的"你在项目中怎么解决的"这种延伸。
我去年 fork 了 Mindorks 的仓库,自己维护了一个中文版的分支,主要补充国内场景。但说实话,维护成本很高,三个月后就弃坑了。开源面经的共同问题是:维护者不是职业做面试培训的,有本职工作,更新看心情。如果你想依赖 GitHub 仓库,建议选那种有明确"最近更新日期"标识的,超过半年没动的,直接跳过。
付费知识星球和专栏:我买过三个,只推荐一个
先说结论:「扔物线」的 Android 面试知识星球,我连续买了两年,每年 299 元,是目前我觉得性价比最高的付费资源。
扔物线本人是快手的前 Android 专家,他的星球不是简单罗列题目,而是按"面试场景"组织内容。比如有一期专门讲"怎么讲清楚一个性能优化项目",从怎么选 case、怎么量化数据、怎么应对面试官的追问,整个话术都拆解了。我印象最深的是他讲内存优化的一段:不要上来就说"我用 MAT 分析了 hprof",而要讲"我们发现线上 OOM 率在某个版本涨了 0.5 个点,然后怎么定位到是某个第三方 SDK 的泄漏"。这种叙事结构,我在实际面试候选人时确实会更容易给高分。
但这个星球也有坑。第一是内容更新频率不稳定,2023 年上半年几乎每周都有新内容,下半年变成月更,今年更是偶尔才冒泡。第二是社区互动质量下滑,早期扔物线本人会回复提问,现在基本是助理在运营,有些技术问题答不到点上。299 元一年,如果按更新频率算,现在的性价比不如前两年。我今年的会员到期后,在犹豫要不要续费。
第二个买过的是 「极客时间」的《Android 开发高手课》,张绍文写的,专栏价格 129 元。这个不是纯面试题,是系统性的技术专栏,但我把它当面试准备用——因为面试本质上是考察知识体系的深度。张绍文在腾讯做性能优化多年,专栏里关于卡顿分析、内存优化、包体积治理的章节,技术深度足够应付阿里 P7、字节 2-2 级别的技术面试。我 2021 年买的时候,配合专栏里的源码分析,重新读了一遍 Choreographer 和 ViewRootImpl 的代码,面试时确实能讲出别人没提到的细节。
坑在于这个专栏的时效性。2019 年上线的课程,虽然中间有过更新,但 Compose、新版的 Gradle、Kotlin 2.0 这些完全没覆盖。而且张绍文现在转做管理,专栏后续基本不会再有大更新。129 元买个历史知识库,值不值看你自己判断。我现在推荐给别人时会说:如果你面的是偏底层的岗位,比如性能优化专项、架构组,这个专栏值得看;面业务开发,时间紧的话优先看更新的资源。
第三个是 某小报的面试题合集,名字就不提了,花了 99 元买的 PDF。完全是坑,题目从各个免费面经抄的,答案错漏百出,有一道讲 Binder 机制的题目,把 ServiceManager 和 ActivityManagerService 的层级关系都写反了。这种资源在知识付费平台很多,包装成"大厂内部资料",实际就是信息搬运。识别方法很简单:看有没有具体的版本号、有没有引用 AOSP 源码的具体行数、有没有提到某个 API 在哪个 Android 版本废弃的。如果全是泛泛而谈,大概率是拼凑的。
牛客网和力扣讨论区:被低估的实时面经
牛客网的 「面经」板块,https://www.nowcoder.com/discuss,是我现在获取最新面试题的主要渠道。优势是"实时"——今天有人面完字节,明天帖子就发出来了。我去年整理了一份 2023 年各厂 Android 岗的高频题清单,数据来源就是牛客网的面经帖,手动筛选了"有后续反馈"的帖子,排除掉那种只发题目没结果的钓鱼帖。
具体怎么用:搜"Android 字节 2024"或者"Android 美团 面经",按时间排序,看最近三个月的。重点不是题目本身,而是看"面试流程"和"面试官追问方向"。比如今年很明显的一个趋势:美团和快手喜欢问 Compose 的重组性能,会追问"LazyColumn 的 key 参数在什么场景必须加";阿里系(淘天、闲鱼)还在问传统的自定义 View 和事件分发,但会结合 Flutter 混编的场景问;字节则很杂,部门差异大,抖音团队和基础架构团队完全是两套题库。
牛客网的局限是信息噪声大。很多帖子是"求 offer 许愿"的,内容水分高;还有些是培训机构发的假面经,结尾引导你加微信领资料。我筛选时有个土办法:看发帖人的历史记录,如果只有一篇面经,没有其他技术讨论,大概率是营销号;真正面试过的人,通常会在讨论区回复别人的问题,或者之前发过笔试题求助。
力扣的讨论区相对干净,但 Android 专项内容少。我主要用它看「系统设计」类题目的讨论,比如"设计一个图片加载框架",力扣上虽然没有标准答案,但能看到不同思路的碰撞。有个帖子对比 Glide 和 Coil 的架构差异,楼主画了两张类图,评论区有人指出 Coil 的 DiskCache 实际上用的是 OkHttp 的 Cache 实现,这个细节我自己之前也没注意到。这种讨论的质量,比面经里的标准答案有价值得多。
AOSP 源码和官方文档:最被忽视的准备材料
很多人准备面试时排斥读源码,觉得太慢。但我的观察是:能讲清楚源码细节的候选人,在现在的面试市场里非常稀缺,尤其是 P6 以上级别。
不是让你去通读 AOSP。我推荐两个具体的切入点,都是面试高频且源码相对独立的模块。
第一个是 Activity 的启动流程。不要背网上的流程图,直接打开 frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java,从 startActivity 方法跟进去。重点关注 Android 10(API 29)之后引入的 ActivityTaskManager 和之前 ActivityManagerService 的区别,这是现在很多面试官爱问的"你知道 Android 10 之后启动流程有什么变化吗"的标准答案。源码阅读工具我用的 Sourcegraph,https://sourcegraph.com/search,可以在线搜 AOSP 代码,比本地 repo 方便,免费版够用。它的代码导航比 GitHub 的网页版流畅,跨文件跳转很准。
第二个是 Handler 和 Looper 的实现。这个老掉牙的题目,但今年面试时我换了个问法:"MessageQueue 的 next() 方法里,native 层的 epoll_wait 是怎么和 Java 层的唤醒机制配合的?"能答上来的很少。其实答案就在 android/os/MessageQueue.java 里,nativePollOnce 和 nativeWake 的对应关系。读到这里,顺便看看 Android 6.0 之后引入的 IdleHandler 机制,很多性能优化的方案(比如启动后的异步初始化)都依赖这个。
官方文档方面,Android Developers 的「Performance」专题,https://developer.android.com/topic/performance,是准备性能优化相关面试的最佳材料。不是因为它讲得多深,而是面试官的问题设计往往基于官方推荐的最佳实践。比如文档里讲 App Startup 库的使用,面试时就会问"ContentProvider 的初始化顺序怎么控制";文档讲 Baseline Profiles,面试就问"为什么 Cloud Profiles 不够,还要本地预编译"。我习惯把文档里的"Do"和"Don't"列表整理成自己的话术,面试时直接引用官方建议,显得有体系。
读源码和文档的坑在于时间成本。我估算过,完整跟一遍 Activity 启动的关键路径,大概需要 8-10 小时,而且第一次读大概率读不懂,需要配合一些博客辅助。我推荐 Gityuan 的博客,http://gityuan.com,袁辉辉写的,AOSP 源码分析非常系统,尤其是 AMS、WMS、PMS 的系列文章。他的分析基于 Android 6.0 到 9.0 的版本,虽然版本偏老,但核心逻辑变化不大,适合入门。博客是免费的,但更新也停了,现在的 Android 12+ 新特性没有覆盖。
我自己整理的面试题:怎么验证一道题的价值
最后分享我自己维护的面试题列表,以及我的筛选标准。
我的列表现在大概有 120 道题,分布在 Kotlin 语言、Android 框架、性能优化、架构设计四个大类。每道题我会标注"来源"和"验证状态":来源是某次真实面试的牛客网帖、某个同事的面试反馈、或者我自己当面试官时的常用题;验证状态分"未验证"(只是看到有人被问到)、"部分验证"(和一两个候选人聊过类似方向)、"已验证"(我自己问过或者确认过多人遇到)。
验证一道题值不值得花时间准备,我有三个标准。
第一,看这道题能不能延伸出三层追问。比如"讲讲 View 的绘制流程"是第一层;"MeasureSpec 是怎么计算的"是第二层;"自定义 ViewGroup 时怎么支持 Margin"是第三层。能延伸到第三层的题目,才是好题目,因为它考察的是知识体系而不是孤立知识点。很多面经里的题目只有一层,比如"什么是 ANR",背个定义就完了,这种题现在越来越少见了。
第二,看答案有没有"版本敏感性"。Android 生态变化快,好的面试题应该能区分"你知道旧版本"和"你知道最新版本"。比如问 SharedPreferences,旧答案是"commit 和 apply 的区别",但现在应该问"为什么 Google 推荐用 DataStore 替代,以及迁移时的数据一致性怎么保证"。如果一道题的答案三年没变,那它大概率已经过时了。
第三,看能不能结合具体项目。面试不是科举,最终要的是"你能解决问题"。我自己准备时,每道题会强制想一个项目里的实际 case。比如准备"内存优化"时,我会复现我们项目里曾经遇到的一个 Bitmap 复用问题,把 BitmapFactory.Options 的 inBitmap 参数怎么配置、怎么计算 Bitmap 的内存占用、怎么在 RecyclerView 的复用池里管理,整个链路讲清楚。这种准备方式费时,但面试时完全不怕追问。
我整理列表的工具是 Notion,个人免费版够用,主要是数据库视图方便按标签筛选。之前试过用飞书文档,协作功能更好,但面试题这种个人知识库,Notion 的离线访问更稳定。不推荐使用那种专门的"面试题 APP",体验差,而且内容来源不明。
几个具体的题目示例和常见错误答案
为了说明"真实面经"和"网上随便找的题"的区别,我挑三道今年高频的,讲讲常见错误。
题目一:Kotlin 的 inline 和 noinline 有什么区别?
错误答案:inline 减少函数调用开销,noinline 是不内联的参数。这个答案没错,但太浅。实际面试中,字节和快手都会追问:"crossinline 和 noinline 在字节码层面有什么区别?"正确答案是 noinline 的参数在字节码中仍然是 Function 对象,会生成额外的类;crossinline 虽然不允许非局部返回,但参数仍然会被内联展开,不会生成 Function 对象。这个细节在 Kotlin 官方文档的"Inline functions"章节有讲,但很多人只背了概念。
题目二:Compose 的重组(Recomposition)是什么触发条件?
错误答案:State 变化就重组。实际上 Compose 的重组是"乐观"的,State 变化后,Composer 会先标记脏区域,然后按优先级调度,不是立即执行的。而且 @Composable 函数的调用本身不保证会执行 UI 更新,如果参数没有变化且没有内部 State,可能会被跳过。这个理解错误会导致很多候选人讲不清楚为什么 Compose 性能比传统 View 系统好——不是因为"少了 findViewById",而是因为细粒度的依赖追踪和智能跳过。
题目三:Gradle 的 Configuration Cache 和 Build Cache 有什么区别?
这是今年新出现的题目,因为 Android Gradle Plugin 8.0 之后 Configuration Cache 默认启用。很多人把两个 Cache 混为一谈。Build Cache 缓存的是 task 的输出,比如编译后的 .class 文件;Configuration Cache 缓存的是 configuration phase 的结果,也就是 build.gradle 解析后的项目结构。Configuration Cache 解决的是"Gradle 配置慢"的问题,尤其是多模块项目,每次 sync 都要重新解析所有 build.gradle,这个缓存能省几秒到几十秒。面试时如果能提到 AGP 8.0 的默认行为变化,说明你真的在关注工具链更新。
时间分配建议:别在过时内容上浪费生命
如果只有一个周末准备面试,我的建议时间分配是:40% 花在最近三个月的真实面经(牛客网筛选后的),30% 花在你简历上写的项目的深度复盘(每个项目准备三个技术难点和解决方案),20% 花在Kotlin 和 Android 新特性(Compose、Coroutines、新 Gradle 特性),10% 花在算法(LeetCode 热题 100 道够用了,国内 Android 岗算法要求比后端低)。
不建议再花时间准备的内容:Service 和 BroadcastReceiver 的详细生命周期(除非面的是系统应用开发)、AsyncTask 的源码(已经废弃多年)、Volley 和 Picasso 的对比(新项目不会用)、Android 5.0 之前的权限模型。
算法方面,力扣的 「剑指 Offer」 系列仍然是最贴近国内面试的,但注意是"剑指 Offer II",也就是第二版,题目和第一版有差异。我买过纸质书,其实不如直接刷力扣网页版,因为讨论区的优质解法更新更快。会员我开过一年,主要是看一些锁住的题目和官方题解,值不值因人而异,我觉得 200 多一年不算贵,但也不是必须。
面试题整理的最终目的
说到底,面试题整理不是为了"押题",而是为了建立自己的技术叙事。面试官问一百道题,核心想确认的是:这个人遇到没见过的技术问题,能不能有条理地分析、能不能调动已有的知识储备、能不能承认不知道的地方。
我整理面经时有个习惯:每道题准备两个版本的答案,一个"完整版"(3-5 分钟能讲完的),一个"精简版"(1 分钟以内的核心要点)。实际面试中,面试官经常打断追问,很少有机会完整讲完。能根据对方反应灵活调整深度,比背诵标准答案重要得多。
这篇文章提到的资源,除了付费星球和专栏需要你自己判断,其他都是免费或者低成本的。技术面试的准备没有捷径,但选对材料可以少走很多弯路。如果你也在整理 Android 面试题,欢迎去 GitHub 上搜我前面提到的仓库,或者直接在牛客网按时间筛选最近的面经——比任何"内部资料"都靠谱。