失业后,4天面试了5家企业后终获心仪Offer,想把这些Android面试积累分享给你们

废话不多说,直接上干货:

基础

不管是Android基础还是Java基础以及常见的数据结构,这些是无原则地必须要熟练掌握的,尤其是非计算机专业的同学,面试官一上来肯定是问你基础,要是基础表现不好很容易被扣上基础不扎实的帽子,常见的就那些,只要你平时认真思考过基本上面试是没太大问题的。

算法

基本上每家企业都会有算法题,我当时是看了左程云的《程序员代码面试指南》,重点看了数组跟链表,二叉树没有去刷算法题,对于二叉树的掌握在于三种基本的遍历以及在排序算法中堆排序中用到的二叉堆,然后每道算法题都先自己去实现,先写思路,然后自己去实现一遍,然后再看看答案,记住答案的思路,第二天再重新按照答案的思路实现一遍,这种效果非常好,我没有去刷很多题目,而是想通过这种方式去分析常见的算法题,所以我不大建议去刷算法题,首先作为客户端开发,涉及不到很多的算法,第二,面试的时候考的算法大部分都是很基本的数组组跟链表构成的,最后算法这个东西是个无底洞,个人觉得没必要去刷题,刷题可能对小企业有用,但是大企业更看重你解决问题的能力。

虚拟机

JVM

对于Java,加载的是Class文件,一般会问到Java运行时的内存分配,类加载机制以及GC,实际上后面两个问地比较多,尤其是GC相关,往往结合四种引用出题,最后会通过这个来引出内存泄露相关的一些问题。

DVM&ART

Android的虚拟就DVM以及ART是对JVM做了一些优化,加载的是dex文件,对Class字节码做了一些优化,这个里面其实挺复杂的,我只知道一些基本的概念。

ClassLoader

这个其实要是问起来其实是有很多东西的,如果是Java相关其实还好,会问你类加载机制,但是Android里面除了Java的类加载机制之外,还会引出插件化跟热修复。

JNI

基本上稍微大点的企业都会问到,不过我的回答始终如一:我只能看懂C的代码,项目中没有用过JNI,当然这个属于加分项,因为我当时的选择是把我用过熟悉的东西研究地滚瓜烂熟,而不是在自己平时很少接触到的东西上面搞个一知半解。

Binder

Binder系列,各种AMS,WMS,PWS,常问到的有APP的启动流程,然后两个Activity相互跳转的时候的生命周期,Activity的生命周期。

心态

不要想着什么都会,那样不现实,比如说我对Binder机制以及热修复,插件化这块儿确实了解地比较浅显,也跟高德,爱奇艺等企业的面试官聊过这个话题,这些属于加分项,不会影响到最终的面试结果,还有就是算法,面试最多考一道或者两道算法,所以没必要在这方面花太多的时间,掌握好常见的数组跟链表,二叉树/堆了解一下,基本就够了,企业看重的是你解决问题的能力,你把原理掌握好,常见地基本上都没什么问题。

当你基础常识OK,自己用过的东西的理解地有深度,解决问题的能力OK,如果面试官想要你,那么他会去找你的优点,反之他会去找你的缺点。所以如果你想进某家企业,那么你就按照他们的要求去面,就算面不上那么也没什么,只能说不合适,然后查漏补缺继续面,不要因为某一次或者几次的不顺就否定自己,有些企业的面试官就是喜欢装,而且还是大企业的。

学历很重要,我的学校只是个普通一本,相对一般,所以投了很多知名互联网企业简历都过不了,就连好大夫在邀请我面试的时候特意问了我是不是统招一本,任何行业都看重学历,不仅仅是IT,那些说学历不重要的基本上都是一些学历比较好的或者是在Android比较火地那个阶段开始搞地Android,他们这批人往往会觉得在03年跟18年加入的阿里的难度是一样的,那些觉得学历不重要的可以去看看张雪峰老在《演说家》中的演讲,不要说什么3年以后企业就不看学历了,学历是一辈子的事情,那些高考能够碾压你的人,出了社会只要他们愿意,照样能碾压你,你努力,你拼命,别人也不会睡大觉等你。

科班很重要,如果你本科学地是非计算机专业,任何一个面试官或者HR都会认为你基础不行,你需要花很多的时间去精力去补基础,然后再花时间跟精力在HR不Pass掉你简历的情况下摘掉基础不行这顶帽子。

