今年春招我投了小红书的Android开发岗一路走到第三批笔试整个过程明显能感觉到现在的客户端岗位笔试早就不是“背背八股文、刷刷LeetCode”就能过的阶段了。小红书这批笔试题型不算偏但问得深、考得细好几个点都踩在Android开发的要害上尤其是对系统机制、性能优化和工程化能力的考察答起来很考验平时有没有真正做过东西。这篇文章我花了两天时间把整套笔试的考点、难度、现场做题时的思路和考后的复盘整理了出来也把备考时对照过的重点技术点一并做了梳理希望能给后面打算投小红书或其他大厂Android岗的朋友一个可参考的复习路径。1. 笔试前传小红书第三批笔试到底在考什么1.1 为什么是“第三批”笔试批次有什么讲究很多同学会问小红书春招笔试分这么多批和“第一批”“第二批”有什么区别。从我实际体感来看批次之间题目不完全相同但考察方向基本会保持稳定。小红书作为内容社区产品App端的复杂度一点不低图文信息流、视频播放、消息推送、IM聊天这些场景全都有所以客户端岗位的笔试重点非常明确基础扎实、对Android系统有深入理解、有工程化思维。第三批笔试整体时间大概是120分钟题型分两块一块是客观选择题覆盖Java/Kotlin语言、Android四大组件、Handler消息机制、View绘制、进程与线程、网络协议等另一块是编程题一般是两道一道偏算法一道偏Android场景实现。后面我会详细拆。这里先给个结论小红书笔试的难度定位在中上等比纯粹校招基础题要深又没到社招对源码级别的深挖程度但它有个明显特点——很多题会以真实业务场景为背景比如给你一个图片加载卡顿的现场让你分析可能原因和排查思路。这种题没有标准答案判的是你的分析路径和知识广度所以平时有没有真的调过性能问题一答就知道。1.2 从笔试看岗位画像他们要什么样的Android开发与其说笔试在刷人不如说它在帮你双向匹配。我做完这轮笔试最大的感受是小红书客户端团队想要的不是“只会写页面”的Android开发而是具备这几个特质的人第一对底层机制有好奇心。选择题里多次出现Handler、Looper、MessageQueue的联动关系还有Binder通信、进程间通信的细节第二懂性能优化。信息流产品最怕卡顿和内存暴涨所以他们对布局层级优化、内存泄漏、图片缓存、启动速度这些方向极其敏感第三有工程化意识。构建工具链、代码混淆、多渠道打包、版本兼容这些都是实际开发中绕不开的坑。所以如果你现在还在复习阶段我建议把重心从“刷了多少题”转移到“有没有把Android的核心机制吃透”上来。笔试不是终点它更像是面试的前置筛选通过笔试进入面试后你会发现面试官继续追问的正是笔试里那些你或许没答好的点。2. 计算机基础与Java/Kotlin考点复盘2.1 语言基础从语法糖到并发原理解析小红书笔试对语言基础的考察给我的感觉是“表面考语法实际考原理”。比如Kotlin的协程光知道suspend关键字怎么用是不够的题目会追问协程的调度原理、Dispatchers的切换逻辑、结构化并发怎么保证不泄漏。如果你只停留在API使用层面这类题很容易露馅。我的复习建议是把Kotlin的这几个硬核知识点吃透协程的CoroutineScope与Job生命周期、withContext与Dispatchers.IO的线程切换流程、Flow的冷热流区别。Java方面则重点关注HashMap在JDK 7和JDK 8中的实现差异、ConcurrentHashMap的锁分段与CAS、volatile的可见性与指令重排、synchronized锁升级过程。这些在笔试选择题中出现的频率极高而且基本都会结合代码片段来考比如给定一段多线程代码让你判断输出结果考的就是你对内存可见性和原子性的理解深度。另外笔试里还出现了一个很实战的考点——SharedPreferences的线程安全性。很多同学知道它“适合存轻量数据”但不清楚它在跨进程场景下的实现其实有坑apply()是异步落盘、commit()是同步落盘。这些细节如果只是会背结论遇到进程崩溃后数据丢失的场景题就答不明白了。2.2 数据结构与算法笔试算法题的出题方向算法题部分小红书这轮没有出特别偏门的题两道题考的都是高频方向一道是数组/字符串处理的模拟题另外一道是结合Android场景的二分或动态规划。难度大约在LeetCode Medium偏下一点但时间压力不小因为每题还要写输入输出处理不像IDE里可以直接调试。这里说一个笔试技巧先写题解思路再做。无论是牛客还是赛码平台答题区域一般都有注释区我会先把思路用伪代码写在注释里再开始实现。这样即使代码没写完考官也能看到你的思考过程在线笔试的判卷不只是机器跑用例人工复核时思路展示会加分。算法复习我建议按这个优先级数组/字符串双指针、哈希表、栈与队列、二叉树遍历尤其是层序、二分查找模板、链表反转与合并、动态规划的背包与子序列两大类。不要贪多把每类题练熟到能默写模板笔试时才能稳。真到了考场上遇到没见过的题先想暴力解再考虑优化比卡在一道题上强。我觉得这里需要强调一个容易被忽略的点Android方向笔试的算法题偶尔会包装成业务场景。比如“实现一个LRU缓存”很多人刷过原题但笔试时会改写成“图片内存缓存容量不足时如何淘汰最久未使用的图片”。如果你只看穿了是LRU直接写LinkedHashMap就完事但如果你能顺手提一句“这个结构对应到LruCache其实内部就是LinkedHashMap 最大容量控制”这种知识迁移能力反而比AC本身更有价值。3. Android核心机制从四大组件到Framework3.1 Activity启动流程与AMS/ActivityTaskManager的作用小红书笔试里让我印象最深的一道选择题是问一个Activity从点击图标到最终显示在屏幕上整个过程中AMS或者说Android 10之后的ActivityTaskManager承担了什么角色。这道题表面在考启动流程实际上在考你有没有真正阅读过系统源码哪怕只是源码的大致调用链。简单把流程捋一遍点击图标后Launcher进程通过Binder调用AMS.startActivity()AMS负责解析Intent、检查权限、判断目标Activity所在进程是否已创建如果没有进程就通过Zygote的socket请求fork一个新进程进程创建后ActivityThread.main()启动创建Application然后再由AMS通知该进程创建并启动目标Activity最终走onCreate、onStart、onResume。这里的核心就是Binder通信 进程生命周期管理。笔试会从各种角度变着问比如“singletop和singleTask在不同进程下如何复用任务栈”“Activity被回收后onSaveInstanceState保存的数据在什么时机恢复”。如果你只是背了启动模式表格没理解任务栈的概念遇到变体题就很容易掉坑。3.2 Handler、Looper与MessageQueue消息驱动模型的三个角色Handler机制是Android面试的“亲儿子”笔试自然也逃不掉。小红书这批题出了两道Handler相关题一道是问主线程为什么不会因为Looper.loop()死循环而卡死另一道是问postDelay的消息是怎么实现延迟的。第一道题的思路其实不复杂Looper.loop()里的死循环每执行一次就尝试从MessageQueue取一条消息取不到时就阻塞在nativePollOnce()让出CPU当有消息进来时通过nativeWake()唤醒。而Android应用的各类事件触摸、绘制、生命周期回调本质上都是消息被源源不断地插入到主线程的消息队列中所以这个循环是App正常运行的发动机而不是卡顿的原因。第二道题考得更细一点MessageQueue不是一个普通队列而是按时间排序的优先级队列——Message.when记录了消息的触发时间postDelay并不是让线程sleep而是把消息插入到合适位置如果队首消息还没到时间就在nativePollOnce(timeout)里设置一个超时时间等待。理解到这个层面做题时对代码执行顺序的判断基本不会出错。复习Handler时我建议亲手画一遍时序图把sendMessage、enqueueMessage、next、dispatchMessage四个关键方法的调用关系理顺。笔试考选择题还好如果编程题要求你“模拟实现一个简单的消息队列”心里有这张时序图就完全不怕。3.3 自定义View与事件分发绘制流程的三个关键方法小红书的App里有大量双列瀑布流、视频封面九宫格这类自定义UI所以笔试对View体系的考察也很重视。选择题里考了onMeasure、onLayout、onDraw的执行顺序以及requestLayout和invalidate的区别——这两个方法很多初学者分不清其实前者会触发整棵View树的measure和layout后者只触发draw所以频繁调用requestLayout比invalidate代价高得多。事件分发是另一个高频点。题目给出一个外层ScrollView嵌套内层RecyclerView的滑动冲突场景让你分析事件最终由谁消费。这类题的破题思路是先看dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent三个方法的返回值再结合父View和子View的优先级来分析。遇到滑动冲突常见的解决方式是外部拦截法或内部拦截法笔试虽然不用写完整代码但你要能清楚描述拦截逻辑。除了这些我还想提醒一点笔试会考到布局性能。比如“为什么ConstraintLayout比多层级LinearLayout性能更好”“include、merge、ViewStub分别解决了什么问题”。信息流页面层级很深的话measure和layout的耗时会被指数放大所以小红书这类重内容产品对布局优化关注度极高这些工程细节多花点时间看笔试和面试都能用上。4. 构建、优化与工程化笔试里的“工程题”4.1 AGP版本与Android Studio工具链的兼容性之谜在小红书这批笔试里出现了一道很有工程味的题目关于Android Gradle Plugin版本与Gradle版本、Android Studio版本的对应关系。说实话这类题没在项目里踩过坑的人基本答不好因为版本兼容矩阵平时都是报错了才会去查。举一个真实案例很多人用的Android Studio Hedgehog | 2023.1.1 Patch 2当时就有人问它能不能支持AGP 8.0以上版本。答案是支持的AGP 8.x对应的最低Studio版本是Flamingo2022.2.1Hedgehog更新到Patch 2之后对AGP 8.1、8.2都有不错的兼容性。但如果你用的是老的AGP 4.x强行升级到新版Studio就会出现构建报错甚至无法打开工程的情况。笔试虽然不会让你现场配环境但它会出类似这样的题“APG版本从7.x升级到8.x后BuildConfig默认值发生了哪些变化”。AGP 8默认关闭了BuildConfig的生成如果你项目里有代码依赖BuildConfig.DEBUG之类的字段升级后就会编译失败需要在build.gradle里重新开启。这种问题没有真实升级经验是真的答不上来。我的建议是复习时专门整理一张版本兼容表自己当前用的Android Studio版本、对应Gradle版本、可用的AGP版本范围、JDK版本要求把这些对应关系搞清楚。这不仅是应付笔试实际做项目时遇到莫名其妙的构建报错80%以上都是版本不匹配引起的。4.2 代码混淆与APK瘦身R8、ProGuard和资源压缩笔试里有一道多选题问的是APK体积优化的方案选项包括开启shrinkResources、使用R8混淆、删除无用so库、使用App Bundle替换APK。题目本身不难但背后考的是你对整个构建流程的理解。R8是AGP 3.4之后默认开启的代码压缩工具它做的事情比ProGuard更彻底不仅做混淆还做裁剪、内联、常量折叠最终产出更小的字节码。混淆的核心目的是减小体积和增加逆向难度所以笔试面试经常顺带问一句“为什么发布包要开混淆minifyEnabled和shrinkResources的区别是什么”。这里有一个实操层面的点开启R8之后如果代码里用了反射、Keep注解没有覆盖到运行时就可能崩溃。所以一条重要的经验是——每次发布前都要完整回归一遍通过反射调用的第三方库功能。笔试有一道题就给出了一个“开启混淆后启动崩溃”的场景让你排查原因破题点就在反射调用没有配置keep规则。另外资源压缩shrinkResources必须和minifyEnabled一起使用它通过移除未被引用的资源文件进一步减小体积。但要特别注意动态id引用的资源比如getIdentifier()方式获取的资源可能被误删需要在res/raw/keep.xml里配置保留规则。4.3 性能优化高频方向卡顿、内存与稳定性小红书笔试对性能优化这块的考察非常实战化印象里至少有三四道题都和信息流场景相关。卡顿优化方面考了怎么定位掉帧问题从Choreographer的帧回调、Systrace、LayoutInspector这几个工具链入手判断卡顿到底是发生在主线程的measure/layout还是因为主线程有耗时IO或死锁。内存方面考的是内存泄漏的常见场景比如单例持有Activity、Handler持有外部类的隐式引用、匿名内部类持有外部引用。其中在Handler场景下标准解法是使用静态内部类弱引用并在onDestroy时移除回调。笔试还考了Bitmap内存模型的变化——从Android 8.0开始像素数据从Java堆移到了Native堆recycle()不再需要主动调用但要特别注意Native层的释放时机。稳定性方面则更偏实践一道题给了线上ANR的日志让你判断是输入事件分发超时、广播超时还是Service超时。答案是看日志里是否有Input dispatching timed out、Broadcast of Intent timeout、Executing service等关键特征。这类题不读过线上日志的人很难答对所以平时遇到线上问题不要只看Bugly上的一行摘要一定要点进去把完整堆栈看完。4.4 系统集成面动态图标、蓝牙、OTA等延伸考点第三批笔试里还出现了几个偏系统集成的方向虽然分值不高但足以看出考点的覆盖面。比如Android 13/14的动态图标主题Monet取色、蓝牙适配的权限变化、OTA升级中对AB分区与recovery分区的理解等。这些内容在主流的大厂笔试中偶尔会出现属于“锦上添花”的知识点复习优先级排在前面那些大块头之后。如果时间充裕建议按这个思路准备先看最近的Android版本新增了什么权限和限制再看手机厂商ROM在适配时有哪些坑。比如Android 14对前台服务类型有了更多限制蓝牙扫描需要动态申请BLUETOOTH_SCAN读取照片需要READ_MEDIA_VISUAL_USER_SELECTED。这些变化在选择题里通常以“哪个权限在哪个版本开始生效”的方式出现花半天时间把每个大版本的behavior change列表过一遍性价比很高。5. 编程题实战复盘从读题到AC的完整流程5.1 在线笔试平台的操作细节与时间分配编程题部分我在这批笔试中遇到的是牛客网平台界面支持切页和在线编译但不支持断点调试所有测试用例都是提交后才运行。这点非常关键意味着你必须在本地把逻辑想清楚再写代码不能像IDE里那样边写边调。我的时间分配策略是选择题控制在40分钟内编程题每道控制在35分钟左右剩下时间用来检查。编程题拿到手第一件事不是急着敲代码而是先读样例、理解题意、确认输入输出格式。很多同学挂题不是思路不对而是没注意到输入是多组测试用例还是单组、数字之间是空格还是换行分隔这些细节在笔试里就是生死线。具体到写代码层面我强烈建议用自己最熟悉的语言和模板来写不要在现场尝试新技巧。比如二分查找和快速幂的写法平时就要练到条件反射考场上才能省出时间思考题目本身的逻辑。另外写完代码后一定要自己手动跑一遍题目给的样例确认输出与预期一致再提交。这个习惯帮我避免了至少两次低级错误。5.2 笔试后的复盘把错题变成面试素材笔试结束后我第一时间把没把握的题和正确答案记了下来这步很多人忽略但恰恰是最有价值的。因为小红书的面试官手里大概率会有你的笔试记录二面时追问笔试里的某个点是他们的常见套路。我复盘时重点关注三类题一是完全不会的说明是知识盲区需要系统补二是对了但不确定的说明是“半吊子”知识需要把这个点的原理彻底搞懂三是做错但看答案恍然大悟的说明是易混淆概念需要专门整理成对比笔记。比如我这次就把onStart和onResume的区别、launchMode各种组合下的启动结果整理成了表格。这里再推荐一个比较笨但有效的方法把错题对应的技术点写成一篇“面试自我介绍”式的文档用大白话讲清楚这个知识点是什么、为什么这样设计、实际开发中怎么用。写出来的过程会暴露很多你以为懂但其实说不清楚的地方而这些地方恰恰就是面试官最爱追问的地方。5.3 如果笔试考到了你没准备过的题怎么办最后聊一个所有笔试都逃不开的问题遇到完全没见过的题怎么办。小红书这批笔试的开放题里有一个“如果你来设计一个小红书首页Feed流的加载方案”的方向这种题没有标准答案考察的是分析和设计能力。我的应对思路是一层一层拆先定义问题边界——Feed流有下拉刷新、上拉加载、分页策略、图片缓存、预加载、失败重试等子问题再结合自己熟悉的Android技术栈选择方案——分页用Paging或RecyclerViewDiffUtil图片加载用Glide或Coil请求层用Retrofit 协程最后补上工程化考虑——弱网优化、流量节省、CDN容灾、埋点监控。遇到这种题千万不要直接写“我不会”或者硬编一个明显不合理的方案。把你能想到的相关知识点一层层展开展示分析框架和工程经验即使达不到满分也能让考官看到你的思考能力。我个人的体会是这种半开放题更多是在考察你是否有能力把复杂问题拆解成可执行的方案而Android开发岗恰恰最看重这种能力。从收到笔试通知到完成答卷整个过程其实也就不到三个小时但一套题做下来基本就能摸清自己这几年从项目里真正沉淀了多少东西。小红书这批笔试题让我印象最深的不是某一个难题而是它在每个模块里都在试图区分“背过答案的人”和“真的做过事情的人”。所以如果你的目标是这类内容型大厂的Android岗平时写业务代码时多问自己一句“这行代码底层做了什么”参加面试和笔试时会从容很多。