Android开发三年,面了八家公司终于腾讯上岸,含泪整理面经

218 阅读15分钟

在下2017年毕业,目前从事android开发工作已经3年多了,前段时间刚完成一次跳槽,面试了几家公司,将一些面试经验分享给大家,希望对大家有所帮助。

写在前面

这次跳槽总共是面了8家,(2小,4中,2大厂)

小的都拿下了,4中里3个一轮游,1个三轮游。2大的都谈薪了。

小公司会比较偏重于业务,面试上也偏重业务,比如做了什么,大概方案,用了哪些库,库的原理。 这些基本上会集中在 图片处理,网络封装,自定义view这几个部分。

大厂会从业务入手,递进深入到原理及相关知识点,尤其集中在原理部分,这里对平时源码阅读有一定要求。 或者直接问对xxx源码有没有了解。

比如一个handler机制,因其涉及的地方特别多而且很容易展开,想完美答好,真的不是一次两次就能行的。

建议每次面试完,都及时对面试内容进行回忆记录,

这里不是为了泄题漏题,以后吹牛逼,这个没有任何意义。

目的是进行复盘,打磨自己的回答。

目录

  • 简历书写
  • 面试原题
  • 刷过的题目
  • 总结

1. 简历书写

强烈建议,把自己的强项,亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。

因为我对安卓性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,

我做了内存优化,熟练掌握使用xxx,内存性能提升xxx

(因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)

项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。

比如,我做了xx项目,负责xx模块,使用了xxx框架,可配合xx做xxx,效率提高xxx%

2.面试题

字节一轮

1.先聊简历。

2.聊性能优化方面的问题,我这边体系化展开讲卡顿,瘦身,内存,crash等方面的优化经验。

3.sychronized,volatile区别? 这里可以体系化的回答,主要从JMM角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。

4.对于锁的对象的不同,效果会有什么差别。

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.intentService会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.两个设计模式的区别。具体哪两个我忘了。

6.三道算法题 第一题写一个必然死锁的代码。讲一下解决死锁的方式。锁对象的不同的区别。 第一个出现的字符。 数组里的元素,组合起来求最大值。

7.checkThread里的thread是什么时候被赋值的。

8.讲下数字证书是什么。

9.解决内存抖动的实际案例。

10.降低bug的实际案例。

11.设计一个如何处理 app接收到服务器脏数据的方案。

12.设计一个云相册。

13.classLoader机制的原理。

14.硬件加速的底层实现。

15.操作系统相关问题。

16.如何处理多语言问题。

17.jvm虚拟机相关问题,具体忘了。

18.职业规划相关。

最后欢迎大家来鹅厂,有一说一不吹牛逼,这里同事真的很不错。

刷过的题目

下面是我花了将近一个月的时间整理的一份面试题库。这些面试题,包括我本人自己去面试遇到的,还有在面试之前刷过的题目,我都统一的整理了一下,希望对大家有用。

一、Android基础+进阶

1.Activity启动模式

2.Activity的启动过程

3.进程通讯

4.Android Binder之应用层总结与分析

5.进程保活方法

6.从源码了解handler looper ,messageQueue思路

7.handler如何实现延时发消息postdelay()

8.Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

9.RxJava原理及如何封装使用

10.okhttp源码分析

11.retrofit源码分析

......

由于篇幅有限,只能分享部分面试题,更多面试题及答案可以【关注+点赞+简信】我~ 无偿分享给大家,算是一个感恩回馈吧

12.LeakCanary核心原理源码浅析

13.LruCache 使用及原理

14.ARouter原理

15.注解框架实现原理

16.Android 如何编写基于编译时注解的项目

17.RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用

18.Rxjava2.0+Retrofit+Okhttp(封装使用)+MVP框架搭建

19.Android 插件化和热修复知识梳理

20.Android开发中比较常见的内存泄漏问题及解决办法

21.如何检测和定位Android内存泄漏

22.图片占据的内存算法

23.为什么图片需要用软引用,MVP模式中的view接口用弱引用

24.基于DataBinding与LiveData的MVVM实践

25.App稳定性优化

26.App启动速度优化

27.App内存优化

28.App绘制优化

29.App瘦身

30.网络优化

31.App电量优化

32.安卓的安全优化

33.为什么WebView加载会慢呢?

34.如何优化自定义View

二、Java基础+进阶

1.HashMap

2.ArrayList

3.LinkedList

4.Hashset源码分析

5.内存模型

6.垃圾回收算法(JVM)

7.垃圾回收机制和调用 System.gc()的区别?

8.类加载过程

9.反射

10.多线程和线程池

11.创建多线程方式、线程池工作原理

12.设计模式(六大基本原则、项目中常用的设计模式、手写单例等)

13.断点续传

14.Java 四大引用

15.Java 的泛型

16.接口、抽象类的区别

17.从 java 容器类的设计讨论抽象类和接口的应用

由于篇幅原因,以上完整学习笔记pdf如有需要,可以 点赞+评论 支持下我这个“光头强”,然后点击这里免费自取

三、数据结构与算法面试题

1.常用的数据结构有哪些?

2.数组

3.链表

4.队列&堆栈

5.二叉树

6.HashMap

7.图

8.排序算法有哪些?

9.查找算法

10.串

四、计算机网络部分

1.HTTP协议

2.TCP/IP协议 3.TCP的三次握手与四次挥手理解及面试题

4.网页中输入url,到渲染整个界面的整个过程,以及中间用了什么协议?

5.TCP和UDP的区别?

6.HTTP的几种请求方法具体介绍

7.HTTP请求和响应报文的格式,以及常用状态码

8.一个 TCP 连接上面能发多少个 HTTP 请求

由于篇幅有限,只能分享部分面试题,更多面试题及答案可以【关注+点赞+简信】我~ 无偿分享给大家,算是一个感恩回馈吧

总结

简历首选内推方式,速度快,效率高。然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!

面试过程一定要有礼貌。即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

另外,描述问题一定要慢。不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤……所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!fighting!

由于篇幅原因,以上完整学习笔记pdf如有需要,可以 点赞+评论 支持下我这个“光头强”,然后点击这里免费自取