Android进阶之旅 - 源码阅读的经验总结

在长沙待的那些年,身边所看到的大概可分为两类人,一类是不断反复的做业务逻辑,只求功能能够写出来,每天重复上下班,不想过多的去折腾;还有一类是不断的反思总结和学习,不只停留在做的层次上,是真正的喜欢做这行,且觉得非常有意思。没有什么好与坏,只是大家的追求不同而已。但如果我们想要去大一点的公司,或者找一份工资稍微高些的工作,后面我们就会有很多坎要去迈,其中一个就是阅读源码,所以这期我们主要来探讨一下阅读源码的 一些姿势。在真正踏上这条路之前,希望我们能明确以下几点:

  • 没有人一上来就可以看得懂源码,我们都是从 Hello World 开始的,所以没有什么捷径可以走,无非就是看我们谁花的时间多,谁更愿意折腾。

  • 大家都是上下班,为啥别人工资拿得高福利又好,而自己大小周,偶尔还需要加班通宵。同样三四年别人拿 20k,我自己却只拿了 10k。注意我说的是 20k ,之前写过一篇文章 《从3K到30K,23岁的年纪我到底经历了什么》 这次同样怕某些哥们会喷,哪有那么高?我们心中要有美好的信念,要有不断向上的激情。

  • 能力提升过程中我们能从中获得很多东西,内心也会变强大,关键是我们在做项目的时候,的确会要顺手很多,这就可以拿来换钱和时间,前提是我们愿意拿时间去换。

一.常用工具


首先来介绍一些看源码的工具,第一个就是我们的开发工具 Android Studio ,这里我们以具体的示例来说,假设现在我想看 setContentView 的源码,那么我们可以直接跟进到源码的方法里面去:

这时如果再往里面跟发现是一个抽象类,我们必须要找到实现类,一般来讲我们可以搜索(ctrl + F)找到其创建实例的地方:

是红色的,这个时候我们再也没法往里面跟了(一碰到红尴尬症就犯了,肾得慌),碰到这种情况我们可以试试全局的搜索(双击 shift)

但很多情况下我们全局搜索也搜索不到,接下来给大家介绍第二个工具,我们可以在线浏览源码阅读:http://androidxref.com 这里面不光有 Java 层的源代码还有 native 层的源代码

在线查看一般都是比较精确要看哪个类的时候,并不能满足我们快速查看的需求。我就想在 Android Studio 中看,可以不断快速的往下跟进。其实我们在下载 sdk 的时候一般都会下载源码,只不过刚好 android.jar 包中没有这个 class 类的源码,所以我们才找不到而已。这个时候我们需要一个比较完整的 android.jar ,用来替换我们 sdk 中的 android.jar 文件,关键是这个 jar 怎么来?最好的方式是自己去编译,但很多哥们可能觉得自己编译成本高,那么我们也可以去 github 上下载。https://github.com/anggrayudi/android-hidden-api 把原来的保存一份改下命名,把下载的复制进去,然后重启 Android Studio 再去看看,发现不仅没有报红而且可以点击了。

到后面这些还是无法满足我们的需求,比如现在我们已经把 C++ 进阶学完了,我想跟到 native 层的源码去看看,比如去看看底层的 Binder 驱动,或者去看看类的加载机制,我再送大家一个链接,里面所有的源码基本都能找到:https://pan.baidu.com/s/1tGtBt5Y1G50yI10EkVRPAw

再啰嗦几句,如果我们对源码非常感兴趣,我建议大家还是自己去编译源码,这样我们就可以利用 Android Studio 去调试跟踪源码,屡试不爽。

二.前辈力量


文章的开头有提到,没有人一上来就可以看得懂源码,我们都是从 Hello World 开始的,所以没有什么捷径可以走,无非就是看我们谁花的时间多,谁更愿意折腾。别看网上有很多大牛写了很多分析源码的文章,但其实他们都是经过反复折腾,才能写出那一篇形如流水却很抽象的文章。所以我们写了那么多分析源码的文章,录了那么多直播课程,无非就是我们在背后花了很多时间而已。只要你愿意我能行的,你也能行。

