Android 面经总结分享(相当走心)

背景描述

这是来自一位粉丝朋友的面经分享,他在 「Android 开发行业」 摸爬滚打5年多的开发,呆过的互联网公司有三家,均从事的Android 开发的工作。最后离职的一家公司也是做的最久的一家,工作了将近3年多时光。

废话不多说了,直接进入主题。👇👇👇

至于离职原因?

其实这个问题一直都不是一个单一性的问题,它是一多元化多维度的问题。对我来说主要是体现在以下几个方面:

  1. 当前所使用的技术对自身成长不是很大;
  2. 当前负责的项目发展空间到达了一定的瓶颈;
  3. 认为自己的职场履历需要有一段大厂经历;(相信每个程序员都想这样在履历上添加这么一笔)
  4. 那就是组织架构频繁变动,导致业务线频繁变更,这一点对业务很不利,需要一直磨合。

面试目标顺序

当时我的面试大厂目标并不是单一的,大家看下图就知道了:

「因为这次面的都是大厂,所以面试的准备周期有点长,准备了2个多月的时间,进行复习学习、刷题等操作。」

面试思路

面试是一个漫长的过程,这个过程不单纯只是面试这么简单,它也是一个 「自我考察」 的过程,在这个过程中也是 「讲究方式方法」 。下面我从 「自我考察和方式方法」 两个方面来进行简单的阐述。

自我考察

技术实力是面试的大前提,你需要非常清晰的了解自己,了解自己所要面试岗位,这是决定面试是否成功的先决条件。

比如我工作时间4年多,我要面试的岗位是高级Android工程师,那我这个自身素质是否能满足面试岗位所要求的条件?

其实这一点在我刚刚面试的时候也是拿不准的,因为在公司已经3年,这段时间对外界的发展其实是不了解的,所以我做了以下几件事:

  1. 把自己负责的项目业务进行整体总结。
  2. 把项目中用到的所有技术进行整体总结。
  3. 复习常用 框架/系统 源码,比如Glide,Okhttp,Reteofit,Activity启动流程,Hander,HashMap,锁等等常用的源码原理。
  4. 查看BOSS,拉勾对应岗位所要求的技能。

方式方法

面试环节中即便你技术很好,项目经验很丰富,你也不乏有知识盲区,也有未能顾及的技术点,当这些点集中出现的时候你面试的成功率也会大大降低。所以针对面试我总结了以下几个流程:

「1.面试分为3个阶段(初期,中期,高offer期)。」

「初期」: 主要通过(BOSS,拉勾投递即可),初期主要投递小公司,这部分公司有两个目的。第一是相互交流技术点,不断完善自己的技术覆盖度。第二是了解当前市场的需求点。
「中期」: 主要通过猎头去投递,这个阶段主要投递中场,这类公司要求技术深度会比初期公司要深一些,算法的考察会加重,同时面试官的技术水平也会偏高一些,甚至有的中场面试难度会达到大场的水平,这个中期尽可能的持续长一些,非常有利于后续的面试经验总结。
「高offer期」: 这个阶段主要投递你的目标企业,切记面试优先级从最不意向的公司开始投递。投递的方式也是通过猎头,这样可以加快面试流程。以上的初中期更多的是完善你的技术覆盖度,以及你的面试感。为了是让你以最好的姿态去挑战你最想去的企业,这样一路走来你面试的成功率会大大提高。

**「2.沟通能力」**面试除了考察你的技术实力以外,还有一点是比较重要的,那就是沟通能力,你面试的岗位越高,对你沟通能力的要求也就越高。

沟通是特别重要的一个点,这决定你是否能非常清晰的把你所知所想完整的阐述出来。

我们面试的过程就是自我营销的一个过程,所以当你觉得自己沟通能力不是很强的时候,那么你就需要定向的去总结几个点:

比如一个出色的自我介绍, 项目中遇到的最难解决的一个问题,如果让你设计一个架构你应该怎么设计,简单的介绍一下你负责的业务 等...

**「3.面试频率」**面试周期我建议15-30天。

「初期」:小公司,我建议一天面试3个,如果有精力的话可以4个,这里需要注意一点,小公司有很多不靠谱的,比如还用Eclipse的,比如上来还没问技术就先打击你的,这种可以找机会离开,不要浪费时间。面试时长建议控制在60分钟以内,不要太抠细节。有条件的可以打开录音器,方便结束后晚上复盘。你复盘3-4天的时候你会发现面试内容开始大批量重复了。
「中期」:这个时期我建议一天最多2个公司,因为中场一般都是3轮或者以上的面试,有一部分是一路走完的。所以你需要给二面三面留出时间以方便充分沟通。千万不要一面完就打算走,因为一二三面所考察的完全不同,一面主要是基础,二面主要是框架/源码/简历里的技术,三面一般会聊项目,方案或者思路。
「高offer期」: 这个环节需要你按实际情况伺机而动,因为有的大厂是一条龙面完,有的是每一次面试都单独约,但是大厂一般的流程都比较慢,都在1周以上才能完成整场面试。一般都在4-6面之间。但是建议一天最多安排2场面试,这个面试时长不确定性因素会比较多。如果面试官不是很讨厌你,一般都会在60分钟以上。

