看源码底层,没个几年经验还是算了吧

前言
很多人可能都有过看源码的困惑,不知道如何开始,或者不知道应该从哪个部分开始看起。其实,看源码是一个非常好的学习和理解的过程,对于提升自己的编程技能,理解项目的设计原理,甚至帮助你找到项目的Bug,都有极大的帮助。但是一般人对于源码的感觉就是和天书差不多,没有一定的经验很难看进去,那是你的方法不对,今天我们就来谈谈为什么看源码很重要,以及如何看源码(方法)。
一、为什么要看源码
-
理解项目原理:看源码是理解项目工作原理的最直接方式。通过阅读源码,你可以知道项目是如何工作的,比如它的数据结构是如何设计的,它的功能是如何实现的,它的错误处理是如何进行的。
-
提升编程技能:阅读源码可以帮助你提升编程技能。源码中会有很多优秀的编程技巧和设计模式,阅读它们可以帮助你提升你的编程技能。
-
优化项目性能:理解项目的工作原理,可以帮助你优化项目的性能。比如,你可能会发现某个地方的代码效率低下,你可以通过阅读源码,找出问题,并进行优化。
-
学习优秀代码:源码中常常包含着优秀的代码。阅读它们,可以让你学习到优秀的编程风格和设计模式。
-
发现Bug:阅读源码还可以帮助你发现项目的Bug。因为如果你能理解项目的原理,那么你就更有可能发现项目中可能存在的问题。

二、如何看源码呢?
以下是几种常见的方式:
-
由简入繁:如果你对源码的代码一无所知,那么你可以从一些简单的部分开始看。比如,你可以从源码的入口函数开始,然后再逐渐深入。
-
了解项目背景:在阅读源码之前,你可以先了解一下项目的背景和目标,这样可以帮助你更好地理解源码的设计原理。
-
使用调试工具:调试工具可以帮助你跟踪代码的执行过程,找出代码的问题。比如,你可以使用Java的JDB,或者C的GDB。
-
创建索引:创建一个源码的索引可以帮助你更好地理解源码的结构。你可以在源代码文件的开头添加一个简单的注释,描述这个文件的功能。
-
逐步深入:不要试图一次性理解所有的源码。你可以先理解一些关键的部分,然后再逐渐深入。

三、具体的方式
看源码是一个需要耐心和毅力的过程,但是只要你坚持下去,你一定能从中学到很多。
关于查看源码,可以使用Android Studio、Eclipse、Sublime、Source Insight等软件,这里我推荐使用Source Insight,但是有的同学可能不是很习惯,而且Source Insight是Windows平台的软件,Mac平台用不了,那么使用Android Studio是一个不错的选择,而且使用Android Studio还可以调试源码。这篇文章就来介绍Source Insight和Android Studio如何导入源码。
1. Source Insight导入系统源码
Source Insight只能查看源码,不能调试源码,如果只想在Source Insight中查看源码,可以直接从百度网盘:https://pan.baidu.com/s/1ngsZs 将源码下载下来。如果想在Android Studio中查看源码,那么最好还是在Linux环境下将AOSP源码下载下来。
新建源码项目
安装软件后,首先要新建源码项目。通过菜单项Project→New Project会弹出提示框。

这里我们指定源码项目的名称为Android_8.0.0,然后点击OK按钮进入“New Project Settings”界面。

上图箭头指向的Browse按钮来选择本地系统源码所在的路径,比如我的系统源码路径为:D:/Android/android-8.0.0_r1 。选择好加载路径后点击OK按钮会进入“Add and Remove Project Files”界面,在这个界面可以向项目中添加整个Android系统源码,也可以只把源码部分目录添加到项目中,以后再根据需要添加其他目录。如果向项目添加整个Android系统源码加载时会非常慢,这里我们只添加如下源码目录:frameworks/、libcore/、packages/、system/、art/和libnativehelper/,这几个目录基本上可以满足日常的系统源码阅读了,如下图所示。

