前言
古人常说,“熟读唐诗三百首,不会作诗也会吟”,说明了大量阅读诗歌名篇对学习作诗有非常大的帮助。做开发也一样,Android源码是全世界最优秀的Android工程师编写的代码,也是Android开发中绝对的权威所在。Android系统开源,且占据了当今手机系统世界的绝大部分江山,各大手机厂商要做手机系统定制,就必须对Android系统源码非常熟悉,这就要求他们的工程师们去熟读源码。即使是纯第三方App的开发者,要想成为Android开发真正的行家里手,也必须对系统源码有一定的研究。本系列文章将记录笔者学习Android源码的理解和心得,以此来和广大的同行们进行交流和相互提升。
本篇文章是这一系列的第一篇,将主要记录或者介绍Android源码的获取,系统源码的宏观结构及内容,源码阅读工具推荐及使用方法等内容。主要内容如下:
一、Ubuntu下获取Android系统源码
Android源码的获取方式有许多,既可以在Windows下去获取,也可以Linux下去下载,比较常见的方法是在Linux下用repo工具去下载。笔者使用的方式是在Windows7系统下安装Ubuntu16.04双系统,然后采用repo工具去获取的源码。其中每一个步骤都可以在网上找到很多资料,笔者不赘述,也不自己探索方法,这里仅记录下成功安装获取源码过程中参考的网页、主要步骤以及碰到的若干问题,以供读者和笔者自己以后参考使用。基本操作步骤如下:
1、在Win7中分区
在Windows7中为Ubuntu系统分区,参考了【Win7下安装Ubuntu16.04成双系统】中第一节分区步骤。Android系统源码未编译前就有大约20-30G大小,编译后更大,所以一定要预留足够的空间。
2、制作Ubuntu U盘系统启动盘
参看网页【Ubuntu16.04安装基础入门教程】前5步。Ubutu镜像文件从Ubutu官网下载即可,不过需要注意的是,要先弄清楚下载32位还是64位的系统:在主系统Win7桌面查看“计算机”图标属性,可以看到系统的位数,如下图所示:
所以咱们在选择Ubuntu系统的时候也选择64位的。这里笔者也有一个疑问,既然这里Ubuntu和Win7是独立的双系统,那么应该没有必要两个系统的位数必须一致吧,这里笔者没有研究过,读者可以去查资料探索一下,当然,选择同样的位数总是会比较保险一点。在Ubuntu下载版本中,结尾为amd64的版本为64位系统,结尾为i386的版本为32位系统。
3、U盘启动并安装Ubuntu系统
在BIOS boot中将默认的硬盘启动修改为U盘启动,然后重启即可进入到Ubuntu的安装界面,根据需要一步一步进行即可。至于如何进入到BIOS设置界面,不同的主板快捷键不一样,笔者这里不详述,读者根据主板型号百度即可。安装成功后,记得修改回来为默认硬盘启动。
4、Ubuntu中获取源码
参考【Aosp|镜像使用帮助|清华大学开源镜像站】,笔者选择的是“使用每月更新的初始化包”。源码比较大,所以下载需要好几个小时的时间,所以最好在晚上下载,避开网络使用高峰期。
5、碰到的问题记录
(1)安装完Ubuntu后,再重启时,系统选项中找不到原Win7系统。
安装好Ubuntu后,我们希望在启动电脑的时候出现一个系统选项,选择是进入原Win7系统还是新安装的Ubuntu系统。如提问中描述,找不到Win7系统选项入口,就无法进入到原来的Win7系统中。这种情况,请参考【Win7系统安装Ubuntu系统后,不能进入Win7】。笔者曾多次碰到过这个问题,以为是把原Win7系统给覆盖掉了,走过不少的弯路,后来找到链接中的方法才解决。
二、Android源码目录结构
Android系统源码内容实在太广,其目录结构也实在庞大,每位开发者也无法做到对每一块都弄明白,工作中接触的也只是其中的一小部分。以下只从宏观上对系统源码的一级目录进行介绍,后续再慢慢完善更细致的内容。
三、Android系统架构和源码的联系
在笔者以前的博客Android性能 Android虚拟机第二大点中简单介绍过Android的系统架构,其实在Native Libraries层和Linux Kernel层之间还有一层——HAL层,即Hardware Abstract Layer,硬件抽象层。在众多介绍Android系统架构的展示图中,有的版本显示HAL,有的没有,读者知道有这一层就好了。如下为Android源码官网【AOSP:Android Open Source Project】中Android系统架构图,就展示HAL。
对于Android系统架构每一层,Android源码结构中都有相关目录与之对应。下图展示了在Android源码一级目录中,各框架层和部分目录的对应关系:
理解Android系统结构和Android系统源码的对应关系,有助于帮助咱们理解Anroid系统源码。当然,这幅思维导图中只介绍了源码一级目录和系统架构的对应关系,深入各个目录,每个系统架构层还可以找到很多源码与之对应,读者可以再深入研究研究。与此同时,同一个目录下的源码,也可能涉及多个系统架构层的内容,比如,frameworks层中就有frameworks/base/packages/SystemUI这个目录,众所周知,SystemUI是一款系统App,是属于应用层的。所以,对某个目录的对应的系统架构层,也不能一概而论。
四、Android源码阅读工具介绍
选择好的源码阅读工具,可以让工作事半功倍。如今市面上有许多工具来辅助阅读源码,有在线阅读的,比如:AndroidXRef、Android SDK Search等;也有本地阅读的,比如:Source Insight等。同时,Google也提供了官方网站,用于指导开发者使用源码:【AOSP文档网站(中文版)https://source.android.google.cn/】
1、AndroidXRef
前文也说过,Android源码非常庞大,下载源码也是非常耗用时间。我们可能经常碰到需要临时查看源码,而当前设备上没有的情况。幸运的是,有一些在线阅读源码的网站,给开发者带来了很大的便利,AndroidXRef就是其中一款备受青睐的源码在线阅读网站【网址:http://androidxref.com/】。在这里,笔者简单介绍一下该网站的基本使用。
(1)查看并选择系统版本
进入首页后,可以看到Google发布的各个系统版本,按照发布时间排序,包括版本别名,版本号,内核号等,如下图所示,开发者可以根据需要点击进入对应的版本。
(2)源码查找主界面功能点
(3)搜索条件的解锁及使用
1)Full Search
进行全文搜索,属于模糊查询,忽略大小写,会匹配所有的单词、字符串、标识符以及数字等,包括注释在内。如下图所示,为全文搜索“Activity”的结果,也显示了所在文件的路径,可以点击进入对应的文件。
2)Definition
搜索符号定义相关的代码。如下所示,同样输入“Activity”后,显示的搜索结果,“Activity”都是作为包名、类名或定义类型,方法名等出现的,可以和上面Full Search结果做对比。多次尝试搜索的结果来看,这里会区别大小写,搜索的也是整个单词,这里搜索会更精准一些。
3)Symbol
符号搜索,主要用于搜索类中的成员变量等,也是精确查找,如下图所示,就是根据成员变量“FEATURE_NO_TITLE”搜索的结果。
4)File Path
搜索源码文件名或路径中包含搜索条件字符串的文件,忽略大小写。如下所示,显示了文件路径或文件名中包含了“Activity”的结果。
5)History
该条件暂时没发现怎么使用,有写帖子上甚至直接说该条件没用,这里笔者不做说明,也不举例了。
该部分能够帮助开发人员快速定位到想要查看的代码,熟练使用,能极大地提高效率。上述介绍的都是单一条件搜索,开发人员可以根据实际情况对条件进行组合搜索,这样搜索起来就更精准了,使用起来很简单,这里不再举例子了。
2、Android SDK Search
该工具使用起来使得在线阅读源码更方便,将API和源码完美结合起来。但是使用该工具,需要VPN,即需要FQ,访问境外服务器。这里笔者就不详细介绍了。另外提供一个免费FQ工具,简单易用:【蓝灯(Lantern)】。
3、Source Insight
这是一款被开发者们广泛使用和称赞的本地源码阅读软件,除了阅读,还可以方便地进行开发。Source Insight工具功能强大,操作复杂,以后会专门写一篇文章来介绍它的使用,这里篇幅有限,就不详细介绍了。除此之外,还有很多开发工具可以用来阅读源码,比如Eclipse,Android Studio等都可以用来阅读系统源码,但这方面的功能无法和Source Insight相提并论,就不多做介绍了,把使用最广泛,最专业的工具用好就可以了。
五、附录:Andriod源码下载地址分享
1、android-6.0.1_r72
链接:https://pan.baidu.com/s/1jq_Op-iFtk53PonHd3aadA 提取码:vfg1
2、android-7.1.1_r1
链接:https://pan.baidu.com/s/1yb1jPBl471W8AbdO2056rg 提取码:v32i
3、android-8.0.0_r1
链接:https://pan.baidu.com/s/1EsXV75Yd9UYKyCn-THGFgQ 提取码:c1w8
4、android1.6-8.1