面试的基本流程

我先后面试了差不多20几家公司,最后到手的OFFER有8个左右,最后选择的是自己想去的 「阿里」,面试内容我下面会简单总结一些,共分为两部分。一个是面试中出现的频率比较高的问题,二就是面试的这些公司的一些体验分享。

面试高频问题区:

  • HashMap 1.7,1.8的差异,1.8中什么情况下转换为红黑树,构造函数中参数代表的意思
  • 用什么Map可以保证线程安全,为什么?ConcurrentHashMap为什么能保证线程安全?1.7和1.8原理有什么差异。
  • 有多少种单例模式,枚举算不算单例,单例模式中不用volatile会导致什么问题?volatile特性是什么?为什么android中不推荐使用枚举。
  • 进程优先级
  • 反向输出字符串
  • 两个有序链表合并
  • 字符串移除多余空格,且技术单词首字符大写。
  • 二叉树中和为某一值的路径
  • 本地广播和正常广播的区别
  • 二进制低位转高位
  • 字符串数组判重
  • 二叉树 判断是否为搜索二叉树
  • Activity启动流程,Launcher启动流程
  • Glide中怎么实现图片的加载进度条,Glide的缓存是怎么设计的?为什么要用弱引用。
  • implementation 和 api的区别是什么?
  • 事件分发的流程,以及怎么解决滑动冲突?
  • 事件是怎么产生的?mFirstTarget 为什么是一个链表?
  • 自定义View需要经历哪几个过程?
  • A 跳转到 B页面,两个页面的生命周期怎么走?什么情况下A的stop()不会执行。
  • Activity 的4中启动模式分别是什么,有什么不同。
  • okhttp中有几个队列?分别干什么用的?怎么取消一个请求?
  • Rxjava中map和flatMap有什么区别,都用过什么操作符。
  • 如果Rxjava组合发送任务,中间任务出现异常,其他任务该怎么处理。
  • 哪个场景会发生内存泄露,内存泄露怎么检测,怎么解决。以及leak cannery内部原理是什么?为什么新版本的不需要在Application中注册了。
  • 手机适配问题怎么处理,都有什么方案。
  • Android9 10 11 都更新了什么新特性,新版本中无法获取IMEI怎么处理。
  • 数据序列话有那俩种方式,Serialization和Parcelable区别,如果持久化需要用哪一个
  • 组件化怎么分层,各个组件之间怎么通信。
  • 怎防止程序崩溃,如果已经到了Thread.UncaughtExceptionHandler是否可以让程序继续运行。
  • Handler Looper mesaageQueue message 之间的关系。
  • 子线程一定不能更新ui么?什么时候可以?什么时候不可以。检测逻辑是在什么阶段初始化的。
  • ANR发生的原理是什么, 怎么排查。
  • 说下路由ARoute的实现原理,怎么处理页面过多内存占用过大问题。
  • 线程池都什么时候用,怎么创建,构造函数中的参数分别代表什么意思?

公司面试体验分享

「拟合未来」
  • 这公司面试体验很好,一共三轮面试,技术面二面,HR一面。
  • 「一面:」 自定义view、Handler机制、组件化和插件化、HashMap的源码、retrofit和okhttp的源码用到了哪些设计模式、NDK静态库和动态库编译流程、openGL渲染模式、Android中的动画有哪些它们之间的区别、谈谈mvvm。
  • 「二面:」 讲之前做的项目负责哪块,根据业务采用什么架构、使用过哪些设计模式,项目中遇到哪些棘手的问题,如何解决的。
  • 「三面:」 HR整体问下以前公司的情况等问题
  • 总体下来基本面试官都是根据简历来问的。体验心得就是要对自己以前做的项目也好好梳理,提前组织好语言,挖掘项目闪光点。
「百度」
  • 这里主要负责的业务是手机百度开发,总共面试了三次。
  • 「一面内容:」
  1. java引用,以及引用队列,以及使用场景;
  2. 拆装箱
  3. LeakCanary
  4. map
  5. 线上性能监控
  6. SharedPrefrence 遇到的问题
  7. 手写算法
  • 「二面内容:」
  1. Handler
  2. 进程间通信
  3. 序列化
  4. 动画,
  5. native崩溃捕获原理
  6. 结合项目提问
  7. Recyclerview的点击事件原理
  8. 启动一个空的apk,回启动几个线程
  9. 手写算法
  • 「三面内容:」
  1. 跳槽原因
  2. 原来公司规模
  3. 预期薪资
  4. 个人优势
  • 「个人体验心得:」
  1. 简历上写的一定要了解,并且知道原理
  2. 多熟悉项目,找出一些能聊得功能点
  3. 崩溃捕获,以及解决(java ,native)
  4. 优化需要知道(大厂都会问)
  5. 了解由点到面,需要把知识连贯起来
