猝死警告!熬夜2个月喜提26k字节安卓岗offer面经分享,非秃勿入!

前言

从2020年11月开始面试准备到2020年最后一天31号晚上7点收到短信offer,历时两个月,在熬夜猝死边缘疯狂试探的我,终于等来我梦寐以求的“跨年礼物”。

“日尼玛,退钱”,《温暖的抱抱》电影前10分钟的开场剧情,让我不禁想着该如何说服朋友一起离场,却被自己短信铃声拉回了思绪,“应该调成静音的”。无聊的剧情本就让整个电影院变得十分寂静,赶紧把手机调成静音,翻阅短信一看抬头是“字节跳动”的短信offer。至此,电影剧情也开始笑点频出,“嗯,是一部不错的爆米花喜剧电影”电影结束后和朋友议论道。

对于这部电影的看法,仅是个人观点,不喜勿喷。闲话好像说的有点多了,不过希望朋友们理解下我想跟大家分享这份喜悦的心情。回归正题,面经分享!希望对大家有借鉴意义和帮助。2个月的时间总共是面试了9家,(2小,4中,3大厂),小的都拿下了(压根儿没想去,主要是面试练练手,检验下自己的水平),4中里3个一轮游,1个三轮游,3个大厂最后拿到了字节的offer,阿里的一面就挂了,腾讯的到了三面。

大小厂的面试要点简要

  • 小公司会比较偏重于业务,面试上也偏重业务(但也少不了算法题,字节就每轮必问),比如做了什么,大概方案,用了哪些库,库的原理。这些基本上会集中在图片处理,网络封装,自定义view这几个部分。

  • 大厂会从业务入手,递进深入到原理及相关知识点,尤其集中在原理部分,这里对平时源码阅读有一定要求。或者直接问对xxx源码有没有了解。比如一个handler机制,因其涉及的地方特别多而且很容易展开,想完美答好,真的不是一次两次就能行的。

建议每次面试完,都及时对面试内容进行回忆记录,当前这里不是为了泄题漏题,以后吹牛逼,这个没有任何意义。目的是进行复盘,打磨自己的回答。这也是我为什么在面试大厂之前会先去小、中场先去试水以及写下这篇面经分享的原因。其实在前半个月我就已经面完了6个小、中场,也正是在中厂这环节的挫败,让我余下的一个多月都在做复盘、查漏补缺,为面试大厂做准备。

简历书写

强烈建议,把自己的强项,亮点加粗注明放在简历前面,大家都很忙,也很烦躁,让人一眼就看到优点,对双方都友好。因为我对Android性能优化方面感兴趣,平时工作也花了很多时间在这里,所以我会在简历上突出说明,我做了内存优化,熟练掌握使用xxx,内存性能提升xxx(因为这里的内容是可控的,如果面试官对你感兴趣,这里的回答你也是能提早准备好的)。

项目经历如何写?建议按照是什么,做了啥,有啥数据指标佐证的方式去写。比如,我做了xx项目,负责xx模块,使用了xxx框架,可配合xx做xxx,效率提高xxx%这样子。

以上仅为自己的个人经验,仅供参考,接下来给大家分享下我的字节三面技术面和腾讯三面的面试题分享(阿里一面就挂了,就不献丑了)。

字节一面

1.先聊简历。
2.聊性能优化方面的问题,我这边体系化展开讲卡顿,瘦身,内存,crash等方面的优化经验。
3.sychronized,volatile区别?
(这里可以体系化的回答,主要从JMM角度去回答,最后深入到字节码层面的区别。因为提到了修饰的范围有差别,就有了下一题。)
4.对于锁的对象的不同,效果会有什么差别。
5.讲一下Handler机制。
(这个问题问得太多了,一定要去看一回源码。重点答的是MessageQueue这块,包括什么时候空闲,阻塞。发散讲了线程相关的ThreadLocal,还有IdleHandler)
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,就回答CacheInterceptor,及其源码实现。)
8.SharedPreference的commit ,apply区别。
9.SharedPreference的其性能问题。
(apply的anr是有一个字段,会block住主线程,需要清理queuedWork队列。)
10.SharedPreference线程安全性,还有是否进程安全,SharedPreference锁的对象是谁?
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.算法题。

腾讯一面

1.mmap + native 日志优化?
2.广播和 EventBus 的区别?
3.常用设计模式你了解哪些?
4.跨进程通信有哪些?
5.简单讲讲 binder 驱动吧?
6.跨进程传递大内存数据如何做?
7.说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?
8.启动优化怎么优化?
9.你写的 rxpay 和 rxlogin 具体怎么实现的?
10.kotlin + fullter 方面的

腾讯二面

1.单例设计模式都写写,静态内部类是怎么保证线程安全的?
2.synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。
3.主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?
4.自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按时间分别是怎么实现的?
5.四种启动模式,在源码分析中的原理是怎样的?
6.讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?
7.开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?
8.RxJava 在使用过程中碰到了某些不友好的错误一般怎么解决?发现了内存泄露一般怎么解决分析,有没有9.碰到过系统服务内存泄露的问题?
10.你们用的 okhttp ?那你有没有做过一些网络优化呢?比如弱网环境。
11.给你个数 1 吧,比如 1000011 里面有几个 1 ?
12.快排了解不?最坏的情况是怎样?如果有大量重复数据怎么优化?

腾讯三面

1.讲讲 handler 的底层实现原理?
2.说说你做的日志记录优化?
3.你看过 binder 驱动的源码,说说他的内存映射过程,说说客户端等待服务端处理返回的流程,如果要跨进程传递大内存数据你具体会怎么做?简单写一写吧。
4.在公司做过哪些优化?
5.开发过程中遇到的一些最难解决的问题?
6.提到了动态修复替换加载 so ,那你知道怎么修复 class 吗?怎么修复资源呢?
7.还有什么要问我的?

最后

写下这篇文章一是分享自己入职大厂的喜悦,真正意义上靠着自己的努力完成了人生的第一个“梦”。二是为这个过程做一个复盘和记录,以此激励自己“更上一层楼”。我觉得这样的一次经历,一次“追梦”的经历,给了我相信自己的勇气,我不知道要是这次的“跳槽”要是没有拿到大厂offer会怎么样?但我庆幸迈出了这一步,将这一变成了“已知数”,而只是心中的喃喃自语“我应该做不到”。

我想我可能是幸运的,同时未来也还有很长一段路要走,毕竟996的福报也是要拿“命”来换的(最近猝死新闻太多,不禁寒颤,各位朋友保重身体)。另外最后的最后,我觉得这次经历中最为重要,最具有分享意义的一个阶段,就是中厂的面经的挫败,从而复盘、查漏补缺的一个过程。我将2个月期间所有面试真题做了归纳整理并收集资料做了参考解析,还包括一些学习笔记分享,做成了一个复习手册。如果有需要的朋友,整理不易,请随手点赞+任意评论后,点击此处自取!

Android复习手册目录截图

Android中高级面试题部分内容截图

整理不易,随手点赞+任意评论后,点击这里此处自取哦

最后请收下我这迟来的新年祝福,祝大家在新的一年里都能拿到自己理想的offer,身体倍儿棒!万事如意,心想事成!

推荐阅读更多精彩内容