【金三银四】2022 Android面经真实经历

经历了去年的裁员风波,今年的金三银四略显冷淡,各家大厂对于初中级开发招聘缩减,岗位收缩,招聘需求明显减少,在用人方面更加谨慎。

近十几年来,随着以Android系统为代表的智能手机普及与发展,互联网行业早已进入“移动”的时代。但是现如今的“风口”已经从移动转向,整个移动互联网行业正处于增量下降、存量厮杀的阶段。面对技术更新迭代加速,前景不太明朗,很多开发者都感到了有些焦虑和迷茫。并且,在如此的大环境下,整个行业头部企业,越来越重视产品的体验与成本,对中高级的开发者的能力要求也越来越高。

1.需要复习哪些东西?

我个人认为首先是复习Java基础和Android基础,然后再根据简历上写的技能点和业务经历,复习相关的知识点。有时候,你做过的某个东西,可能叙述出来不是特别清晰,或者根本就想不起来具体是怎么做的了,这个时候就需要复习代码回顾一下。

下面是一些我认为需要复习的点:

  • 项目经历,业务,难点
  • Java基础,JVM,集合原理
  • Android基础,View体系,View绘制流程,事件分发,屏幕刷新,动画原理
  • 常见三方库原理
  • Jetpack
  • Android Framework
  • 算法
  • Kotlin

2. 如何最高效复习?

一个技术点或者做过的业务,最好是先复习一下,然后用自己的话把它描述出来,最好是写成文字,记录到云笔记上,方便随时复习。当然,这只是一个点的复习方式。而简历上有很多很多个这样的点,我们需要设置一个dead line,设置一个复习总时长,到哪个日期截止,必须在那个日期结束前复习完成。

然后将需要复习的点详细安排到每一天,每天需要复习哪些东西,必须当天完成,禁止自己拖到第二天,最好是明天的任务内容今天就把它完成了,然后明天就去复习后天的任务内容。给自己留有余地,即使某天没时间复习,也不至于落后于计划。最好是开始复习计划之前就把每一个知识点需要看的东西全部给列出来,比如需要复习哪篇笔记、哪篇文章、哪部分代码等,到时在复习的时候就无需关心该复习哪里,直接照着之前安排好的计划开整就行了。

下面是一些我在复习时的部分计划,完成时打个勾:

【金三银四】2022 Android面经真实经历_第1张图片

算法部分

打遍天下二叉树 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Algorithm/打遍天下二叉树.md

labuladong的fucking-algorithm https://github.com/labuladong/fucking-algorithm

Java基础

Java集合源码复习一遍

ArrayList源码解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/ArrayList源码解析.md

LinkedList源码解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/LinkedList源码解析.md

CopyOnWriteArrayList源码解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/CopyOnWriteArrayList源码解析.md

HashMap源码解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/HashMap源码解析.md

ConcurrentHashMap源码解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/ConcurrentHashMap源码解析.md

TreeMap 和 LinkedHashMap https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/TreeMap和LinkedHashMap.md

HashSet 和 TreeSet https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/HashSet和TreeSet.md

Android中的Bundle,SparseArray和ArrayMap https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/集合/Android中的Bundle,SparseArray和ArrayMap.md

从源码角度彻底搞懂String,StringBuffer,StringBuilder_20180420 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/从源码角度彻底搞懂String,StringBuffer,StringBuilder_20180420.md

String https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/String.md

泛型 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/泛型.md

异常 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/异常.md

反射 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/反射.md

注解 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/注解.md

反射性能开销原理及优化 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/基础/反射性能开销原理及优化.md

《深入理解Java虚拟机》

JVM内存数据区域 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/1.JVM内存数据区域.md

HotSpot虚拟机对象 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/2.HotSpot虚拟机对象.md

垃圾收集器与内存分配策略 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/3.垃圾收集器与内存分配策略.md

Java字节码(class文件)解读 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/4.Java字节码(class文件)解读.md

字节码指令简介 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/5.字节码指令简介.md

虚拟机类加载机制 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/6.虚拟机类加载机制.md

虚拟机字节码执行引擎 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/7.虚拟机字节码执行引擎.md

前端编译与优化 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/8.前端编译与优化.md

后端编译与优化 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/9.后端编译与优化.md

