十年磨一剑:站在面试官角度聊聊现下Android大环境面试,“野生”程序员现阶段面试问题 & 学习误区

最近看书学习工作,有一些心得体会,点点滴滴,闲言碎语。

一份Android中级研发面经

接下来都是面试过程中普遍问到的基础知识(面试收集主要来自于bilibili,嵩恒,蚂蚁金服等互联网公司)。

1. 启动

  • 启动模式
  • App启动流程
  • Binder
  • ServiceManager
  • 序列化

2. 进程

  • IPC 进程通讯方式
  • 进程保活

3. Hook

Hook 的选择点:静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位。

Hook 过程:

  • 寻找 Hook 点,原则是静态变量或者单例对象,尽量 Hook public 的对象和方法。
  • 选择合适的代理方式,如果是接口可以用动态代理。
  • 偷梁换柱——用代理对象替换原始对象。
  • 多数插件化 也使用的 Hook技术

4. 内存泄漏

  • 构造单例的时候尽量别用Activity的引用;
  • 静态引用时注意应用对象的置空或者少用静态引用;
  • 使用静态内部类+软引用代替非静态内部类;
  • 及时取消广播或者观察者注册;耗时任务、属性动画在Activity销毁时记得cancel;
  • 文件流、Cursor等资源及时关闭;
  • Activity销毁时WebView的移除和销毁。

5. View

  • Window WindowManager WMS
  • View 工作流程
  • View.post

6. 动画

帧动画 :AnimationDrawable 实现,在资源文件中存放多张图片,占用内存多,容易OOM。

补间动画 :作用对象只限于 View 视觉改变,并没有改变View 的 xy 座标,支持 平移、缩放、旋转、透明度,但是移动后,响应时间的位置还在 原处,补间动画在执行的时候,直接导致了 View 执行 onDraw() 方法。补间动画的核心本质就是在一定的持续时间内,不断改变 Matrix 变换,并且不断刷新的过程。

属性动画 :ObjectAnimator、ValuetAnimator、AnimatorSet 可以是任何View,动画选择也比较多,其中包含 差速器,可以控制动画速度,节奏。类型估值器 可以根据当前属性改变的百分比计算改变后的属性值 。因为ViewGroup 在 getTransformedMotionEvent方法中通过子 View 的 hasIdentityMatrix() 来判断子 View 是否经过位移之类的属性动画。调用子 View 的 getInverseMatrix() 做「反平移」操作,然后判断处理后的触摸点是否在子 View 的边界范围内。

提升动画 可以打开 硬件加速,使GPU 承担一部分CPU的工作。

7. Android 进程通讯方式

  • bundle
  • ContentProvider
  • 文件
  • Broadcast
  • AIDL
  • Messager
  • Socket

8. Android 线程通信

  • Handler线程间通信
  • Handler 同步屏障机制
  • Looper.loop 为什么不会卡死
  • Messaage复用

9. Android 和WebView 通信

  • js调用android
  • android 调用js

10. app优化 (项目中处理的一些难点)

  • 启动优化
  • 布局UI优化
  • 打包优化

11. 第三方库 源码总结

  • LeakCanary 原理
  • OkHttp
  • 同步请求流程
  • 异步请求流程
  • 责任链模式 和 拦截器
  • OkHttp 流程
  • ButterKnife
  • butterknife 实现流程

面试技巧

最近面试了很多人,但是基本上都没招到什么满意的人,是Android开发都凉了吗,其实并不是,从简历的数量上来看,金三银四的简历还是很多的,首先我们从简历上来说,面试官都希望看见什么样的简历呢?

大部分的简历,都是罗列自己的公司经历、项目经历,介绍了项目大概的情况,好一点的,罗列下项目的技术方案。

要知道,对于面试官来说,简历是很重要的一环,这是对你的第一印象评价,很大程度上决定了你的面试成败。我在面试的时候,简历发给我之后,通常会看一眼面试者的项目经历,从而决定了我的面试问题。所以,项目经历上只需要写下面几个方面:

  • 项目一句话简介,说明项目的大体情况和规模
  • 核心技术方案,介绍用到的核心技术、核心技术方案
  • 你在项目中承担的角色以及贡献等

实际上有了这些东西,我基本上可以了解你的这个项目大概是个什么规模,需要用到哪些技术点,以及你应该有的能力范围,下面我就会根据你的这些项目经历来对你提问,由浅入深,可能先问你大概的技术方案,是否有更佳方案或者现在的方案是否有什么问题等,再深入问问技术的细节,看你的技术深度和广度。

除了项目经历,你的简历上只应该出现你的亮点,切记各种废话,什么精通Java,精通设计模式、数据结构,这些根本不能体现你的特点,这些东西应该结合业务或者架构,例如利用设计模式改进了技术方案的流程,通过数据结构优化了程序的执行效率。

另外补充一点,好的开源项目、博客等等,这些都是比较好的加分项目,但是...如果你的开源项目连readme都没,你的博客全是流水账,那就不要贴了,反而容易减分。

面试实际上是一个双向的过程,所以,一场好的面试,绝不是面试官单方面的发问,面试者应该引导面试官,把面试当作是一场技术讨论,一来一回,双方都能了解对方的技术实力,我相信,这样双方都会对这次面试满意,通过面试也就是自然而然的了。

大公司和小公司该选哪个?

说完公司的面试,再说一下经常有读者私信我的一个问题,那就是A公司、B公司,我到底该选哪个公司,首先我要确认下你是不是来炫耀的。

