还原腾讯的一场 35K—55K 的 Android 高工面经

一、面试的由来

事情是这样的,因为跟公司发展一些想法的不同,早在十月份的时候就有了跳槽的想法,但是碍于老大的面子就一直就没有跟人事说出口,打算着等到年后金三银四在试试跳槽。

但是发生一件事终于让我忍不住了,人事不知道从哪里听的消息跟BOSS说了我想跳槽的想法,然后我就被谈话了,本来还留存在一些愧疚的心情顿时感觉烟消云散,在三十分钟的谈话结束之时,我选择了一个普通人的接受不了的想法,“裸辞”。交接完毕之后,第二天下午我便离开了待了三年之久的公司。

裸辞后,我本打算着年后再去试试互联网大厂,但是一次偶然的机会,我的大学同学不知从哪听到了我离职的消息找到了我,说腾讯的一个项目组急招一位Android高级开发工程师,问我有没有想法去试试。

我便想着我在家也复习的差不多了,现在机会来了,先去试个水也不错。结果跟他说了,便开始下面的这场面试;

image

腾讯阅文某项目组——Android高工面试题

一面

1、View绘制流程。onMeasure、onLayout、onDraw。
2、竖向的TextView如何实现。TextView文字描边效果如何实现。
3、事件分发。冲突解决。
4、动画
5、RecyclerView的特点和缓存
6、SparseArray和ArrayMap。具体实现原理和特性
7、说一下kotlin的优缺点。let和with的区别
8、接口和抽象类的区别,接口中可以有属性么?
9、用过哪些设计模式?策略模式和桥接模式的区别
10、多线程如何实现?有哪些方式?
11、线程池的参数
12、你如何自己实现一个LRUCache?Android里面的LRUCache是如何实现的?
13、synchronized和volatile的区别?为何不用volatile替代synchronized?类锁和对象锁互斥么?
14、gcroot的类型
15、jvm的运行时数据结构。栈帧中会有什么异常?方法区里面存放的是什么数据?
16、动态代理的实现。
17、Gradle的实现,gradle中task的生命周期。
18、Aop、AspectJ、ASM了解么
19、组件化和模块化的区别。ARouter的缺点。
20、MVP、MVVM的优缺点,jetpack中的组件
21、okhttp源码。
22、glide缓存
23、你对flutter的理解

二面

1、react的单向数据流
2、redux的状态管理,如何实现的?关键角色有哪些?
3、flutter的channel通信有哪几种?你用的哪种?插件你如何实现的?
4、flutter的包体积优化
5、自定义View的关键步骤,注意事项,你的理解
6、MeasureSpec讲一下
7、包体积优化
8、混淆的步骤和原理
9、module间的资源文件merge后,生成过多的R文件,处理过么?如何处理?
10、Bitmap内存大小,注意事项,如何优化
11、启动速度优化
12、glide中对Bitmap做了哪些操作?三级缓存?为何在有了内存缓存后,还要持有ActivityRef这个呢?
13、gradle声明周期,task,插件
14、注解:Source和Class、Runtime注解的区别
15、卡顿优化
16、内存泄漏检测及优化
17、RecyclerView的缓存,局部刷新用过么?
18、List的滑动卡顿如何优化
19、Activity中的Window的初始化和显示过程
20、Application中可以显示Dialog么?为什么?
21、泛型擦除,为何会有擦除?擦除的时机。通配符。
下面这段代码有问题么?有什么问题?为何会有这个问题?

List<? extends Object> list = new ArrayList<>();
list.add(123);
Object obj = list.get(0);

image

22、synchronized的同步原语
23、锁的几种状态
24、Android热修复原理,tinker的patch文件如何生成,patch文件是全部加载dex文件首部么?
25、插件化原理
26、两个用单链表表示的大数相加,求他们的和。单链表元素的值为0~9。

三面

1、讲下hashmap;链表转红黑树的限制为何是8;红黑树的时间复杂度;红黑树转链表的限制为何是6;current hashmap在所有情况下都是线程安全的吗?hashtable呢?
2、synchronized实现。非静态方法A和B在同一个类中,方法A用synchronized修饰,当A方法因为多线程请求有线程阻塞在对象锁上的时候,B方法的访问受不受影响?
3、既然泛型有编译期类型擦除,那么运行时无法获取到具体类型;而反射能在运行时获取到Class的类型;它们一个获取不到,一个可以获取到,这不就是矛盾么?请解释下细节。
4、在同一个手机上,如果把drawable-xxhdpi下的图片移动到drawable-xhdpi下,图片内存是如何变的,解释原理。如果在drawable-hdpi、drawable-xxhdpi下放置了图片,但是手机是xhdpi的,会优先加载哪个,加载优先级是怎样的?如果是400800,10801920这种呢,会如何查找?xhdpi和400*800同时存在时,会如何查找?布局文件呢?
5、图片内存优化;
6、Handler机制。MessageQueue中的Message是如何排列的?Msg的runnable对象可以外部设置么,比如说不用Handler#post系列方法(反射可以实现);
7、application中持有静态的用户信息,有何缺点?如何改进?
8、mvp和mvvm,jetpack

