Android面试大揭秘!从技术面被“虐”到征服CTO,全凭这份强到离谱的PDF

438 阅读13分钟

在笔者面试这一个月,看了不少文章,也刷了不少面试题,但真正有深度,适合4年及以上Android高工的内容少之又少

在面试准备阶段,笔者准备了三个月左右的时间,结合相关资料及源码,完成了一系列的深度学习和输出

  • 在系统源码层面,包括系统启动,应用启动,四大组件相关,插件化等;
  • 在并发方面,完成了ConcurrentHashmap,CopyOnWriteArrayList, CountDownLatch等相关源码剖析,及线程协作相关内容输出
  • 在插件化方面,完成了插件化整体方案的总结和输出,及VirtualApk核心源码分析; 具体内容请**点这里查看**。

面试准备技巧

如果说面试准备有什么技巧的话,笔者的经验是,深度为主,广度为辅

如何提升知识的深度?

针对高开面试来讲,哪怕是最简单的问题(比如老生常谈的Handler)也会有超乎寻常的深度问法,而所谓的深度, 即对系统源码的理解程度。因此,对源码的研读是十分重要的

我的学习方法论是,输入 + 输出,如果没有输出,第一是会忘,第二是没有办法内化为自己的知识。可能大家都会去看技术文章,但看过两天后,你还会对那些内容印象深刻吗?大多数情况是不会

因此,不论是自己整理笔记也好,还是写文章分享也罢,输出是很必要的,跟别人交流的过程,也是不断内化和成长的过程

在高工面试中,一般会着重考察面试者对技术问题里理解的深度,我的建议是,在几个点上进行深度学习,比如系统源码,插件化等等

在编写简历时,可以将这些内容放在显眼的位置,暗示面试官这是我的强项,一定记得问我!

如何提升知识的广度?

就广度上来讲,其实主要看平时的积累,但是面试的复习也必不可少

内容上来说,包括性能优化, 多线程并发, JVM虚拟机相关, 算法问题 , 设计模式 ,网络相关知识,等等;

拿性能优化来讲,从整体方案上来说,有一些比较成熟的开源库可以参考,比如腾讯的Matrix, 滴滴的Booster;相关内容点击这里查看

针对具体的优化细节,就涉及到相关的开源库及相关原理,可参考的三方库有:

  • LeakCanary ,内存泄漏监测
  • BlockCanary,UI卡顿监测
  • Glide,对Bitmap内存的优化及防止内存泄漏
  • Jetpack , 官方支持库 ,避免内存泄漏
  • AspectJ , AOP切面编程

不同的岗位方向关注的侧重点也会有些不同,我们在后面的分享中也会涉及到。

在大厂的面试中,也有一些面试官(尤其是一面的时候)会拿一些常见的面试题来进行考察,比如UI绘制 , 自定义view ,触摸事件分发 等高频考点也应该着重复习和掌握。

因此,如果没有面试准备方向,找一份面试题集锦来进行热身复习也可以。

笔者在面试期间我整理了一份面试题,在此也贴出来供大家参考,如有需要全套面试题,点击我就可以了。

如何准备简历?

在跟猎聘网HR聊天的过程中,谈到了他们的简历修改付费项目。其实写简历并不难,难的是如何写出一份适合自己,能突出自身优势的高质量的简历。

这里笔者默认大家已经做完了面试的前期准备工作,而现在我们需要做的,就是把前期准备的比较充分的,有深度有技术含量的点放在我们的简历中。

高效利用简历的黄金区

我们在准备简历的时候要去换位思考,HR(或者招聘部门)是如何审阅一份简历的。

所谓的黄金区,即简历第一页的起始部分,以笔者的经验,一般会用来放个人简介(包括教育背景,个人自述等)及核心技术要点。

我们来看一份样例

赵xx | Android工程师

年龄:xxx | 经验:x年 | 博客:xxxx

电话 / 微信:xxx | 邮箱:xxx

教育背景:xxx(20xx/9--20xx/6)

专业背景:xxx

个人简介

20xx年至今,从事Android开发x年有余,经历过xxx开发,xxx开发,xxx项目研发,xxx方案调研及实现,xxx定制化Android设备应用研发;

积累了一定的项目经验和技术实力,有较强的技术攻关能力和学习能力,对xxx有一定的研究,针对xxx,xxx,xxx相关源码进行过深入的研究和学习