对于这个问题,其实也是有一个个人看法的,这个看法是我的主观臆断,可能很多人也不会这样想,这里写出来,大家轻喷。

首先,如果你是刚毕业的学生,我会建议你去小公司、创业公司,但是,是技术型偏向的公司,绝不是外包或者某个公司的IT部,为啥呢,原因很简单,刚毕业这几年,是你飞速成长的几年,也是你选择方向的几年,在这些技术型小公司、小团队里,你可以非常快速的上手各种技术,没有任何外部压力,团队小,大家通讯基本靠吼,不需要走流程、发邮件、约评审,这是大公司的通病——决策链太长,同时,你对自己的技术定位,在一段时间后,也会更加清晰。

在这之后,除非有一夜暴富的机会,就不应该在继续在小公司待下去了,这时候,一定要去大公司进行历练。大公司去干什么呢?其实很多大公司的技术并不很先进,代码很可能也很烂,但是你去大公司,就好像游击队变成了正规军,你要学的是规范和流程,小公司的这几年,让你的技术突飞猛进,但是却不成章法,大公司就是让你来沉淀技术的(这句话要屏蔽老板),大公司经营多年,技术方案早已成型,很多开发者进去也是拧螺丝,但是,你需要的是了解各个系统、各个平台的流程、优劣,做到心中有术,而不是心中有码,如果你是一个可造之材,那么经过这样两轮历练,我相信你应该是一个很不错的开发者了。

学习

首先,学习这件事情,就是一个认知的过程,既然是一个认知的过程,那就不能以管窥豹,而需要站在一个全局的思想上来看,例如在学习Flutter的时候,没有必要精通所有的Widget,掌握常见的Widget之后,就应该去思考Flutter的绘制流程、刷新流程,了解这些,才能让你在全局角度上掌握Flutter的渲染过程,这比你掌握几个Widget更加有用。

更加通用的,我们平时应该尽可能的拓宽自己的知识广度,这样才能让你的眼界更加宽广。就拿Flutter来说,总有一些敏感词喷Flutter,Flutter能不能火我不知道,能不能推广我也不知道,但是我依然学了Flutter,这是为啥?因为通过Flutter我学习到了一种新的跨平台思想,一种区别于现有的命令式编程的编程范式,一种全新的改进渲染流程的方法,掌握这些,我觉得比单纯的讨论阿里是不是不再用Flutter了更加有用。

学习,永远是一个认知碾压的过程,不断接触新思想、新技术,才能让自己有更加敏锐的认知洞察力,就好像学了Flutter,你会发现Compose好像也是一样啊,SwiftUI好像也是啊,从更高的眼界上去看这些东西,其实本质上,都是一种思想,现在的社会早已不存在信息孤岛,学会将信息链接起来,才是高效的认知方法。

井底之蛙永远跳不出去井,也永远别用阿里是不是还用Flutter这样的事来限制你的认知,就好像三体人用质子封锁了地球的科技进步,可悲。

努力成为一个优秀的程序员

在大公司一定要吾日三省吾身,千万不能贪图安逸,一个技术用十年,你也只有一年工作经验。

写代码

永远不要上手就写代码。

这句话我们从小就听——不要上手就写作文,先想好提纲。编程也是如此,除非胸有成竹,否则绝不一码十行。

当我们拿到一个需求进行开发的时候,一定要先在大脑中推敲推敲,这个需求的每个方面是否都是完备的,是否有异常流程,这个需求的每个技术点,是否能够胜任这个需求,这个需求的流程,我是否完全都清楚了,这些东西都想不好,那就不是在编程,而是在「拉屎」,而且你拉的这些shit,很可能会把后面的开发者「淹没」,造成一场信任危机。

所以,写一个好代码的时间一定比烂代码花的时间更少。

不过,面对日益压榨严重的资本家们,可能经常不太会给够一个好代码的开发时间,这个时候,就需要对代码进行取舍了,或是找轮子,或是改轮子,总之,要把精力花在刀刃上,一个最佳的原则——make it work, make it right, make it fast,我认为,这是一个代码最佳的生命周期。

系统面试复习路线参考

成年人想要改变生活、逆转状态时,会不约而同做一件事,那就是再次学习。

接下来分享的系统学习资源以详解各大互联网公司的 Android 常见面试题为主线,从面试的角度带你介绍必备知识点,以及该知识点在项目中的实际应用

帮你在现在的基础上,重新梳理和建立 Android 开发的知识体系。无论是你短期内想提升 Android 内功实力,突破自己工作中的能力瓶颈,还是准备参加 Android 面试,都会在这份资料中有所一些收获。

从架构基础开始,分了8个模块来逐步从基础进阶到架构师的环节:

多余的话就不讲了,接下来将分享面试的一个复习路线,如果你也在准备面试但是不知道怎么高效复习,可以参考一下我的复习路线,有任何问题也欢迎一起互相交流,加油吧!

首先是超级详细得不能再详细的Android开发学习思维导图,因为图片实在是太大了,所以我就只把二级目录的内容放出来,更加详细的你们可以点击这里

接下来就需要梳理知识,提升储备了!(Android移动架构师七大专题学习资源)

  • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO

  • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化

  • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化

  • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack

  • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发

  • 微信小程序:小程序介绍+UI开发+API操作+微信对接

  • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

然后再是通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

刷大厂面试题备战,增加大厂通过率

历时半年,整理了这份市面上最全面的安卓面试题解析大全。

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。

最后还有耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记等等,这些内容均免费分享给大家。**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章