作者:青的世界
我相信你在找工作的时候,一定或多或少被面试官问到过安卓的八股文。例如,ActivityManagerService (AMS)或WindowManagerService(WMS)是如何实现的?需要注意哪些细节?视图被添加到ViewRoot的进程中,等等。每次看到这些文章,教人如何准备Android框架面试,我都觉得很难过。
因为在我看来,对于应用开发来说,面试测试纯粹是扯淡。很有可能面试官自己只是在网上看了文章,然后按照剧本问面试官。其实这种现象说白了就叫音量。因为面试的内容已经在app层挖掘出来了,要想提高面试的门槛,只能深挖。
Android框架的代码是最好的替罪羊,因为框架的内容足够了。到什么程度?下载一套新的AOSP代码可能需要一个小时,更不用说完整编译了。每次开新回购都很开心,因为可以安心的边看视频边等代码下载。如此庞大的代码量,面试官可以提出任何问题。只要你的面试官有时间,我随时可以打倒你。
但是这些代码都是好代码吗?还是说Android框架的所有代码都值得面试官学习?
答案是否定的,这也是一个非常明显的答案。
Android框架经过了近十二年的迭代,其实很多地方又臭又长。比如臭名昭著的视图类:
https://android.googlesource.com/platform/frameworks/base//a 175 a5b/core/Java/Android/view/view . Java # 15354
已经演变成了15000行的类。
很多地方不想优化,但是没人敢动。出了问题怎么办?你负责吗?
我不小心跑题了。回到面试问题。
所以对于一些面试官拿到的八股文。那些考点,或者考点指向的代码,也不是圣经。它们很可能只是谷歌Android团队在一开始定义的一些规则。在谷歌做Android框架的,或者有权限修改Android框架代码的人不计其数。是不是每个人都是天才,完全不会犯错?显然不可能。
看框架源代码是不是一文不值?那肯定不是真的,前提是我们看源代码的时候,能取其精华,去其糟粕。
有的读者肯定会说,我站着说话不腰疼,什么都能说好。我如何操作它?我怎么知道什么是精华,什么是糟粕?
在我告诉你如何操作它之前,我想给你一个反例。
源代码分析?很多初学者一上来就雄心勃勃,觉得要全面学习Android。他们从头开始读源代码,或者看源代码分析3360。
这样的后果就是,你往往在起跑线上就望而却步。原因很简单。当你连某一类框架是做什么的都不知道的时候,只看源代码,你不会有动力。像很多刚毕业的学生,想先开始看开源项目,学习源代码,再写很多行代码,基本上可以说是没有意义的。
很多尝试阅读Android源代码的朋友甚至都没有尝试过刷设备。他们如何学习框架的精髓?说白了,不动手学源代码也是一种懒惰的行为,以为自己在努力学习,其实什么都不做。
刷机!学习源码的第一步其实就是刷设备。跟随官方教程,从下载AOSP源代码3360的第一步开始
1、https://source.android.com/setup/develop
然后用AOSP源代码构建操作系统:
2、https://source.android.com/setup/build
最后把构建系统镜像刷到手机:上。
3、https://source.android.com/setup/build/running
学代码?先修复bug,最后才是动手操作。
具体操作就是修复bug!
没错,学习任何巨大的盒子。
架,一个人都没办法从面到点的学习,都是从点到面,从下到上。因为你不可能一开始就对全局都有认识。所以修bug就成了一个最好的切入点。安卓的AOSP有数不尽的bug,每天都会有一大堆进入到bug tracker里面。Framework的bug tracker:
https://issuetracker.google.com/issues q=componentid:192705+
大到系统fatal error,小到注释没加,都在里面。大家不要觉得参与进去很难,我随手一看,就找到一个简直不能再弱智的bug:
https://issuetracker.google.com/issues/196574813
同样的,这个解决它的code review,就一行改动:
https://android-review.googlesource.com/c/platform/frameworks/base/+/1799607
是不是顿时觉得自己也能参与到安卓的开源行动里面了?
只要有毅力,哪怕是自己解决不了,你都可以跟踪一个你感兴趣的bug,看看别人是怎么解决的,看看别人是怎么复现这个bug的,对自己也是有很大帮助的。至少,这样的方式会比自己苦读源码要强。源码分析不是不可以看,而是要用对的方式去看,比如把源码分析的博文当成一个字典,有遇到相关的bug的时候翻一番。
最后最后的最后!我也不是说让大家以后面试都不准备了,而是提供另外一个平时可以学习的思路,两手抓难道不是更稳 :)正所谓知其然知其所以然,底层的实现庞大而又复杂,完全不用心去读源码很难将知识点深入理解。这里给大家推荐一套学习路线,并附有相关《Android Framework核心知识笔记》,相信可以给大家提供一些帮助,有需要的朋友们也可以下载下来随时查漏补缺。如果需要这份《Android Framework核心知识笔记》,可以顺手帮我点赞评论一下,直接私信我【FWK】即可免费领取!
Handler宏观理论分析与Message源码分析MessageQueue的源码分析Looper的源码分析handler的源码分析……Binder学习Binder前必须要了解的知识点ServiceManager中的Binder机制系统服务的注册过程ServiceManager的启动过程系统服务的获取过程Java Binder的初始化Java Binder中系统服务的注册过程……ZygoteAndroid系统的启动过程及Zygote的启动过程应用进程的启动过程……如果需要这份《Android Framework核心知识笔记》,可以顺手帮我点赞评论一下,直接私信我【FWK】即可免费领取!
AMSActivity生命周期管理onActivityResult执行过程AMS中Activity栈管理详解……PMSPMS的启动过程和执行流程APK的安装和卸载源码分析PMS中intent-filter的匹配架构……WMSWMS的诞生WMS的重要成员和Window的添加过程Window的删除过程……如果需要这份《Android Framework核心知识笔记》,可以顺手帮我点赞评论一下,直接私信我【FWK】即可免费领取!
如果需要这份《Android Framework核心知识笔记》,可以顺手帮我点赞评论一下,直接私信我【FWK】即可免费领取!