Java内存模型与线程 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/10.Java内存模型与线程.md

线程安全与锁优化 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Java/JVM/11.线程安全与锁优化.md

拉钩教育-《Android 工程师进阶34讲》

拉钩教育-《Java 并发编程 78 讲》

Android

《安卓开发艺术探索》

Android_View工作原理你需要知道的一切 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/死磕Android_View工作原理你需要知道的一切.md

Android_App_启动过程(含_Activity_启动过程) https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/死磕Android_App_启动过程(含_Activity_启动过程).md

Android_Service启动流程分析(一) https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/死磕Android_Service启动流程分析(一).md

Android_Service绑定流程分析(二) https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/死磕Android_Service绑定流程分析(二).md

Android_BroadcastReceiver_工作过程 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/死磕Android_BroadcastReceiver_工作过程.md

Lifecycle_原理解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/Lifecycle_原理解析.md

ViewModel_使用及原理解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/ViewModel_使用及原理解析.md

Jetpack全家桶 https://juejin.cn/post/7013640663824597005

学习Android Jetpack? 实战和教程这里全都有!https://juejin.cn/post/6844903889574051848

Lifecycle https://juejin.cn/post/6893870636733890574

LiveData https://juejin.cn/post/6903143273737814029

ViewModel https://juejin.cn/post/6915012483421831175

MVVM https://juejin.cn/post/6921321173661777933

DataBinding https://juejin.cn/post/6923859213403979789

Handler机制你需要知道的一切 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/Handler机制你需要知道的一切.md

Android_ContentProvider_启动 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/死磕Android_ContentProvider_启动.md

LiveData_使用及原理解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/LiveData_使用及原理解析.md

Window,Activity,View三者关系 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/Window,Activity,View三者关系.md

Handler同步屏障 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/Handler同步屏障.md

Choreographer原理及应用 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/Choreographer原理及应用.md

Handler相关知识点大全 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/系统源码解析/Handler相关知识点大全.md

LeakCanary 原理探究 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/三方库原理/LeakCanary_原理探究.md

OkHttp3 原理探究 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/三方库原理/OkHttp3_原理探究.md

Retrofit 原理解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/三方库原理/Retrofit_原理解析.md

Glide主流程源码解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/三方库原理/Glide主流程源码解析.md

RxJava3原理解析 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/三方库原理/RxJava3原理解析.md

Android-skin-support 换肤原理详解 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/三方库原理/Android-skin-support换肤原理详解.md

屏幕适配 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/实战常见问题/屏幕适配.md

插件化 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/实战常见问题/插件化.md

热更新 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/实战常见问题/热更新.md

Gradle系列(一) Groovy 基础 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/Gradle/Gradle系列(一)_Groovy_基础.md

Gradle系列(二) Gradle执行顺序和task https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/Gradle/Gradle系列(二)_Gradle执行顺序和task.md

Gradle系列(三) Gradle配置构建和渠道包 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/Gradle/Gradle系列(三)_Gradle配置构建和渠道包.md

Gradle系列(四) Gradle插件 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/Gradle/Gradle系列(四)_Gradle插件.md

Gradle系列 插件练习-动态移除权限 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/Gradle/Gradle系列_插件练习-动态移除权限.md

手把手教大家用Transform API和ASM实现一个防快速点击案例 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/Gradle/手把手教大家用Transform_API和ASM实现一个防快速点击案例.md

Android进程间通信: 深入浅出AIDL https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/多进程/AIDL详解.md

Android进程间通信: Messenger详解 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/多进程/Messenger详解.md

Android进程间通信: Binder详解 https://github.com/xfhy/Android-Notes/blob/master/Blogs/Android/多进程/Binder详解.md

硬核!Android 应用启动全流程深度剖析!(进程创建+消息机制+Activity组件管理+Application和Activity初始化+UI布局与绘制+RenderThread渲染+SurfaceFlinger合成) https://mp.weixin.qq.com/s/b6-leHKQZkuxkjll-1109A

Choreographer原理及应用 https://blog.csdn.net/xfhy_/article/details/115436765?spm=1001.2014.3001.5502

屏幕刷新 https://juejin.cn/post/6863756420380196877

View工作原理 https://juejin.cn/post/6854573212374663182

