Android 面试复盘:认真刷题,掌握原理很重要,【深夜思考】
强烈建议,把自己的强项,亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。
因为我对安卓性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,我做了内存优化,熟练掌握使用 xxx,内存性能提升 xxx。
(因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)
项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。
比如,我做了 xx 项目,负责 xx 模块,使用了 xxx 框架,可配合 xx 做 xxx,效率提高 xxx%
===================================================================
 
 字节一轮
- 先聊简历。 
- 聊性能优化方面的问题,我这边体系化展开讲卡顿,瘦身,内存,crash 等方面的优化经验。 
- sychronized,volatile 区别? 
这里可以体系化的回答,主要从 JMM 角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。
- 对于锁的对象的不同,效果会有什么差别。 
- 讲一下 Handler 机制。 
这个问题问得太多了,一定要去看一回源码。
重点答的是 MessageQueue 这块,包括什么时候空闲,阻塞。
发散讲了线程相关的 ThreadLocal,还有 IdleHandler
- 出了一个设计题,当你的服务商出现问题,设计一个网络请求可用性的兜底方案。 
大概从 HttpDNS,域名容灾等方面回答吧。
- 设计一个方案,apk 已经发出去了,java 代码是最新,但是分包下发的 so 文件是旧版本,如何做一个兼容方案,保证兼容可用。 
这里没答好,我也忘了怎么答的了。
- Java 类加载机制。 
这是个基础概念题,没答好,回答的双亲加载机制。
然后引出 PathClassLoader,DexClassLoader 的区别,一个 dex 的加载到一个 java 类的加载过程。
- 一道算法题。 
字节二轮
- 聊简历。 
- 性能优化,展开讲了卡顿,内存。 
- 数据结构的题,hashCode 的扰动算法,涉及到一个数字,31,这个 31 是怎么来的? 
- 类的 static 属性字段,比如 public static int a = 1,被赋值几次? 
这个需要对类的加载机制有了解。
- 多个 Activity 共同 bind 一个 service,一个 Activity destory,问 service 的情况。 
这里就是问 service 的生命周期,考察 bind 跟 start 的区别。
- 装饰器模式,跟代理模式的区别。 
考察对常用的设计模式
- okhttp 的缓存逻辑实现。 
我以为是问的 链接缓存跟 io 缓存,我回答的是连接池复用跟 okio 的 io 复用。
后来提醒是 cache,就回答 CacheInterceptor,及其源码实现。
- SharedPreference 的 commit ,apply 区别。 
- SharedPreference 的其性能问题。 
apply 的 anr 是有一个字段,会 block 住主线程,需要清理 queuedWork 队列。
- SharedPreference 线程安全性,还有是否进程安全,SharedPreference 锁的对象是谁? 
- synchornized 锁对象,汇编实现。volatile 的汇编实现。 
- volatile 修饰 boolean 能保证原子性么? 
- Android 有哪几种动画。 
- 设计题,设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口。 
- 算法题,生产消费者模型。 
- ConcurrentHashMap 的相关。 
包括实现原理,put 方法,树化,扩容,继承了谁,扩容的时候,其余桶怎么感知。
- 安卓打包签名 v1,v2,v3 的区别。 
字节三轮
- 装饰器模式,适配器模式区别。举个 Android 或 java 里的应用例子。 
- 单例的优缺点。 
- 架构有做过么。 
- 说一下项目,项目中最能体现你能力的事情。 
- 平时怎么学习的。 
- 以后的职业规划 
- 离职原因 
- 插件化,做过插件化么,了解的主流方案? 
- 算法题。 
因第三轮挂了,捞出来换岗位再战。
字节加餐一轮(这轮面了 175 分钟,记忆深刻)
基础题目
- 聊聊平时做过的性能优化。 
- 界面卡顿 
从 ViewStub 源码开始谈 LayoutInflate 的整个过程
包括 xml 的解析,如何解析 tag,细节到里面哪些特殊 tag。
- xml 的解析耗时在哪些方面,反射,读文件,解析。 
- 如何优化这个过程:xml 在编译期就生成为 class 文件,那这是 gradle 编译的哪个阶段做这个事情。 
- checkthread 的问题,从 Window 到 ViewRootImpl 的创建,几者之间的关系。 
以上这是绘制相关,然后是渲染。
- 矢量图的原理。 
- canvas 怎么来的。 
- Window 跟 View 的关系。 
- 硬件加速原理。 
- 双缓冲机制。 
- 丢帧的原因。 
- 帧数计算。 
- 设计如何检测过度绘制的工具,要具体到 View。 
- blockcanary 原理,目的。 
- Listview 的滑动优化,比如一个 emoji 可以用 TextView 渲染,也可以用 ImageView 渲染,哪个更优。 
- Toast 为什么不需要权限就可以显示。 
- Window BadTokenExcetion 的原因。 
- 怎么实现悬浮窗。 
启动加速
- 怎么做 app 启动加速 
我的回答说利用 IntentService,就是异步加载机制。但是还不够。
- 引导我从 app 启动流程开始讲一遍,看从启动流程上能不能找到方法。 
- zygote 的内部实现,zygote.fork 有没有了解。 
- zygote 跟 ams 的通信方式用的是什么。 
- 整个启动过程中,mHandler 做哪些事。 
- 设计一个工具,监控启动时间,粒度要求在方法级别。 
内存相关
- 讲下内存泄露。以 handler 匿名内部类做例子讲。泄露链是怎样的。 
- looper.prepare 干了啥。 
- ThreadLocalMap 的实现。 
- leakcanary 原理。 
- 为什么要做抖动的检查,有啥用。 
- 为什么会出现抖动。 
- 线上有泄露,怎么收集,排查,设计方案。 
稳定性
- 解决线上稳定性 bug 的方法论。 
- 讲个能体现亮点的解决线上 bug 的案例。 
- 给了一个具体案例,让我现场分析原因。 
主要考察思维方式吧。
- 怎么收集 java 的 crash。 
- 怎么收集 native 的 crash。 
- 用线程安全的数据结构,ConcurrentHashMap 会出现 modifyCountException 么? 
ANR 相关
- 常见的 anr 问题怎么解。 
- 不常见的 anr,比如 
MessageQueue.nativePollOnce 都很正常,怎么去定位,如果是线上,怎么去收集。
- ANR 的原因 
- IntentService 会 ANR 么,讲内部实现。 
保活相关问题
- 杀进程机制的源码。 
- 进程优先级。 
- 怎么提升优先级。 
- 常见的保活手段。 
我这里着重讲了 Tim 的保活
原理。还有第三方库 Leonic 的原理。
APP 瘦身相关
- andRes 原理。 
- proguard 源码。 
- Facebook 的 redex,字节的 bytex 原理。 
- multidex 原理。 
- 很多资源包,如何瘦身。 
问了一下我自己维护的 github 库相关问题
- 防多开原理 
- 检测模拟器原理 











 
    
评论