发布于2021-06-07 21:31 阅读(1060) 评论(0) 点赞(22) 收藏(4)
作者:普通的程序员
总共面了8家,(2小厂,4中厂,2大厂)
小的都拿下了,4中里3个一轮游,1个三轮游。2大的都谈薪了。
小公司会比较偏重于业务,面试上也偏重业务,比如做了什么,大概方案,用了哪些库,库的原理。
这些基本上会集中在:图片处理,网络封装,自定义view这几个部分。
大厂会从业务入手,递进深入到原理及相关知识点,尤其集中在原理部分,这里对平时源码阅读有一定要求。
或者直接问对xxx源码有没有了解。
比如一个handler机制,因其涉及的地方特别多而且很容易展开,想完美答好,真的不是一次两次就能行的。
建议每次面试完,都及时对面试内容进行回忆记录,当前这里不是为了泄题漏题,以后吹牛逼,这个没有任何意义。
目的是进行复盘,打磨自己的回答。
目录
强烈建议,把自己的强项,亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。
因为我对安卓性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,我做了内存优化,熟练掌握使用xxx,内存性能提升xxx。
(因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)
项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。
比如,我做了xx项目,负责xx模块,使用了xxx框架,可配合xx做xxx,效率提高xxx%
字节一轮
先聊简历。
聊性能优化方面的问题,我这边体系化展开讲卡顿,瘦身,内存,crash等方面的优化经验。
sychronized,volatile区别?
这里可以体系化的回答,主要从JMM角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。
对于锁的对象的不同,效果会有什么差别。
讲一下Handler机制。
这个问题问得太多了,一定要去看一回源码。
重点答的是MessageQueue这块,包括什么时候空闲,阻塞。
发散讲了线程相关的ThreadLocal,还有IdleHandler
大概从HttpDNS,域名容灾等方面回答吧。
这里没答好,我也忘了怎么答的了。
这是个基础概念题,没答好,回答的双亲加载机制。
然后引出PathClassLoader,DexClassLoader的区别,一个dex的加载到一个java类的加载过程。
字节二轮
聊简历。
性能优化,展开讲了卡顿,内存。
数据结构的题,hashCode的扰动算法,涉及到一个数字,31,这个31是怎么来的?
类的static属性字段,比如 public static int a = 1,被赋值几次?
这个需要对类的加载机制有了解。
这里就是问service的生命周期,考察bind跟start的区别。
考察对常用的设计模式
我以为是问的 链接缓存跟io缓存,我回答的是连接池复用跟 okio的io复用。
后来提醒是cache,就回答CacheInterceptor,及其源码实现。
SharedPreference的commit ,apply区别。
SharedPreference的其性能问题。
apply的anr是有一个字段,会block住主线程,需要清理queuedWork队列。
SharedPreference线程安全性,还有是否进程安全,SharedPreference锁的对象是谁?
synchornized锁对象,汇编实现。volatile的汇编实现。
volatile 修饰 boolean能保证原子性么?
Android有哪几种动画。
设计题,设计一个埋点数据上报库,需要哪几个模块,提供哪样的接口。
算法题,生产消费者模型。
ConcurrentHashMap的相关。
包括实现原理,put方法,树化,扩容,继承了谁,扩容的时候,其余桶怎么感知。
字节三轮
装饰器模式,适配器模式区别。举个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的原因。
怎么实现悬浮窗。
启动加速
我的回答说利用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怎么处理。
聊了下简历里的经历
这里主要是问我LeakCanary 1.* 跟2.*有啥不同引出的问题。
LocalBroadcast 和Broadcast的区别。
xposed的原理。
beforeMethodHooked,xposed内部做了什么事
免root hook框架 legend的源码实现。
记不太清,好像我说的是native方法指针的变更。
一道算法。
设计一个埋点库。
需要哪些模块。
字节后续的面试我忘了记录复盘了,现在也记不住了。这一轮面试反正是把我榨干了。
最后进入谈薪阶段。只不过没谈拢,哈哈。
最后就是我一直想去的粤海公仔厂了。
这里面试具体轮次我就不细说了。题目其实也都是那些题目,重点提供平时要学习的方向吧。
聊简历,性能优化。
view的绘制流程,尽可能越详细,越全面越好。
因为有了字节之前的面试经验,这里聊了很多view相关的。
大概从ActivityThread讲起,到Window,WindowManager,ViewRootImpl,setContentView内部实现干了什么,LayoutInflater。
下发到requestLayout,checkThread,scheduleTraversals,同步屏 障消息双缓冲, vsync信号,最后再performSechdules…
这里真的是要求自己平时除了写界面,也一定要深入源码进行学习。
很多奇奇怪怪的业务问题,真的就是靠读源码解决。
开多个链接,wifi+4G同时,分片下。
协议层 ,udp去下,本地做完整性校验,我记得qq客户端时这样做的。
m3u8的思想去下。
我回答借助v1签名思想,本地做对文件md5的校验。或者借助v3的思想,连续签名。
两个设计模式的区别。具体哪两个我忘了。
三道算法题
第一题写一个必然死锁的代码。讲一下解决死锁的方式。锁对象的不同的区别。
第一个出现的字符。
数组里的元素,组合起来求最大值。
checkThread里的thread是什么时候被赋值的。
讲下数字证书是什么。
解决内存抖动的实际案例。
降低bug的实际案例。
设计一个如何处理 app接收到服务器脏数据的方案。
设计一个云相册。
classLoader机制的原理。
硬件加速的底层实现。
操作系统相关问题。
如何处理多语言问题。
jvm虚拟机相关问题,具体忘了。
职业规划相关。
最后欢迎大家来鹅厂,有一说一不吹牛逼,这里同事真的很不错。
多说两句,客户端要学算法,不是说算法没用,你知道什么叫树的遍历你就能理解viewTree解析过程。
而且在大家层次不齐的情况下,用算法打回同一层次,看看谁的逻辑性强,代码书写风格好,这是对面试筛选有好处的。
谁都会说,买菜要用高数嘛?但是人家会你不会,那就是在面试上吃亏。
正题的刷题路程,给大家推荐《Android开发核心知识点笔记》中的“常见面试算法题汇总”,有需要的朋友们可以 点击这里快速免费获取
认真刷完了的话,此时面对面试,也就有个眼熟了。
不过真心不建议采用突击的方式,应该要做一个长期写题的规划。
把Java、Android基础、Android进阶、性能优化、开源库源码、设计模式、Gradle、计算机网络基础、Kotlin、C++、算法等知识,以知识点的形式,递进发散的做了一个《Android开发核心知识点笔记》,由于篇幅有限,这里只展示部分图片,有需要的朋友们可以 点击这里快速免费获取
Java知识点汇总
Android知识点汇总
Android扩展知识点汇总
性能优化知识点汇总
开源库源码解析
篇幅有限,有需要的朋友们 点击这里快速免费获取
原文链接:https://blog.csdn.net/River_ly/article/details/117454153
作者:bbjbbh
链接:http://www.phpheidong.com/blog/article/89828/2f22e07bacfb0fb4b58d/
来源:php黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 php黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-4
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!