-
线程池的使用,比如需要开上万个线程,线程池的处理规则;
-
热修复、插件化与组件化;
-
性能优化;
-
怎么处理在线app出现的闪退问题,比如是偶现的那种,怎样查找原因?
-
如果是报oom,怎么去定位哪里内存泄漏了?
-
有没有用过kotlin开发…
3面阿里钉钉
-
阿里的面试基本上都是边聊边问,根据你的工作经历以及面试过程中的内容进行展开。
-
面试官先问,你最擅长Android中的哪个方向呢?
我答了插件化、组件化、热修复、React Native,最近也在钻研Flutter,对flutter有一些自己的理解。(我故意这么讲,希望面试官可以多问一下flutter。)
- 面试官:插件化和热修复有什么区别吗?
我:插件化是把需要实现的模块或功能独立提取出来,减少宿主的规模,需要相应功能时再去加载相应模块;而热修复则是从修复bug的角度出发,不需要二次安装应用、用户无感知的情况下就可以修复已知bug。(这么基础的问题,回答的时候自信满满…)
- 面试官:热修复的核心原理是什么?
我:主要是利用Android类加载机制,把需要修复的类打包成dex文件,把这个修复过的dex文件排在dexElements最前面,ClassLoader在修复过的dex文件加载到类之后就不会再去加载错误的类了。(还好面试前有看过)
- 面试官:类加载为什么要使用双亲委托机制?
我:...(我记得我看过的来着,一下子想不起来了。)
- 面试官:jvm和dalvik、art的区别是什么?
我:jvm是基于栈的,dalvik和art是基于寄存器的。(这时候我慌得一比,快顶不住了…)
- 面试官又追问:那什么是基于栈的虚拟机,什么又是基于寄存器的虚拟机?
我说不知道。(那时完全不懂面试官为什么要问这个)
- 面试官:art加载类的流程和Dalvik有区别吗?
我:有区别吗?不就是ClassLoader吗?(面试官稍微提了一下机器码。)
后续查资料才知道,原来art水这么深,7.0以前直接编译为机器码。之后又变成混合aot、jit和解释执行了,加载类底层使用classlinker,先从classtable缓存查找,如果没有再从oat文件查找,否则就解释执行
- 面试官:那art下,热修复的实现上有什么需要注意的地方?
最后一个问题听完之后直接懵逼了…查资料才感觉到面试官其实还是在问:art下类加载的流程。原来aot会生成一个base.art文件,在ClassLoader创建之后就会把base.art中的类注入到缓存中去,所以会导致这些类无法修复。
- 面试官又问了我遇到的最难的内存优化问题和解决方案;未来三年计划,技术发展纵深的选择。
感觉凉了…
3面小米
-
对okhttp的源码解析;用rxjava遇到过哪些坑;
-
用过最复杂的自定义view和优化处理;
-
用EventBus遇到的坑;
-
glide如何检测生命周期;
-
底层替换热修复和冷启动热修复有什么区别,怎么实现?
-
常用算法,递归;各种算法空间和时间复杂度;
-
事件冲突解决;
-
绘制中MeasureSpec的结构和数据的计算规则;
-
最近几个系统版本的系统适配做过哪些工作( 不是ui适配)。
最后
大厂招Android高级工程师要求很高,问的东西很深,一般都会问到原理和底层,你必须专精于Android中某一块的知识点,不然面试中对什么知识都是点到即止,肯定是不行。
有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
学习宝典
对我们开发者来说,一定要打好基础,随时准备战斗。不论寒冬是否到来,都要把自己的技术做精做深。虽然目前移动端的招聘量确实变少了,但中高端的职位还是很多的,这说明行业只是变得成熟规范起来了。竞争越激烈,产品质量与留存就变得更加重要,我们进入了技术赋能业务的时代。
不论遇到什么困难,都不应该成为我们放弃的理由!
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我针对Android程序员,我这边给大家整理了一套学习宝典!包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
【Android核心高级技术PDF文档,BAT大厂面试真题解析】
【算法合集】
【延伸Android必备知识点】
【Android部分高级架构视频学习资源】