比如,我做了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库相关问题
-
防多开原理
-
检测模拟器原理
-
查root权限,如果是自编的rom怎么处理。
聊了下简历里的经历
- contentProvider的初始化时机。
ollOnce都很正常,怎么去定位,如果是线上,怎么去收集。
-
ANR的原因
-
IntentService会ANR么,讲内部实现。
保活相关问题
-
杀进程机制的源码。
-
进程优先级。
-
怎么提升优先级。
-
常见的保活手段。
我这里着重讲了Tim的保活原理。还有第三方库Leonic的原理。
APP瘦身相关
-
andRes原理。
-
proguard源码。
-
Facebook 的redex,字节的bytex原理。
-
multidex原理。
-
很多资源包,如何瘦身。
问了一下我自己维护的github库相关问题
-
防多开原理
-
检测模拟器原理
-
查root权限,如果是自编的rom怎么处理。
聊了下简历里的经历
- contentProvider的初始化时机。