编译基础 https://juejin.cn/post/6844904106545414157

Android插件化原理(一)Activity插件化 https://juejin.cn/post/6844903613865672718

ClassLoader http://liuwangshu.cn/tags/ClassLoader/

hencoder全部Kotlin部分 https://rengwuxian.com/tag/kotlin/

hencoder全部自定义View部分 https://rengwuxian.com/tag/custom-view/

协程原理 https://juejin.cn/post/6862548590092140558

flow https://juejin.cn/post/6914802148614242312

Android SharedPreferences的设计与实现 https://juejin.cn/post/6884505736836022280

ActivityThread的理解 https://blog.csdn.net/hzwailll/article/details/85339714

了解AMS http://liuwangshu.cn/tags/ActivityManagerService/

Android Gradle 自定义Task 详解 https://blog.csdn.net/zhaoyanjun6/article/details/76408024

编译打包流程 https://juejin.cn/post/6844904106545414157

Android Gradle 看这一篇就够了 https://juejin.cn/post/6844903446814916621#comment

面试题目

公司1:

  • 说一下项目的架构,哪一块是你主要负责的?说一下是怎么设计的
  • livedata原理
  • handler原理
  • 组件化传递大数据
  • 单例里面的数据线程安全
  • 内存优化,卡顿优化,冷启动优化
  • 怎么检测已发生了内存泄露的对象?不知道那个对象是谁
  • 协程和RxJava原理,区别

公司2:

  • view绘制流程
  • 事件分发流程,外部拦截法,内部拦截法
  • Kotlin协程,协程原理,怎么开协程,怎么切线程
  • viewpager内部view高度不一致,怎么解决
  • startActivity流程
  • 启动优化,包体积优化
  • livedata原理
  • gradle 马甲包
  • 换肤原理
  • 协程状态机
  • let和also区别
  • mvvm

公司3:

  • gc roots
  • JVM垃圾回收算法,Android虚拟机垃圾回收算法
  • 分代回收思想
  • Java类加载机制
  • 线程池有几种,分别是什么特征,自定义线程池需要注意什么,核心线程数是多少
  • hashmap原理(红黑树会退成链表吗?什么情况下?),ConcurrentHashMap原理,Hashtable原理
  • StringBuilder和StringBuffer原理
  • 反射原理及其优缺点
  • 泛型拿来做什么的
  • synchronized用法及原理,1.6做了哪些优化,Mark word
  • 常用的三方库原理,随便挑一个说
  • 换肤原理
  • 动画有哪几种,属性动画原理,vsync
  • View绘制流程
  • 短时间内多次调用requestLayout,哪些View会重绘
  • 冷启动优化
  • 包体积优化
  • 插件化原理,startActivity
  • mvc,mvp,mvvm
  • requestLayout流程
  • 算法1:反转单词
  • 算法2:环形链表求环入口节点,不准用快慢指针,O(1)空间复杂度,O(n)时间复杂度,可修改链表节点的指针和数据。不能在链表节点中新增属性

公司4:

  • 3个线程如何依次执行
  • 设计一个图片加载库,lrucache原理,linkedhashmap实现
  • lifecycle,viewmodel原理
  • view事件分发

公司5:

  • app启动过程+activity启动过程,activity启动过程中的launchmode的原理
  • handler
  • java 方法重载问题,泛型相关
  • 卡顿优化,冷启动优化,线上监控方式
  • 慢函数线上监控

公司6:

  • fragment生命周期
  • 屏幕刷新机制
  • binder理解
  • bindService校验: 权限,包名
  • https的原理
  • 热修复:class和资源
  • invalidate 和 postInvalidate区别
  • handler原理,sendMessageDelayed是怎么实现的,为什么不卡主线程,底层是如何通知进程这边恢复阻塞的
  • java掌握到什么程度了,kotlin呢?android呢?
  • 响应式编程
  • 看过哪些书?推荐一本你觉得不错的书,为什么不错
  • android最近这2年值得关注的框架
  • 敏捷开发模式
  • 你给你自己的水平打分,计划怎么完善和精进自己的技术栈

公司7:

  • volatile、synchronized、原子类的原理
  • 数据库优化是怎么做的
  • 性能优化
  • kotlin伴生对象和init
  • 斐波拉契序列
  • 反转链表

