
B站这套2020校招Android笔试卷二我在准备面试的时候反复刷过好几遍。说实话它不算特别难但覆盖面很广基础题、源码题、场景题都有而且有几个题放在今天来看依然是高频考点。比起单纯背答案我更建议大家把这套卷子当成一份“Android知识地图”来用把每个考点对应的知识树铺开这样无论面试官怎么换着花样问你都能接得住。这篇文章我就以这套卷子为线索把核心考点、答题思路、常见丢分点一次讲透适合正在准备Android校招或者社招的朋友参考。1. 笔试卷整体拆解这套卷子到底在考什么1.1 从岗位JD反推考察维度B站的Android开发岗位在业务上主要承担的是主站客户端、直播、播放器等模块的开发。这类业务型客户端岗位对候选人的要求集中在四个维度第一Java和Android基础是否扎实能不能直接上手写业务第二对系统关键机制的理解深度比如Handler、Binder、事件分发这决定了你能不能排查疑难问题第三工程化能力包括网络层封装、性能优化、崩溃治理这些实战技能第四设计能力给一个需求能不能给出合理的技术方案。这套笔试卷就是围绕这四个维度出的。我印象比较深的是卷子里很多题目不是单独考一个知识点而是把知识点串起来考。比如一道关于图片加载的题可能同时涉及内存缓存、磁盘缓存、线程池、LRU算法这就是在模拟真实开发中“一个功能背后挂着一整套知识体系”的场景。1.2 笔试卷的典型结构与时间分配从题型分布来看这套卷子主要分为客观题选择题、判断题和主观题简答题、编程题、设计题两大部分。客观题考察的是知识面的广度主观题考察的是思维深度和表达能力。这里要特别提醒一下时间分配的问题。我当初模拟这套卷子时客观题大概花40%的时间主观题花60%的时间。很多同学容易在客观题上纠结太久碰到一个模糊选项就反复琢磨结果留给后面编程题的时间就不够了。客观题遇到拿不准的先凭第一印象选一个标记一下等主观题写完了再回头检查。主观题里最忌讳的是“只写结论不写过程”。比如问你“Handler机制的原理是什么”只写“Handler用于子线程更新UI”这种一句话答案基本拿不到分。面试官想看到的是你对MessageQueue、Looper、Handler三者关系的完整描述最好还能画出消息从发送到执行的时序流程再补充一下主线程Looper的启动时机。写得越完整越能体现你真的理解而不是背过。2. 核心基础考点Java 与 Android 的底层功底2.1 语言基础泛型、反射、注解与并发这套卷子的Java部分泛型和反射基本是必考的。泛型常考的是类型擦除、泛型边界、PECS原则生产者使用extends消费者使用super。我建议大家不要只背结论要能说清楚为什么会有类型擦除以及擦除之后对重载、对性能有什么影响。反射这块常考的是反射的三种获取Class的方式、反射的性能损耗、以及反射在框架中的典型应用比如Retrofit的动态代理、EventBus的注解解析。我复习的时候习惯把“反射注解动态代理”放在一起看因为这三个东西在主流框架里经常一起出现是理解很多开源库底层原理的钥匙。并发题也是重头戏。volatile和synchronized的区别、ConcurrentHashMap的实现原理、线程池参数的含义和拒绝策略这些都是高频中的高频。特别是线程池我建议大家把七大参数核心线程数、最大线程数、空闲存活时间、时间单位、任务队列、线程工厂、拒绝策略全部背熟然后能结合实际场景说清楚“核心线程数设置为多少比较合理”这个问题。2.2 Android 核心机制Handler、Activity 启动模式与四大组件Handler机制是Android面试的“钉子户”几乎任何一家公司的Android岗都会问。这套卷子里也出现了相关题目而且问得比较细。要答好这道题我建议从六个层面来组织答案一是Handler的构造过程二是Handler.sendMessage如何将消息放入MessageQueue三是Looper.loop()如何循环取出消息并分发四是Handler.handleMessage在哪个线程执行五是主线程Looper在哪里启动六是ThreadLocal在其中的作用。Activity的启动模式也是必考内容。standard、singleTop、singleTask、singleInstance这四种模式的区别要能脱口而出还要能结合具体场景说明“什么情况下用singleTask”。我在回答这类问题时会补充一个细节同一个Activity在不同任务栈中出现时onNewIntent的调用时机和参数处理这是很多面试官喜欢追问的切入点。四大组件里ContentProvider和BroadcastReceiver经常被认为“用得少所以不重要”但这套卷子偏偏考了。其实ContentProvider的底层是Binder它的onCreate时机要早于Application的onCreate这两个点都是加分项。BroadcastReceiver要注意动态注册和静态注册的区别尤其是Android 8.0之后静态注册隐式广播的限制以及Android 14对前台服务类型的新要求这些是体现你关注系统版本演进的加分点。2.3 高频源码题事件分发与 Binder事件分发是另一道“必背大题”。MotionEvent从Down到Up的完整流动过程Activity、ViewGroup、View三者之间的dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent的调用顺序要能画出来、说清楚。这里有个容易混淆的点down事件和后续move/up事件在分发路径上的差异。ViewGroup在down事件中可能决定不拦截但在move事件中突然拦截这时候子View会收到一个CANCEL事件这个细节很多人答不上来。Binder机制属于进阶题但B站这套卷子也确实涉及了。说实话Binder的完整流程非常复杂对于校招生来说我建议重点掌握这几个层次第一为什么需要Binder对比Socket、共享内存、管道的优缺点第二Binder通信的整体架构Client、Server、ServiceManager、Binder驱动四者的关系第三一次完整的Binder调用中数据是如何从用户空间拷贝到内核空间、再从内核空间拷贝到目标进程的第四oneway机制和普通调用的区别。把这些讲清楚已经能超过大多数候选人了。3. 进阶实战考点工程能力与性能调优3.1 自定义 View 与绘制原理自定义View是校招笔试中的“分水岭”题目基础好的同学在这里能拉开很大差距。这套卷子里的相关题目核心还是考察对View绘制流程的熟悉程度也就是measure、layout、draw这三个阶段的执行顺序和各自的作用。我建议复习时先理清这几个关键问题MeasureSpec的三种模式UNSPECIFIED、EXACTLY、AT_MOST分别是什么意思自定义View时onMeasure里调用setMeasuredDimension的时机wrap_content和match_parent在测量时的区别。很多人在自定义View时忘记处理wrap_content导致实际效果和预期不符这个坑在笔试和面试中都能成为考点。另一个高频方向是View动画和属性动画的区别。ObjectAnimator改变的是属性值会真正触发onDraw更新View动画只是视觉上的平移缩放不改变属性本身。从Android 3.0开始官方推荐属性动画这个知识点虽然基础但能引出一大串后续问题比如插值器和估值器的区别、动画监听器的回调时机准备的时候可以顺带复习。3.2 性能优化内存、卡顿、启动与包体积性能优化题在这套卷子里占比不低而且出题方式很灵活。内存泄漏是必考中的必考Handler造成的内存泄漏、静态Context引用、单例持有Activity、流未关闭这四大经典场景要能说出原因和解决方案。我每次都会重点强调Handler的泄漏原理内部类Handler持有外部Activity的隐式引用异步消息在队列中排队导致Activity无法被回收。解决方案是用静态内部类弱引用或者在onDestroy时移除所有消息和回调。卡顿优化是另一个高频方向。从布局优化说起include、merge、ViewStub这三种标签的使用场景要分清渲染层面要理解16ms原则知道掉帧是怎么产生的工具层面要会用systrace和Profile GPU Rendering。回答这类问题时我会按照“发现卡顿—定位帧率—分析trace—优化布局/减少主线程耗时—验证效果”这个思路来组织体现完整的排查能力。启动优化在近年面试中越来越常考。冷启动、热启动、温启动的区别以及Application的onCreate里不能做太多耗时操作这个结论背后的原因都需要理解到位。懒加载、异步初始化、启动器框架比如阿里的Alpha启动器这些方案可以在回答时作为加分项提一下。3.3 网络层与数据持久化方案网络相关的题目OkHttp和Retrofit是核心考点。OkHttp要重点掌握它的请求流程拦截器链式调用机制、连接池复用、缓存策略。Retrofit要理解它如何通过动态代理将接口方法转换成Http请求以及如何与OkHttp配合。这套卷子如果出现网络题大概率会围绕这些框架展开因为它们是Android开发中真正每天都在用的基础组件。数据持久化方面SQLite、SharedPreferences、文件存储、Room这几种方式各有适用场景。我特别提醒一下SharedPreferences的坑commit是同步写盘apply是异步写盘但apply在Activity生命周期回调时会有等待锁的风险这在ANR问题排查中偶尔会碰到。Room作为官方ORM框架在编译期就做了SQL正确性校验还能返回LiveData自动监听数据变化面试时提到这些优势是加分项。3.4 Jetpack 与组件化架构Jetpack在近年面试中的存在感越来越强这套2020年的卷子里可能涉及不多但放到现在必须准备。ViewModel和LiveData是重点中的重点。ViewModel为什么在屏幕旋转时不会销毁因为它存储在ViewModelStore中而ViewModelStore由Activity的NonConfigurationInstances持有旋转后新的Activity会从旧的实例中恢复数据。LiveData的粘性事件特性、observe和observeForever的区别、数据倒灌问题如何避免这些都是高频追问点。组件化架构也是大厂面试的常客。模块化、组件化、插件化的区别路由框架的原理ARouter如何通过APT生成映射表、模块间通信方式接口下沉、事件总线、路由这些概念在简历上写了就要能展开讲。如果你在项目里做过模块拆分一定要把“为什么拆、怎么拆、拆完怎么通信、怎么解决重复依赖”这四件事想清楚。4. 实操思路示范典型题这样答才能拿高分4.1 场景题如何设计一个图片加载框架这类设计题是主观题中的“大分值题”题干通常很简单比如“如果让你自己实现一个图片加载库你会怎么设计”。很多同学一听就懵其实这题有固定的答题框架。我建议按五个模块来答第一网络请求模块负责下载图片字节流可以用OkHttp作为底层第二缓存模块L1是内存缓存用LRU算法管理L2是磁盘缓存L3是自定义缓存策略第三解码模块根据ImageView的实际尺寸对图片进行采样压缩避免大图直接加载到内存第四线程调度模块网络请求放到IO线程池解码放到CPU线程池主线程只做UI更新第五生命周期管理模块监听Activity或Fragment的销毁时机及时取消加载任务和清理缓存。按这个结构答再补充几个关键细节内存缓存为什么用LRU而不是LFU、图片压缩时inSampleSize怎么计算、Glide的生命周期绑定是如何实现的。这样整道题就被拆解得非常完整面试官想追问也有抓手。4.2 排查题线上App出现卡顿如何定位这类题考察的是性能优化的综合能力难点在于“没有标准答案”但你可以用一套标准的排查思路来框架化回答。第一步确认卡顿范围是冷启动卡还是页面切换卡是特定机型还是全机型是特定版本还是全版本先缩小排查范围第二步通过APM工具采集卡顿现场包括CPU占用率、主线程堆栈、内存状态、磁盘IO情况第三步复现问题并抓取trace本机开发可以用systrace或Perfetto线上可以用Matrix的卡顿监控模块第四步根据trace定位到耗时的具体方法可能是主线程IO、过度绘制、大图解码、锁竞争等第五步给出优化方案并设置埋点验证优化效果。这套思路的价值在于展示了你的“排查方法论”而不是碰运气瞎猜。答题时如果能提到“先用工具定位、再动手改代码”这个顺序已经赢了一半。4.3 设计题IM类的消息列表如何保证滑动流畅这种题目把性能和业务场景结合在了一起很考验综合能力。我的回答会从四个层面展开数据层消息列表要用分页加载和预加载避免一次性拉取大量数据缓存层要做到内存数据库两级滑动时优先读内存缓存减少数据库查询次数。UI层ViewHolder要复用列表项的布局要扁平化减少嵌套层级头像加载要做圆角处理和占位图替换如果消息类型多还可以用多种ViewType来区分避免一根布局塞满所有元素。渲染层避免在getView或onBindViewHolder中做耗时操作包括图片加载、文本测量、动画启动这些都要延迟到空闲时处理。最后还有一个杀手锏——ItemAnimator如果你的列表不需要动画效果关闭默认动画能显著提升滑动流畅度。按这个思路答每一步都有据可依还能根据面试官的兴趣深入讲解整道题的完成度会非常高。5. 避坑清单应届生最容易丢分的五个细节5.1 只记结论、不记原理我在前面反复强调原理理解是因为太多次看到有人“知道”有很多种启动模式却说不清singleTask具体返回栈是怎么处理的。面试官只要追问一个“为什么”就露馅了。所以每一项技术点至少要准备两层的“为什么”为什么这么设计为什么有这个问题。比如Handler机制不仅要答出“子线程不能更新UI”还要说出为什么子线程不能更新UI以及如果子线程一定要更新UI有哪些安全的处理方式。5.2 项目经验没有数据佐证很多同学在简历上写“优化了冷启动速度”但问到“优化了多少”就答不出来了。这是非常常见的问题。我建议大家必须自己亲自压测过数据再写进简历比如优化前冷启动耗时1.8秒优化后1.2秒优化了33%这些数字比任何形容词都有说服力。如果没有数据赶紧自己造一个合理的场景去测试这比临时背诵项目细节更有价值。5.3 算法题基础不牢B站的笔试卷有算法题大部分公司的校招笔试也都有算法题。LeetCode的热题100和剑指Offer是基本盘刷两遍才算合格。我个人觉得比起追求刷题数量更重要的是把每个题型的模板总结出来比如二分法的边界处理、双指针的移动条件、动态规划的转移方程写法。笔试时间有限能用模板快速写出的题目就是稳定拿分的题目。5.4 时间分配不合理这道题其实在第一部分提过主观题分值大一定要留足时间。客观题不会的不要恋战先把会的做完再回来蒙。编程题不要一上来就写代码先在草稿纸上把思路和边界条件列清楚再动手写这样既能减少写错回改的时间也能让面试官看到你的思维过程。5.5 忽视沟通表达笔试虽然是写答案但主观题的文字表达也是“代码”。我看到过很多技术能力不错、但答题逻辑混乱的答案看了半天不知道要说什么。我建议主观题采用“先结论、再展开、最后总结”的方式作答每个要点分条列出关键术语和参数写全。这样即使内容没有100%完善阅读体验也会好很多容易拿高分。6. 一点实在的备考建议这套卷子刷完之后我最大的感受是B站的面试风格偏重基础和源码理解不喜欢“背题家”也不喜欢“只会调API的搬运工”。大家备考时要有意识地培养“源码视角”平时用到的每一个框架、每一条API多想一想底层是怎么实现的。比如你用Glide加载图片可以顺手看看它的缓存键是怎么生成的你用Retrofit定义接口可以想想动态代理是怎么把注解转换成请求参数的。这种习惯会不知不觉地拉开你和其他候选人的差距。如果时间有限我建议优先把Handler机制、Activity启动模式、事件分发、绘制流程、网络框架原理这五个专题吃透它们覆盖了大多数Android面试的80%高频考点。然后再花时间把自己项目里最有亮点的部分往深了打磨确保每一个写在简历上的技术点都能经得起三轮追问。最后再说一个细节笔试过程中如果遇到完全没思路的题不要空着。写一些自己相关的理解比如相关概念、可能的解决方向、排查步骤这些都能让面试官看到你的思考痕迹比空白的答案强得多。这套B站笔试卷可以当作一面镜子先测出知识盲区再有针对性地补比盲目刷题高效得多。祝大家都能拿到心仪的offer。