简历的核心关注点

针对HR来讲,最关心的点有以下几个

  • 专业是否符合要求
  • 学历是否符合要求
  • 工作年限是否符合要求(针对高开,专家,资深分别有一定的年限限制)
  • 年龄是否符合

针对招聘部门来讲,最关心的点如下

  • 过往项目是否匹配
  • 是否对本部门的项目感兴趣
  • 是否具备一定深度的领域研究和学习能力

因此,在黄金区把这些关注点描述清楚,就是我们的一个目标了。

在上面的Sample中,笔者将年龄,工作年限,教育背景,专业背景都放在了最显眼的位置,就是为了让HR能一眼看到需要了解的信息。

在个人简介中,笔者简单介绍了工作经历,项目经历,以及自身的深入研究领域,这里是为了给用人部门审核时,大致判断是否符合用人部门的需求。

这里要注意的是,突出自己的优势,扬长避短,没有价值(或者简历审核方不关心,或者是自身劣势)的内容尽量不要放在这个区域。

专业技能点

当HR(或用人部门)初步判断该应聘者基本符合要求时,就会去看专业技能点及项目经验了。

针对面试者来说,在面试的过程中,面试官会着重考察简历上的专业技能点,我们在写技能点时,一般会使用了解,熟悉, 精通这样的词语来进行描述。

而在笔者看来,即使对某方面非常精通,也需要用一些较为圆滑的描述来表达,比如针对xxx有较为深刻的理解,针对xxx有自己的理解,针对xxx有一定的实践和独到见解,来避免面试官问的深度过深。

技能点写什么?

具体的技能点到底写什么,大的方向来讲笔者建议分为两大部分 -- Java和Android(如果有native开发经验根据情况编写),具体细节来讲,需要根据前期准备的程度进行填写。

针对高开来讲,所谓的Java基础,已经远不是基础,而是涉及到JVM内存区域,JMM内存模型,多线程并发,封装继承多态及Jvm是何如实现的,为什么要这么实现等等。

而Android基础,也尽量要深挖一些,比如涉及到四大组件,比较常问的一个问题是Activity是如何启动的(或者应用是如何启动的)。

这个问题可深入考察的点非常多:

  • 考察对源码的理解程度
  • AMS是如何跟Zygote通信fork出进程的
  • AMS是如何跟应用层通信的
  • ActivityThread是如何被启动的
  • ActivityThread到底是用来做什么的
  • 主线程Looper如何初始化的
  • AMS是如何绑定ActivityThread的binder对象的
  • binder是如何初始化的,如何完成跨进程调用的,如何跨进程传递数据及传递数据有什么限制等

更多详细内容请点击:面试必备:Android Activity启动流程源码分析

这也是为什么建议大家在准备阶段以深度为主进行准备的原因,如果看过相关系统源码,相信这些问题都可以轻松应对。

针对专业技能点,笔者不可能一一涵盖,这里给出一些技能点,大家可以根据自己的情况进行选择。

Java相关

  • 容器(HashMap、HashSet、LinkedList、ArrayList、数组等)
  • 内存模型
  • 垃圾回收算法(JVM)
  • 垃圾回收机制和调用 System.gc()的区别?
  • 类加载过程(需要多看看,重在理解,对于热修复和插件化比较重要)
  • 反射
  • 多线程和线程池
  • 设计模式(六大基本原则、项目中常用的设计模式、手写单例等)
  • Java 四大引用
  • Java 的泛型
  • final、finally、finalize 的区别
  • 接口、抽象类的区别

Android

  • 自定义 View
  • 事件拦截分发
  • 解决过的一些性能问题,在项目中的实际运用
  • 性能优化工具
  • 性能优化 (讲讲你自己项目中做过的性能优化)
  • Http[s]请求慢的解决办法(DNS、携带数据、直接访问 IP)
  • 缓存自己如何实现(LRUCache 原理)
  • 图形图像相关:OpenGL ES 管线流程、EGL 的认识、Shader 相关
  • SurfaceView、TextureView、GLSurfaceView 区别及使用场景
  • 动画、差值器、估值器(Android中的View动画和属性动画 - 简书、Android 动画 介绍与使用)
  • MVC、MVP、MVVM
  • Handler、ThreadLocal、AsyncTask、IntentService 原理及应用
  • Gradle(Groovy 语法、Gradle 插件开发基础)
  • 热修复、插件化
  • 组件化架构思路
  • 系统打包流程
  • Android 有哪些存储数据的方式。
  • SharedPrefrence 源码和问题点;
  • sqlite 相关
  • AMS 、PMS
  • Activity 启动流程,App 启动流程
  • Binder 机制(IPC、AIDL 的使用)