四面

1、选一个你的项目讲一下
2、技术选型是如何做的
3、优化内存
4、上传的重试机制
5、OOM和内存泄漏
6、包体积优化
7、你最擅长的点
8、你的职业规划

最后的我,很幸运,踏在2020的末尾,拿到我人生中第一个互联网大厂的offer。当后面HR跟我谈薪的时候,我才明白这一次我真的成功了。在高兴和惊喜同时我也想分享我的个人面试心得,希望能给到准备2021春招冲大厂的朋友一点帮助。

三、面试后的个人心得

准备周期

面试之前,最好先系统的复习一下基础知识,然后再复盘下自己的项目经历,把亮点都发掘出来。复习周期个人建议是一个月到三个月,时间不宜太久,久了就容易懈怠或者闭门造车,三个月的时候最好出去开始试水,检验一下自己的学习效果。

复习计划的制定和进度的把控也很重要,可以参考我的学习计划去学习,再根据自己的实际情况去做适当的调整。

复习技巧

我一直认为学习没有捷径可言。我信奉"好记性不如烂笔头",也信奉"书读百遍其义自见"。

一定要去实践。对于我们程序员而言,不单单是死记硬背,我们有更好的方式去学习,比如写demo去验证,比如学习源码的过程中,一定要自己去翻看源码,多翻几遍看熟了再说。

学习笔记我认为很重要,不仅要记笔记,还要写心得体会,文字笔记、画图、总结等,方式很多,但是一定要自己认真去做,不要太相信自己的记忆,只有反复记忆,加深理解才行。

学习知识点的过程中,可以遵循What、How、Why这个三板斧。即这个东西是什么?它是怎么做的?它为什么这么做,原理是什么,有没有更好的方式?

在复习的过程中,都是从一个个小的知识点开始学的,复习到一定阶段,可以尝试着去把这些东西串联起来,由点及面。

另外在复习的过程中,一定要及时跟你做过的项目结合起来,这样也可以反哺你的项目,你在面试时就知道怎么聊了,就会有项目讲到知识点,由一个知识点串联到另一个知识点,这样你的知识体系就建立起来了。

答题技巧

面试总体上是一个你跟面试官相会了解、相互交流的过程,大厂的面试官一般都很奈斯,如果你遇到不会的问题了,可以及时请教对方,不会了就问,不要怕丢面子,面试本就是一个学习和相互交流的过程,offer不是目的,只是个过程。

另外,有些时候某些技术或者知识点你不了解细节,但是大体的设计思路你是知道的,你就尽可能的答出你的理解,可以用横向的类似的技术去阐述这个技能点。

有些时候如果某个知识点一时半会想不起来了,可以迂回一下,跟递推公式一样,根据你擅长的知识点,一步一步去推导,先大胆假设,再小心求证,推导的过程也能说明一些问题。

还有需要注意的一点,对于不会的东西,可以尝试从原理角度去回答,但是尽量不要说错,回答的不全和方向错了是两个概念。

这里给大家准备一份我在家复习过的《Android面试核心知识PDF》,这份笔记是我面试之前花了二个多星期整理的,在面试过程中,这份笔记也帮了我不少的忙。但是因为简书的推荐机制,这里不能展示全部,如有需要这份资料的朋友可以私信我【面试】我发给你下载地址

四、面试常考的 Android知识点(部分)

  • Java基础方面:JVM、String、内部类、多态、抽象和接口、集合框架(Hashmap、Arraylist)、单例、线程、Synchronized、Look锁、动态代理、引用
  • Android基础方面:四大组件、View、进程、Bitmap、屏幕适配、消息机制、线程异步、WebView。
  • Android扩展方面:ART、Apk优化、Hook、Proguard、架构(MVC/MVP/MVVM)、Jetpack、NDK开发。
  • Android源码方面:Leakcanary、Eventbus
  • 设计模式方面:面向对象六大原则、工厂模式、单例模式、建造者模式、观察者模式、适配器模式、策略模式、代理模式
  • 算法方面:排序、二叉树、链表、栈和队列、二分、hash表、堆、数组/双指针、字符串处理、动态规划
  • 网络知识:Http(缓存、Https、Http2.0)、TCP(三次握手四次挥手、socket)、类加载器

PDF(部分)展示

image
image
image

五、总结

总体来说,面试一般都是基于你的简历来进行的,一般先考察你的基础,然后考察你知识体系的完备程度,接着会考察你的极限,最后还会考察一些软技能,比如你的学习能力、协作能力、沟通能力、分析解决未知问题的能力、抗压能力等。

希望拿到这份资料的朋友能把握机会,在接下来的2021春招面试中能拿到自己心仪的offer。

PS:如觉私信麻烦的朋友,《Android面试核心pdf》资料下载地址:(点开此处便可全部下载)

推荐阅读更多精彩内容