「中软国际」
  • 岗位业务荣耀手机内置APP-主要负责推送,一共两面
  • 「一面:」 问的项目中哪些用到了hook技术,是怎么实现的,Okhttp底层原理,点击应用图标的启动流程,hashmap在java7和java8的区别,为什么要引入红黑树
  • 「二面:」 项目是怎么搭建的,用到了哪些技术点,arouter用到了什么技术点,是用来解决什么问题,socket底层原理,是如何带领团队的,一个功能是如何从分析需求到落地的
  • 「个人体验心得:」 尽量围绕简历上的点来刷面试题,不一定都要研究透彻,被问到自己不熟的点,可以尽量尝试着往自己熟悉点带,例如之前我被问到pms是怎么管理package信息的,我就说目前我对pms了解不深,主要也是研究了ams,然后就把自己了解的说一下就好了。
「杭州红花朵朵(总共三面)」
  • 「一面:」 Fragment和Activity生命周期联动,及Fragment显示与隐藏的一些方法,Handler原理, View绘制流程,事件分发,APP从安装到启动都做了什么,设计模式相关。
  • 「二面:」 线程都有那些状态,线程锁相关的东西,对称与非对称加密,HTTPS请求过程,数组,链表,红黑树二叉树等一些数据结构相关的东西,还有一些开放性的问题
  • 「HR面:」 自由回答
  • 「个人体验:」 基础最重要,不仅要会用,还要知道其中的原理。
「京东到家(总共三面)」
  • 「一面:」 线程,进程,消息,通信,handler,okhttp
  • 「二面:」 事件分发,java一些基础,算法
  • 「三面:」 聊项目
  • 「体验:」 除了技术,沟通,理解能力要好
「apus(总共三面)」
  • 「一面:」 问了java基础,java synchronized和volatile 关键字的作用,问了hashMap数组大小为什么是2的次方,如果经过一次扩容,元素下标会变吗,sharedPreference commit与apply的区别,还有apply为什么会造成anr,view的绘制流程,如何检测应用帧率,gradle的一些知识(没答出来,具体问题忘了)
  • 「二面:」 可能是看我对view的绘制流程比较了解 就主要问了这一块的内容,测量、布局、绘制,然后拿出了一个效果,问我怎么实现
  • 「HR面:」 公司是北京和郑州这边协同办公,经常要和那边协作,如果出了问题,如何解决
  • 「个人感受:」 基础要熟悉,如果一面有哪一个方向回答的好的话,二面就可能深入到那个方向深入的问
「阿里巴巴」
  • 面试的岗位是音视频开发,总共是 3轮技术面+1轮HR面。
  • 「一面内容:」
  1. MediaCodec连环炮:MediaCodec报错,只有错误码,没有任何其它信息,如何解决?使用MediaCodec遇到了哪些问题?同步使用和异步使用有什么区别?
  2. 如何计算音频帧,一帧音频帧有多大
  3. YUV基础知识,相比于RGB减少了多少空间,YUV 各个分量都是0实际渲染出来是什么颜色的,NV21和NV12有什么区别
  4. MP4是如何存储音视频文件的,它是什么结构
  5. OpenSL 相关的问题,如何使用。可以干什么不可以干什么
  6. 结合项目问题
  • 「二面内容:」
  1. SurfaceView和TextureView区别
  2. OpenGL ES相关问题,MVP矩阵左乘和右乘有什么区别,什么是外部纹理,为什么叫外部
  3. OpenGL如何渲染一个View
  4. VBO是用来干嘛的解决什么问题
  5. 结合项目问问题
  • 「三面内容:」
  1. 项目是什么架构,如何设计的,为什么这么设计
  2. 算法题:字符串反转
  3. 平时如何学习的
  • 「个人感受:」 音视频开发感觉OpenGL ES问的比较多,这方面多看看LearnOpenGL这个网站的教程,多加体会。

其实还有几家小型公司的面试,我就不在此一一的说明了,因为文章篇幅长度有限,所以就挑选了几个自己觉得面的还不错的公司进行跟大家分享。庆幸的是等到了自己想要的 「阿里 OFFER」,看了自己前期的2个多月的面试准备没有白费。

推荐分享

他之前在做面试准备的时候,从网上查找收集整理了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,进行刷题复习 Android 相关的知识,通过这次的面试效果检测,也体验出了结果。这次面试能通过一半原因是自己的技术还过的去,另一半的原因就是吸收了这些学习文档精华。

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

相关推荐
老马啸西风1 小时前
v0.29.2 敏感词性能优化之基本类型拆箱、装箱的进一步优化的尝试
性能优化·开源·nlp·github·敏感词
资深前端之路5 小时前
react 面试题 react 有什么特点?
前端·react.js·面试·前端框架
拉不动的猪5 小时前
回顾vue中的Props与Attrs
前端·javascript·面试
一笑的小酒馆6 小时前
Android性能优化之截屏时黑屏卡顿问题
android
boonya8 小时前
Redis核心原理与面试问题解析
数据库·redis·面试
懒人村杂货铺8 小时前
Android BLE 扫描完整实战
android
Jerry&Grj8 小时前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
大咖分享课8 小时前
架构性能优化三板斧:从10秒响应到毫秒级的演进之路
性能优化·架构
在未来等你8 小时前
Kafka面试精讲 Day 8:日志清理与数据保留策略
大数据·分布式·面试·kafka·消息队列