2021 年之 Android 面经分享(已获头条、顺丰,androidapp 开发工具
跟 Art、Dalvik 对比
Java 内存模型?
类加载机制?双亲委托模型?
其它
用过哪些设计模式?DCL 单例模式为什么要两次判空?Android 里源码或者你用过的开源库都用到了什么设计模式?
— final 关键字的作用?
静态内部类和内部类的区别?
值传递类问题
Kotlin 为什么能和 Java 混编
你有什么亮点?项目中遇到过什么难题或者坑,怎么解决的?
做过哪些性能优化?是怎么评测和具体优化的?
Activity 的冷启动流程?AMS 的作用?
怎么分析内存泄漏?
View 的事件分发机制?滑动冲突怎么解决?
自定义 View 的原理和流程?
Handler 原理?(一般会花式扩展)
有哪些多进程通信方式?Binder 机制?
Android 的生命周期和启动模式相关?
你项目中用到哪些开源库?说说其实现原理?(OKhttp、RxJava、Retroit 重点,如果有用到的话)
Android 的打包流程?apk 里有哪些东西?签名算法的原理?
了解哪些插件化技术?
LinearLayout 的布局流程?
对 Mvp 的理解?
Android 怎么做保活?
算法
排序相关的(快排,分析不同排序区别,时间复杂度等)
字符串、数组相关的(滑动窗口、双指针)
链表(反转链表)
递归、斐波那契数列(爬楼梯)
动态规划
分析考点
技术面是一场技术面试官对候选人的综合评估
先从面试官角度来分析,在面试过程中的对候选人一些考查点吧。知己知彼百战不殆,面试过程中逆向思考一波,有助于我们怎么应对技术面。
候选人人设是否跟简历一致
主要看候选人是否坦诚真实,这个会直接影响能不能通过。候选人上的项目经验和技能点应该尽可能与候选人匹配,比如说,候选人说做了 XX 项目,但是问起是怎么实现的,却答不上来,或者说熟悉 xx 技能点,却只会调用常用的 api,对其源码细节一点都不熟悉,那多半是不给过的。如果候选人要吹牛 B,能拿出能圆上吹牛 B 的实力,也是可行的。比如说某某模块其实是你同事做的,但是你也完全理解了,可以应答如流,面试官是不会计较的。
技术的扎实程度和项目经验匹配程度
考查包括对技术的理解和解决问题的能力,包含一些细节,运用的场景,实现的原理等等,目的是为了测试候选人技术水平上限。答得越清晰,越深入,对细节掌握越牢靠越好,不一定需要全部答出答完美才能拿到 offer,但这些题回答的效果最能影响到 offer 能谈多少钱。小厂偏重于技能、项目经验匹配度,大厂偏重于基础、原理。小公司,面试官通常希望候选人尽快上手,就希望候选人有类似竞品或者功能开发经验的候选人,所以也可以从这些方面做准备。大公司呢,可能会提出一些场景来考查候选人怎么设计,这就要求候选人功底深厚,逻辑严谨了。上面的题集我没写答案,因为我觉得很多题本就没有标准答案,也没有必要背题的“标准答案”,优秀的回答,应该是形成自己的理解输出的,说的有理有据就行。
候选人亮点、优势
一般是作为候选人的加分项,或者是面试官为了更快的打开话题,了解候选人的优势,并测测候选人的优势到底屌到什么程度。这个问题回答好了,候选人甚至能翻盘。
沟通能力
在一线搬砖过的应该都懂,每天正正经经写代码的时间通常不到一半,还得花不少时间跟产品撕,跟后台撕,跟 UI 撕等等。所以沟通协调能力也是很重要的,候选人需要理解面试官出题意图,表达要逻辑清晰。最好是候选人能跟面试官建立起讨论技术的氛围。这方面很容易被多数候选人忽略,但其实挺重要的,面试官也许不能直接决定要你,但是一般可以直接决定淘汰你,候选人要不卑不亢,保持谦逊。候选人技术再屌,态度傲慢的话,也是很容易翻车的,但也不能太怂,显得没有技术底气,所以最好是和谐的讨论氛围。
学习能力,自驱性
一般总监或负责人会比较关注这个。
答会的问题
要听明白面试官的出题意图,也就是注意审题,不要答非所问,如果对面试官提出的问题不是很理解,及时进一步沟通,把问题问清楚,这也体现了沟通能力,毕竟平时工作时,也会接到一些不是很清晰的需求,自己主动获取更清晰的需求也是程序员的优秀素质。
回答要尽量清晰准确,最好能答到问题的本质,展示出你对技术的更深层次的探索和挖掘。同时要注意面试官的反馈,这时候就要察言观色了。
如果面试官听的津津有味,并不断追问加大问题难度,那么恭喜你,你回答的很好!
如果面试官表现得有点不耐烦,那就精简下回答,毕竟面试时间有限,去掉那些啰嗦的话和题目关联不大的东西。
如果发现面试官问的题越来越简单,越来越常规表面,那么就得警惕下了,可能是你之前的回答太一般,让面试官觉得你比较菜,所以就不给你出难题了,这种情况就算最后给到 offer,多半价格也谈上不去了,甚至还可能是为了给你个
台阶下,然后让你回家等遥遥无期的通知了,这种情况下就得把问题回答得更深入一些了,知道多少答多少,尽可能主动展现出自己的水平来。
答不会(不确信)的问题
首先要对这个问题有一定的思考分析,不要轻易的说不会,但也不能完全不会还瞎答,完全不会的还是要敢于说不会,坦诚也是必要的素质。
如何思考分析呢?以我的经验来看,主要是从问题的关联知识或者可替代方案的角度来思考。对问题不是很清楚了解的时候,尝试从已知的相关联的知识点来做出合理推测,比如从一些开源库里面借鉴思路,或者从 Android 源码里面借鉴思路,但是这种情况就得跟面试官说清楚,你是推测的,还要说下为什么要这么推测,避免面试官误以为你不懂装懂。还有一种方式,就是你也提出一个可替代的能解决问题的方案。
上面的题集有些问题看起来比较简略,我这边举几个典型例子做拓展,其它题目类似。
做过哪些性能优化?是怎么评测和具体优化的?(具体问法可能有很多种,注意识别考点)
性能优化通常会设计到流畅度优化、启动优化、apk 瘦身优化、网络优化、耗电量优化,先给面试官抛出几个大的方向,一边回答一边观察面试官反馈,通常面试官会从这几个方面挑拣一两个感兴趣的让你更进一步的讲解,如果没有,那你就对每个方面抓住最核心关键的部分简要回答就行了。举个让你继续谈流畅度优化的问题,那你就得考虑到,怎么评测出是否流畅的?用了什么工具或者技巧?比如说用了 GPU 程序模式分析,用了腾讯 GT 插件的 SM 指标,用了 TraceView、Systrace、Hierarchy Viewer 等等,很可能面试官还会问,卡顿的原理是什么?哪些情况会导致卡顿?这时候你就得回答出 FPS、垂直同步的原理了。接着你得说出你用了哪些技巧优化的,优化的成果怎么样?那数字肯定是最有说服力的,所以大家平时在优化前和优化后都得做好记录。你回答优化技巧后,比如减少过度绘制啊、布局优化啊,还有可能会追着问 view 的 gone 和 ViewStub 的区别,以及分别用在了什么场景?原理是什么?为什么就能优化了?
反思点:
平时工作时,对技术细节、原理需要多关注,不光要知道怎么用,还要知道背后的机制。
你项目中用到哪些开源库?说说其实现原理?
回答开源库相关的问题,要想回答的好,就得自己想清楚几个问题,这几个问题想清楚了,就可以随便回答了。
这个库是做什么用的?
为什么要在项目中使用这个库?
这个库都有哪些用法?对应什么样的使用场景?
这个库的优缺点是什么,跟同类型库的比较?
这个库的核心实现原理是什么?如果让你实现这个库的某些核心功能,你会考虑怎么去实现?
你从这个库中学到什么有价值的或者说可借鉴的设计思想?
算法相关的
首先要想答好,还是得多理解数据结构,去 LeetCode 多刷题,多总结套路。我这块儿也比较薄弱,只能说一些浅见。面试了这几家,大概有一半考察了在白纸上手写算法题。而且很多题我也答的并不是很理想完美,但依然拿到了 offer,所以我就说一些逆风应对技巧吧。举个爬楼梯的例子。
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
先审题,发现 n 是个未知数,题目也没明说 n 的范围,那么这个时候你应该跟面试官确认一些这个 n 的范围(这体现了你的沟通能动性和对需求的理解能力)
审完题后,发现还是一脸懵逼,不知道怎么下手。这时先冷静,别指望一步登天,解出最优解,考虑什么时间复杂度啊什么的,先解出答案再说。如果暴力解法都想不出来,那么就先把题目缩小范围,把 n 明确化,比如是 3 阶的楼梯怎么爬,这个时候一般可以画图来辅助自己寻找思路,直接脑子干想不如图像直观,很可能这么一顿操作你就能发现规律,找到解题思路了,就算最后真的没写出具体算法,将已知思路和阻塞自己的难点告知面试官,也可能会通过面试(这个过程体现了你解决未知难题的能力,程序员解决未知问题的能力是很重要的素质)。
你画了图之后发现这个是个树形结构,凭借刷题的套路总结,一般树形结构的问题通常可以使用递归解决。而且巧得很,这还是一个斐波那契数列问题。这个时候你开始写代码,用到了递归算法,那就得注意递归的一些特性,比如说递归终止条件。在你写完后,就可以跟面试官讲解你的思路,和分析时间复杂度了。
还没完,你学过的算法课会告诉你,有些递归算法,是可以进一步用动态规划的方式优化的,你仔细观察了一下,发现这个问题还可以用动态规划的思想优化(字节范儿:追求极致!)
《Android 开发艺术探索》
《Android 进阶之光》
《Android 进阶解密》
《深入理解 Java 虚拟机》
《Android 源码设计模式》
《深入理解 Android 内核设计思想》
评论