公司8:

  • 包体积优化
  • handler原理
  • 如何退出app
  • synchronized和lock
  • 鸿蒙了解过吗
  • flutter了解过吗,compose呢
  • 跨进程通信,线程通信
  • 组件化是怎么做的
  • 做过的项目,主要负责什么
  • 担任的角色
  • 最难的是什么?怎么解决的
  • 开发流程是怎么样的?有做设计文档吗?
  • 职业规划,为什么做安卓?鸿蒙有了解吗?
  • 平时怎么学习的?最近学了什么?给工作带来了哪些好处?
  • 看过哪些技术书籍
  • 平时有什么爱好
  • 对你想要去的公司团队有什么要求?或者说你想去什么氛围的项目组?

公司9:

  • sleep和wait区别
  • mvp
  • 组件化
  • livedata,viewmodel原理
  • 内存优化
  • 启动优化
  • leakcanary原理
  • 换肤原理
  • 怎么hook ams

HR面试真题

一般HR面就比较轻松了,不会涉及什么高难度的问题。一般就问问你为什么离职、住哪里、有对象吗、结婚了吗、有小孩吗、小孩多大了、买房了吗、哪里人,然后HR还会介绍公司的情况、产品、公司规划、福利之类的。下面这些是我在网络上搜集的一些比较重要的问题,需要详细向HR了解清楚。

大部分Android开发者一遇到这种面试题就直接懵逼了,不少人不是没有看过相关的解答,但也都只是浅尝辄止,没有深入掌握其中原理,面试的时候自然会被问个措手不及。最要命的是面试官还会根据你的回答来一步一步深入,直到你回答不上来为止!

很多求职者抱怨大厂“面试造火箭,工作拧螺丝”,但实际上,面试中的大多数问题都是在全方位地考察你对技术的理解深度,以及解决问题的能力

那些看似无理甚至无用的问题:比如“Okhttp请求复用有没有了解”,其实是面试官想借此看看你对网络优化和Socket协议的理解情况和掌握程度,进而引伸到你对网络架构、设计模式的理解。在熟知Okhttp源码的前提下,你才能够答好这道面试题。

比如优化方面,多少人往往就是说一些自己编写的业务,一些去除页面多余嵌套、使用线程池、ViewStub 这些非常浅的方案。其实更多的,面试官还是希望能够听到,线上复杂环境,低端机/弱网等因素下,用户触发的一系列的体验问题

像在进行启动优化的时候,例如你从线程角度做启动优化,你需要了解在 Linux 层线程的 nice 值,线程优先级对调度的影响等。在进行内存优化的时候,就必须要精通JVM!

作为过来人,我发现很多人对于 Android 知识的掌握还是多浮于表面,导致对一些核心底层技术点却只停留在**“使用过”甚至是“听说过”的阶段**,这其中甚至不乏一些工作 5 年以上的 Android 工程师。

诸如这些困扰,相信很多Android开发都有体会:

  • 工作场景中遇到难题,往往只能靠盲猜和感觉,用临时性的补救措施去掩盖,看似解决了问题,但下次同样的问题又会发作,原因则是缺乏方法论、思路的指引以及工具支持
  • 能力修炼中,缺乏大型互联网项目这一实践环境,对底层知识只能通过理论知识进行想象,无法认识其在工作实战中的真实面目和实操过程
  • 职场晋升中,只管功能开发,不了解底层原理,缺少深入地思考与总结,无法完成复杂系统设计这类高阶工作,难以在工作中大展拳脚,而有挑战的工作往往只留给有准备的人。

总之,一旦遇到问题,很少人能够由点及面逆向分析,最终找到瓶颈点和最优解决方案。

如今,国内移动互联网的红利期已经过去,Android 开发工程师也从最初的一人难求,到现在的一个岗位百人竞争,僧多粥少的情况直接导致整个行业对求职者的要求越来越高。可以说,初中级工程师基本已无立足之地,即使高级工程师也经常在面试中碰钉子

如果你在金三银四想获得一份更好的Offer,如果你还没有完全掌握这些技术的底层原理,现在想要在最短的时间里突击学习,那么必须要有一份完备的思路指引!

你可能感兴趣的:(android,kotlin,java)