以上内容均放在了开源项目【GitHub】,免费分享,有需要的朋友自取。

如何应对面试?

前面我们聊了如何准备面试和投递简历,下面我们从面试本身出发,介绍面试中有哪些应对技巧。

对技术面试来说,可能有的人并不会注重所谓的技巧;笔者在这里说的技巧,并不是什么奇技淫巧,而是在前面的准备部分都已经比较完备的情况下,如何在面试中更好的体现自己的技术实力。

如何更好的跟面试官沟通?

一般而言,大公司的一面二面会在线上进行面试,尤其是现在疫情的情况,可能我们更多的面对的是线上面试。

下面我将从线上和线下两个角度来讲一些面试技巧。

线上面试

线上面试的过程中,可能出现各种各样的问题,比如网络不稳定,与面试官沟通不顺畅等等。

针对线上,我们应该做好以下准备:

  • 准备好水 线上面试一般会持续1-3个小时(一面加二面),因此准备好饮用水是非常重要的,试想不喝一滴水,口如悬河讲2个小时是什么感受!
  • 尽量争取线下面试 线上面试有各种的不便,为了更好的表现出自己的技术能力,可以尽量跟HR/面试官约线下面试。
  • 提前与面试官沟通 不同的面试官面试风格迥异,有的偏好打断面试者,有的偏好听面试者讲完再提问。在线上面试这种环境下,更加剧的沟通的不便,因此我们应该提前跟面试官沟通,更顺畅的完成面试过程;笔者在面试前会先告诉面试官,如果我有哪些地方没有讲清楚,请打断我向我提问。
  • 提前调试好网络,进入面试间 笔者在线上面试时,都会提前半小时进入面试间等待面试官,一来让自己以一个更好的状态来应对面试,二来可以提前进行网络的测试。
  • 网络质量差时,改为语音面试 网络质量差有可能是面试官的原因,也有可能是面试者的原因,这个是不可控的;在实在无法解决网络质量差的问题时,可以切换为仅使用语音面试。

线下面试

现场面试基本上解决了以上的各种问题,因此在能约现场面试时,一定要优先考虑现场面试。

线下面试也要注意一些细节问题:

  • 提前到面试现场 一来我们可以有更多的缓冲时间来应对路上的异常情况 二来到面试现场后,可以调整下自己的状态,看看技术文章,或者自己的面试总结。
  • 提前10分钟与HR/面试官联系 尽管我们提前到了面试现场,也不要过早进去面试,一般大公司都需要预约会议室进行面试,面试官在预约的时间外也会有自己的其他工作要做。

如何引导面试官提问?

引导面试官提问,一是在简历上做文章,把自己准备的比较有深度的内容放在显眼的位置,加上对xxx有深入理解等描述词;二是在回答面试官的其他技术问题时,尽量多提及一些相关的,自己准备的比较好的内容。

如何应对不了解/不会的问题?

我们在前面准备了很多有技术深度的技能点,比如插件化,多线程,多进程,Android系统源码等等,但面试中我们遇到的问题是千奇百怪的,因为不同岗位有不同的要求。

就拿Android系统源码来讲,源码之多之复杂,决定了我们只能找某几个方向与应用关联比较密切的额方向去进行研究,比如四大组件,应用启动等;但在笔者面试一家做安全的公司时,面试官看我在简历上写了对Android系统源码有一定深度的研究,说那你讲一下Android系统中应用的安装流程吧。

这方面的问题笔者完全没有准备,也没看过这方面的源码,针对这种情况,有两种应答思路:

  • 在问题的基础上进行思维拓展回答 这里主要是看这个问题的类型,如果考察代码的理解能力和设计能力,可以做拓展性的回答
  • 坦言这一块了解的比较少 如果是考察比较固定的技术点,没有拓展空间的话,可以告诉面试官自己在哪些地方进行了深度的学习,引导面试官进行提问

最后

如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。

如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。