年末我的 Android 面试复盘
5.讲一下 handler 机制。这个问题问得太多了,一定要去看一回源码。重点答的是 msgQueue 这块,包括什么时候空闲,阻塞。发散讲了线程相关的 threadLocal,还有 IdleHanlder
6.出了一个设计题,当你的服务商出现问题,设计一个网络请求可用性的兜底方案。大概从 httpDNS,域名容灾等方面回答吧。
7.设计一个方案,apk 已经发出去了,java 代码是最新,但是分包下发的 so 文件是旧版本,如何做一个兼容方案,保证兼容可用。这里没答好,我也忘了怎么答的了。
8.java 类加载机制。这是个基础概念题,没答好,回答的双亲加载机制。然后引出 pathClassLoader,dexClassLoader 的区别,一个 dex 的加载到一个 java 类的加载过程。
9.一道算法题。
字节二轮 1.聊简历。
2.性能优化,展开讲了卡顿,内存。
3.数据结构的题,hashCode 的扰动算法,涉及到一个数字,31,这个 31 是怎么来的?
4.类的 static 属性字段,比如 public static int a = 1,被赋值几次?这个需要对类的加载机制有了解。
5.多个 Activity 共同 bind 一个 service,一个 Activity destory,问 service 的情况。这里就是问 service 的生命周期,考察 bind 跟 start 的区别。
6.装饰器模式,跟代理模式的区别。考察对常用的设计模式
7.okhttp 的缓存逻辑实现。我以为是问的 链接缓存跟 io 缓存,我回答的是连接池复用跟 okio 的 io 复用。后来提醒是 cache,就回答 cacheInspector,及其源码实现。
8.sharedPreference 的 commit ,apply 区别。
9.sharedPreference 的其性能问题。apply 的 anr 是有一个字段,会 block 住主线程,需要清理 queuedWork 队列。
10.sharedPreference 线程安全性,还有进程安全性,sharedPreference 锁的对象是谁?sharedPreference 线程安全,锁的是 contentImpl.class
11.synchornized 锁对象,汇编实现。volatile 的汇编实现。
12.volatile 修饰 boolean 能保证原子性么?
13.Android 有哪几种动画。
14.设计题,设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口。
15.算法题,生产消费者模型。
16.concurrentHashMap 的相关。包括实现原理,put 方法,树化,扩容,继承了谁,扩容的时候,其余桶怎么感知。
17.安卓打包签名 v1,v2,v3 的区别。
字节三轮 1.装饰器模式,适配器模式区别。举个 Android 或 java 里的应用例子。
2.单例的优缺点。
3.架构有做过么。
4.说一下项目,项目中最能提现你能力的事情。
5.平时怎么学习的。
6.以后的职业规划
7.离职原因
8.插件化,做过插件化么,了解的主流方案?
9.算法题。
因第三轮挂了,捞出来换岗位再战。
字节一轮(这轮面了 175 分钟,记忆深刻)1.聊聊平时做过的性能优化。
2.界面卡顿从 viewStub 源码开始谈 layoutInflate 的整个过程包括 xml 的解析,如何解析 tag,细节到里面哪些特殊 tag。
3.xml 的解析耗时在哪些方面,反射,读文件,解析。
4.如何优化这个过程:xml 在编译期就生成为 class 文件,那这是 gradle 编译的哪个阶段做这个事情。
5.checkthread 的问题,从 window 到 viewrootimpl 的创建,几者之间的关系。
以上这是绘制相关,然后是渲染。
6.矢量图的原理。
7.canvas 怎么来的。
8.window 跟 view 的关系。
9.硬件加速原理。
10.双缓冲机制。
11.丢帧的原因。
12.帧数计算。
13.设计如何检测过度绘制的工具,要具体到 view。
14.blockcanary 原理,目的。
15.listview 的滑动优化,比如一个 kmoji 可以用 textview 渲染,也可以用 imageview 渲染,哪个更优。
16.toast 为什么不需要权限就可以显示。
17.badwindowtoken 的原因。
18.怎么实现悬浮窗。
启动加速 1.怎么做 app 启动加速我的回答说利用 intentService,就是异步加载机制。但是还不够。
2.引导我从 app 启动流程开始讲一遍,看从启动流程上能不能找到方法。
3.zygote 的内部实现,zygote.fork 有没有了解。
4.zygote 跟 ams 的通信方式用的是什么。
5.整个启动过程中,mHandler 做哪些事。
6.设计一个工具,监控启动时间,粒度要求在方法级别。
内存相关 1.讲下内存泄露。以 handler 匿名内部类做例子讲。泄露链是怎样的。
2.looper.prepare 干了啥。
3.threadLocalMap 的实现。
4.leakcanary 原理。
5.为什么要做抖动的检查,有啥用,
6.为什么会出现抖动。
7.线上有泄露,怎么收集,排查,设计方案。
稳定性 1.解决线上稳定性 bug 的方法论。
2.讲个能体现亮点的解决线上 bug 的案例。
3.给了一个具体案例,让我现场分析原因。主要考察思维方式吧。
4.怎么收集 java 的 crash。
5.怎么收集 native 的 crash。
6.用线程安全的数据结构,concurrentHashMap 会出现 modifyCountException 么?
ANR 相关 1.常见的 anr 问题怎么解。
2.不常见的 anr,比如 msgQueue.nativePollOnce 都很正常,怎么去定位,如果是线上,怎么去收集。
3.anr 的原因
4.intentSe
rvice 会 anr 么,讲内部实现。
保活相关问题 1.杀进程机制的源码。
2.进程优先级。
3.怎么提升优先级。
4.常见的保活手段。我这里着重讲了 Tim 的保活原理。还有第三方库 Leonic 的原理。
APP 瘦身相关 1.andRes 原理。
2.proguard 源码。
3.Facebook 的 redex,字节的 bytex 原理。
4.multidex 原理。
5.很多资源包,如何瘦身。
问了一下我自己维护的 github 库相关问题 1.防多开原理
2.检测模拟器原理
3.查 root 权限,如果是自编的 rom 怎么处理。
聊了下简历里的经历 1.contentProvider 的初始化时机。这里主要是问我 LeakCanary1.* 跟 2.*有啥不同引出的问题。
2.LocalBroadCast 和 broadCast 的区别。
3.xposed 的原理。
4.beforeMethodHooked,xposed 内部做了什么事
5.免 root hook 框架 legend 的源码实现。记不太清,好像我说的是 native 方法指针的变更。
6.一道算法。
7.设计一个埋点库。需要哪些模块。
8.设计一个组件,统计 activity 的前台时长,fragment 的前台时长。
字节后续的面试我忘了记录复盘了,现在也记不住了。这一轮面试反正是把我榨干了。
最后进入谈薪阶段。只不过没谈拢,哈哈。
最后就是我一直想去的南山必胜客,粤海公仔厂了这里面试具体轮次我就不细说了。题目其实也都是那些题目,重点提供平时要学习的方向吧。
1.聊简历,性能优化。
2.view 的绘制流程,尽可能越详细,越全面越好。因为有了字节之前的面试经验,这里聊了很多 view 相关的。大概从 ActivityThread 讲起,到 window,windowManager,viewRootImpl,setContentView 内部实现干了什么,layoutInflator 下发到 requestLayout,performShechdules,checkThread,绘制屏障消息双缓冲,sync 信号,最后再 performOnMesure,layout,draw。
这里真的是要求自己平时除了写界面,也一定要深入源码进行学习。很多奇奇怪怪的业务问题,真的就是靠读源码解决。
3.问网络优化,当网络带宽足够大,信号足够好,下载大文件,怎么快?开多个链接,wifi+4G 同时,分片下。协议层 ,udp 去下,本地做完整性校验,我记得 qq 客户端时这样做的。m3u8 的思想去下。
4.apk 安全措施,当 apk 已经被破解了,怎么处理?我回答借助 v1 签名思想,本地做对文件 md5 的校验。或者借助 v3 的思想,连续签名。
5.两个设计模式的区别。具体哪两个我忘了。
评论