工作背景很重要,如果你有大企业背景给你背书,相同的岗位,你进入的门槛比有大企业背景的人要高地多,如果你有大企业背景,不管是面试官还是HR都会在你面试前给你打一个较高的基本分,这个是很有利于你通过面试的。

不过上面都是既定的事实,你没法改变,所以当我意识到这些问题的时候,我只能去不断地提升自己的能力,去花更多地代价去获得一个面试机会,去证明自己的能力进而进入到一个比较好的平台。

面试企业

企业一(Offer)

面试机会来自于V2EX

一面:

  • 如何开启多进程?应用是否可以开启N个进程?
  • Activity的启动模式、任务栈以及使用场景?
  • Volley能否进行数据量很大的请求,比如说加载100M的图片?
  • 手写快速排序
  • Volley的优缺点
  • final修饰一个对象,能否调用对象修改属性的方法
  • 子线程中如何使用Handler
  • 如何进行单元测试,如何保证APP稳定。

二面:

  • TabLayout如何设置指示器的宽度包裹内容?
  • 公差为1的等差数列求和,如何优化
  • 自己的优势在哪里
  • 注解如何获取,反射为何耗性能?
  • Java的GC机制,分代回收策略
  • Binder机制:ServiceManager什么时候注册的?
  • int,long的取值范围以及BigDecimal,数值越界了如何处理?
  • ConcurrentHashMap的原理,分的段数是多少?
  • APP是如何适配的?
  • Android中如何查看一个对象的回收情况?
  • 最大一次线上Bug处理措施

三面:

  • APK的大小如何压缩
  • APP的崩溃率,多渠道包
  • 自己做过的APP用户量
  • 能否接受加班

企业二(Offer)

面试机会来自于拉勾网

一面:

  • MVP如何管理Presenter的生命周期,何时取消网络请求
  • 用过的框架及原理
  • 天猫的Tangram布局,vLayout原理

二面:

  • APP的启动流程
  • 回形打印二维数组
  • Java为何引入泛型,泛型边界
  • 常见的Java数据结构
  • ArrayMap跟SparseArray在HashMap上面的改进
  • Java的四种引用及使用场景
  • Webview性能优化

企业三(Over)

面试机会来自于Android Weekly

一面:

  • Binder机制
  • ClassLoader的理解
  • Arouter的原理
  • 组件化原理,组件化中路由的实现
  • 热修复跟插件化的原理
  • 线程池的几个参数的理解,四种线程池的使用场景
  • 常用的设计模式,手写DCL单例模式
  • 进程间为什么不能直接进行通信
  • 应用跟系统之间通信什么时候用Socket什么时候用Binder

二面:

面试官是做IOS的,基本上是处于聊天的状态,反正聊地很开心的,然后对我评价很好,他说他不懂Android,但是能感受到我的技术好奇心,听了还是很开心的,反正基本上没怎么聊具体的技术,主要是聊了聊IOS的Hook以及热修复相关的技术,问他们是怎么实现的,因为我知道IOS在这个上面比Android要复杂一些,反正整体就是很放松。

三面:

三面是产品总监,基本上就是谈古论今了,让我说说对Android以及IOS的看法,我说GOOGLE未来肯定会在人工智能上干掉IOS,然后他说为什么,我说因为GOOGLE掌握了搜索的大数据,Android产品接入的成本低等等,然后我跟他说我希翼产品在设计原型的时候需要考虑一下Android跟IOS两个平台的差异,不能一刀切,他说是应该这样,但是有很多时候需要保持平台一致性就需要做一些妥协之类,最后其实还聊到了锤子,聊了聊对老罗以及锤子的看法,产品总监说锤子的发布会每场他都会看,然后他还给他家人买了一部坚果Pro,反正想着肯定会挂掉,索性就不那么拘束了,就是一种很放松的状态。

四面:

四面是CTO面,当时有点紧张,CTO很有绅士风度,一上来主动跟我握手,当时我有些紧张,手心都出汗了,他说我是不是很热,我说是的。然后说自己从网易出来之后就开始创业了,一直是在做提高企业生产效率相关的产品,现在做的GrowingIO也是的,然后问了我很多问题,主要是我在上一份工作中的成长跟收货,未来的规划等等,以及在项目中遇到问题是如何进行团队协作的,问地很细,可以看地出来企业对这款产品非常重视,像滴滴企业版,陌陌等都是他们的客户,感觉这家企业会发展很不错,最后我也问他为什么会尝试做那么多产品而不是专注于某一款产品等等,然后他也给了详细的解答。

