最近的一段时间里,我在研究 Android 配套工具和 Android Studio 相关的实现,以及它们如何配合完成一个 APK 的构建。由于整个系统各个模块之间的关系过于复杂,除此,不一样模块之间也包含了大量的代码 —— 不管是从行数上,仍是从函数长度上来讲。编程
从整体的思路上来讲,在进入代码阅读以前,咱们须要:微信
理解代码背后的业务流程架构
理解架构设计的思想框架
从而咱们才能理解主流程(脉络)。针对于此,咱们会发现一些不一样的模式:编程语言
借鉴他人。从他人的学习笔记中,理解总体的思路和过程。如 Android APK 的构建,Android 资源如何优化,从中理清代码阅读的思路。编辑器
源码学习。ide
借助测试调试。函数
fork 主流程。工具
它们并非互相独立的,每每是结合一块儿使用的。单元测试
借鉴他人
这种模式,能够实现快速地学习。它存在的一些明显的缺点是:
学到的东西是二手加工过的。
部分的代码可能与真实的情形脱节。
因此,它适用于你想快速了解某一部分的功能,从而了解全貌,随后咱们就能够深刻某一部分进行了解。
在这种模式之下,我推荐:经过购买、阅读书籍的方式来学习。若是能买到书即是一件幸运的事,由于它已经通过了系统性的加工。惟一的问题多是上面的代码有些老旧。可是,它更加的系统化、完整,方便咱们理解,并减小搜索资料的成本。
为何不是网上找资料?:
找资料须要投入时间成本
资料不必定详细
若是你能直接找到详细的资料,毕竟花费的时间足够短的话,那么也是没问题的。
源码学习
源码学习是一个须要花费大量时间和精力的事情,除非万不得已,不然我也不想用这种方式。由于,咱们会缺乏大量的上下文,这些上下文可能致使咱们理解出现一些偏差。
前期准备:
合适的工具。最好是~~收费的()~~能用上的。
合适的存储空间。像 Android 这样的系统,clone 下来就要 120G,编译的话,估计得达到 200G 吧;而像 Android Studio 的源码,clone 下来也要 60G。
寻找阅读的模式。
尝试去构建应用。它不必定可行,可是若是能够的话,会节省你大量的时间。
源码学习是一个很是重的学习模式。咱们要花费大量的时间:
在代码间跳转
梳理业务逻辑
因此,还有一些不错的犯懒的姿式:
经过书籍来增强。我一直以为对于学习来讲,阅读书籍是最理想的方式。由于寻找资料须要成本,而多数的书都会起到一个索引的目的。
寻找类似的轮子。一个有意思的技术,必然有不少公司、不少人都研究过。他们都会尝试去创造相似的轮子。惟一的问题是,咱们要学习到什么程度,若是只是理解的话,那么看看别人重复的轮子也是能够的;若是是为了深刻的话,那么还得回过头去看看源码
借助测试调试
对于调试来讲,咱们还会面临的一个挑战是:诸如我这样的入门级 MBP 配置,对于大型系统来讲编译根本不够用。应对这种问题的一个比较良好的姿式是:经过 IDE 调试测试来完成对部分代码的调试。(PS:这种方式也适用于业务代码的开发)
若是咱们能够在应用的入口中建立某一模块对应的测试,那么咱们就能够快速调试整个应用了。
fork 主流程
对于我来讲,我以为只阅读源码是一种只为了解决一时问题的方式。同时,像我这样的凡人,对于某些知识和内容,只要不使用,我可能隔个十天半个月,我就忘光了(虽然我一直以为这是一件好事)。
边阅读代码,边 fork 项目,咱们还会有一些挑战:
语言的熟练度和模式。对于熟悉的语言来讲,好比平常编写业务代码的时候,咱们并不须要理解于诸如类加载器、元编程、字节码这一类的复杂模式。
新的框架、工具或语言的学习成本。好比,我在过程当中就遇到须要理解和学习 Gradle 插件的一些构建机制。
代码中大量的、无用的异常处理的代码。
别人的代码都是 。(PS:一个月后本身的代码也是屎)
因此,还有一些模式:
划分模块边界。寻找架构图,经过架构图来划分模块。
切片化运行。一个模块,一个模块来理解整个系统。如 IDEA 插件的编写、IDEA 插件与 Gradle 如何交互,Gradle 插件的原理与编写,Gradle 如何调用其它命令行工具,命令行工具的原理与编写。
经过测试运行。如针对于 ApkAnalyser 这样的工具,咱们能够经过单元测试而非构建一个 CLI 的方式来运行。
选择另一门语言。由于别人用 Java、Groovy、Kotlin 编写的应用,若是你用 Rust、Go 再写一遍的话,那么你就能一次学到两个东西了:一个是新的编程语言,一个是这个开源项目的代码。
README 输出
为了方便咱们查阅和其余/她人使用,我每每会把相关的内容记录到项目的 README 上。
相关的文档资料
类似的开源项目
过程当中的内容产出
代码简要说明
……
这样一来,其余/她人在学习的过程当中还能 GET 到类似的思路。
结论
最后,简单作一些成本对比:
模式 | 成本 | 性价比 | 主要场景 |
---|---|---|---|
借鉴他人 | 低 | 高 | 学习 |
阅读源码学习 | 高 | 低 | 理解思想 |
fork 主流程 | 高 | 低 | 理解、模仿 |
借助测试调试 | 较高 | 中 | 理解、模仿 |
一些结合模式:
阅读二手资料,根据二手资料理解主脉络
编写主流程调用链,理解架构设计理想
借助开源软件的测试调试,理解参数及流程
……
本文转载自微信公众号「phodal」,能够经过如下二维码关注。转载本文请联系phodal公众号。
【编辑推荐】
【责任编辑:武晓燕 TEL:(010)68476606】