点击Add Tree按钮就会将选择的目录源码加载到Android_8.0.0项目中,这个时候会弹出加载进度条,加载完毕后点击窗口的关闭按钮就可以了。
定位文件
Source Insight的定位文件功能十分强大,我们只需要知道源码文件名就可以轻松找到它,比如我们要找MediaPlayer.java,只要在文件搜索框输入MediaPlayer.java即可:

全局搜索
Source Insight另一个好用的功能就是全局搜索,默认快捷键为:CTRL+/,或者点击最上面工具栏类似R的图标。在Search in的输入选项中我们可以自定义搜索的范围,比如我们想查找所有Java文件中引用MediaPlayer类的情况,就可以像下图一样进行操作。

当然,Source Insights的功能远不只以上几种,相信随着使用次数的增多,你就会熟练掌握它的大部分功能,这里就不过多介绍了。
2. Android Studio导入系统源码
Source Insight导入源码不需要对源码进行编译,但是Android Studio导入整个系统源码需要对源码进行编译,生成AS的项目配置文件。
生成AS的项目配置文件
如果你整编过源码,查看out/host/linux-x86/framework/idegen.jar是否存在,如果不存在,进入源码根目录执行如下的命令:
source build/envsetup.sh
lunch [选择整编时选择的参数或者数字]
mmm development/tools/idegen/
如果没整编过源码,可以直接执行如下命令单编idegen模块:
source build/ensetup.sh make idegen
关于Android系统源码的编译可以查看如何方便快速的整编Android 9.0系统源码? )这篇文章。
idegen模块编译成功后,会在 out/host/linux-x86/framework目录下生成idegen.jar,执行如下命令:
sudo development/tools/idegen/idegen.sh
这时会在源码根目录生成android.iml 和 android.ipr 两个文件,这两个文件一般是只读模式,这里建议改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况。
sudo chmod 777 android.imlsudo chmod 777 android.ipr
配置AS的项目配置文件
由于要将所有源码导入AS会导致第一次加载很慢,可以在android.iml中修改excludeFolder配置,将不需要看的源码排除掉。等源码项目加载完成后,还可以通过AS对Exclude的Module进行调整。如果你的电脑的性能很好,可以不用进行配置。 在android.iml中搜索excludeFolder,在下面加入这些配置。
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />
导入系统源代码到AS中
在AS安装目录的bin目录下,打开studio64.vmoptions文件,根据自己电脑的实际情况进行设置,这里修改为如下数值:
-Xms1024m-Xmx1024m
如果你是在VirtualBox中下载的系统源码,那么将VirtualBox中的系统源码拷贝到共享文件夹中,这样源码就会自动到Windows或者Mac上。 通过AS的Open an existing Android Studio project选项选择android.ipr 就可以导入源码,这里我用了大概7分钟就导入完毕。导入后工程目录切换为Project选项就可以查看源码。

配置项目的JDK、SDK
由于我们下载的是9.0的AOSP源码,SDK版本也应该对应为API 28,如果没有就去SDK Manager下载即可。 点击File -> Project Structure–>SDKs配置项目的JDK、SDK。 创建一个新的JDK,这里取名为1.8(No Libraries),删除其中classpath标签页下面的所有jar文件。

接着设置将Android SDK的Java SDK设置为1.8(No Libraries),这样Android源码使用的Java就是Android源码中的。

确保的项目的SDK为源码对应的SDK。

Exclude不需要的代码目录
File -> Project Structure -> Modules中可以通过Excluded来筛选代码目录,比如我们选择bionic目录,点击Excluded,bionic目录会变为橙色,bionic字段会出现在右侧视图中,说明该目录已经被Excluded掉,通俗来讲就是被排除在工程之外。如果不希望bionic目录被Excluded掉,再次点击Excluded,bionic目录会变为灰色。

总结
这篇我们学习了Source Insight和Android Studio导入系统源码的方法,但是具体的查看源码的细节就需要在使用中逐步去掌握,
针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、架构师课程、NDK、车载开发、Framework源码揭秘、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
完整资料可以扫码免费领取!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