没有给我Offer的原因在于我的薪资可能开地过高,一面基本上是处于被淘汰的局面,但是我跟后面的面试官都聊地很好,晚上还在那儿吃了顿饭,最后CTO还跟我聊了很久,我觉得他们应该是觉得我可以培养,但是薪资要低偏高,所以就最终放弃了我,因为对于创业企业,我的薪资都开地高一些,不管结果怎么样,还是挺感谢这家企业的,希翼他们发展地越来越好。

企业四(Offer)

面试机会来自于拉勾网

一面:

  • Debug跟Release的APK的区别
  • 软引用跟弱引用的区别
  • ConcurrentHashmap的原理
  • Listview跟Recyclerview的区别(刷新,缓存,各自的使用场景)
  • 对GOOGLE新推出的Room架构
  • 动画的两种实现:setX跟setTranslationX区别
  • 事件分发:Activity跟window依次到viewgroup
  • Volley源码,优缺点
  • Picasso传入的Activity跟Application的context的区别

二面:

  • 数据库的升级,表结构的修改
  • 常见的排序算法,手写二分查找,二分查找的复杂度分析
  • 点击APP图标启动APP的大致流程
  • SplashActivity中进行初始化MainActivity的参数,Splash没有初始化,AMS直接启动了MainActivity怎么办
  • 设计一个多线程,可以同时读,读的时候不能写,写的时候不能读(读写锁)
  • 设计断点续传,如何判断服务端是否支撑断点续传
  • Binder机制:Binder内核所在的进程是如何找到到Server跟Client进行通信的
  • 对JNI是否了解
  • 组件化的原理,组件间通信

企业五:(Over)

面试机会来自于拉勾

一面:

  • StringBuffer跟StringBuilder之间的区别
  • 并发相关,各种锁
  • View的绘制流程,事件分发
  • Hashmap,Arraymap,SparseArray
  • 四种引用
  • MVP跟MVC的区别
  • LV跟RV之间的区别
  • Service相关,startService以及bindService
  • Fragment不同于Activity的生命周期
  • 生产者消费者问题:一对多,多对多情况
  • 常见的设计模式,并选择一种描述一下
  • Scroller的使用

二面:

  • Gradle生命周期
  • Java&Android关于Classloader源码解析
  • Python的class文件
  • DCL中Volatile的作用,如何防止反射实例化单例对象
  • 抽象类能否实例化,理论依据是什么?
  • 如何通过Gradle配置差异较大(20%差异)的多渠道包
  • class文件如何转化成dex
  • Service先start再bind如何关闭service,为什么bindService可以跟Activity生命周期联动?
  • JVM相关,DVM以及ART是如何进行优化的,具体步骤
  • 长连接常见的库,短链接
  • 静态同步锁与普通同步锁的区别
  • 直接在Activity中创建一个thread跟在service中创建一个thread之间恩区别

面试之外

上面说地都是一些硬实力,经过这一次的被动面试经历,下面简单说些自己在面试过程中总结的一些面试之外需要注意的东西:

一定不要裸辞

如果是裸辞找工作,HR 一般都会问什么时候离职的。如果手里没有 Offer,就很被动了,很有可能被压薪资。主动权一定要掌握在自己手中。

选择大于努力

即使很努力如果方向错了就是浪费时间,就像我选择了小程序就是个错误(大前端坑太多,入坑需谨慎)。我的建议是多深入研究一些以不变应万变的技能。

学历与履历

虽然说能力很重要,但学历是敲门砖(HR 就看这个)。如果连面试机会都没有,还怎么谈然后?如果学历不突出有很好的大厂履历也很不错,貌似是个蛋生鸡,鸡生蛋的问题。

充分准备

一些基础常识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,我能明显感觉到国庆后多了很多高级职位,所以努力让自己成为高级工程师才是最重要的。

好了,希翼对大家有所帮助。

最后在这里放上相关的我搜集整理的24套Tencent、字节跳动、阿里、百度2019-2020面试真题解析,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含常识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】点击:Android架构视频+BAT面试专题PDF+学习笔记即可获取!查看免费领取方式!

最后祝大家面试加油!