当然刚一开始我并不建议大家自己去看源码,我记得自己第一次看源码的时候,点击进去是一脸蒙 B。所以刚一开始我们需要借助前辈的力量,跟着大牛的思路去看源码,也就是大家通常所说的老司机带带我。

有几点需要提醒大家是,有些文章可能篇幅比较长,要有耐心不断反复的多看几遍。当然有时也不必在一棵树上吊死,其他树上也可以多试几次。其次我们找一些稍微靠谱一点的,阅读量多一些的文章,排版稍微好点,图文并茂的。最后,不管别人的文章写得有多好有多清晰多牛掰,始终不是我们自己的,也有可能存在 bug 。这也是我为什么建议大家看阅读量稍微高些的文章,因为有问题大家会评论提出来,会经过很多次的修正调整。我们最好自己亲身去实践,自己做做笔记或者写写文章,把它真正变成自己的知识,这样提升的速度是非常快的,屡试不爽。

以下是一些源码分析的文章,我们可以选择性的挑一些啃一啃,如果文章看不太懂还可以看看直播视频:

三.惯用套路


每个人阅读源码的思路都会有些不一样,姿势也会有所不同,下面我仅代表个人的观点谈谈我的惯用套路,假如我们想去分析 glide 这个开源库,假设现在网上的资料也没法满足我们了:

第一步会去画 UML 时序图,相信我们在分析 glide 源码的时候,刚开始可能连访问网络的码头都找不到。画时序图不光能防止我们沉入茫茫大海,还能让整个加载显示流程都非常清晰,好记性不如画流程图。

第二步会去画 UML 类图,每个第三方库在其架构设计上,都会有其值得借鉴的地方。如 retrofit 这个开源库,虽然类文件并不多,但里面的封装解耦思想,都能够在我们实际的开发过程中派上用场。

第三步会去抓细节,比如 glide 怎么压缩适配图片的,缓存怎么处理的,是如何加载 gif 图片的,怎么解析视频封面的。抓细节其实就是带着问题去看源码,我们在开发过程中遇到的很多疑问,源码会给我们很多更好的解决方案。

第四步会去参考模仿,并不是建议大家去重复造轮子,比如我们知道了 IOC 的实现原理,就能完美的解决 mvp 中多 prsenter 的情况;清楚了 RxPermission 的实现方式我们就能很轻松的写出类似 RxPay 和 RxShare 等等。

第五步会去反思现有的架构设计,我们在写项目的时候,往往由于时间的原因,只是考虑了怎么实现,能实现能按时上线就好。随着业务的不断修改增加,可能已经没有了高蛋白低脂肪。当然随着经验的增长考虑的也会多一些,但仍然需要不断的反思和学习。

四.随心所欲


当我们阅读了大量的源码和第三方开源库后,我们就能打通任督二脉,学习的速度会越来越快。当同事遇到一些棘手的 bug ,我们能从源码的角度去分析解决;一些难以实现的需求,我们也能很快的找到解决方案。这时我们要么是在大公司镀金,要么是在小公司做负责人,是真正的喜欢工作、学习和折腾。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,527评论 25 707
  • 电视连续剧《风筝》观后感: 英雄是无名的;誓言是无声的; 奉献是毕生的;使用是免费的; 尊严是没有的;自由是妄想的...
    梅鹤楼主阅读 3,244评论 0 2
  • 都镇非老师作品 缱绻两鸡并徘徊 夫妇同心共喜悲 四海八荒不分离 生生世世永相随
    独酌月下阅读 185评论 0 0
  • 是否有推荐的需求(玩原型前) 平时喜欢吃什么?日料、西餐、火锅? 推荐一家你认为最好的一家日料(以上说的一个) 你...
    安西阅读 256评论 0 0
  • 在生活中,我们听到的每一首歌,看到的每一本书,都会带给我们不一样的感受和意义。 最近我再听陈奕迅的一首歌《让我留在...
    李木木子子阅读 417评论 0 4