稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

如何玩转安卓源代码

身为一个安卓开发者,除了学习应用开发以外,安卓本身的源码也是必须要玩一玩的,因为安卓系统的源码中还有相当不错的东西值得去学习的。官方的网站(AOSP)就是专门为安卓源码相关而搭建的,换句话说想玩转安卓的源码,看这个网站就可以了。本篇重点讲一讲,如何玩转安卓源码,从环境搭建,到下载源码,到编译,以及源码的学习和查看。

好好的为啥折腾源码

再多废话几句,安卓源码也即安卓操作系统的源码,它是由Google开发的移动智能设备的操作系统,完全开源,市面上的大部分手机都是安卓 手机,详细的可以看官方网站的介绍

一般来说,除非是手机厂商或者ROM开发人员,否则作为一个应用开发者来说,跟源码直接打交道的时候比较少,更多是出于学习的目的才需要折腾源码,或者是出于折腾的目的,想搞一个自定义的ROM。因为源码文件非常大,几十个G,下载源码不但耗时而且消耗硬盘空间,编译也非常的慢,编译一个ROM需要二个小时左右。

基础工具和开发环境搭建

最基础的工具,常规的开发者应该都满足,这个可以参考官方文档,基本无大碍。像git和Python,开发者的电脑上应该都有,那么基础中的基础就够了。

repo工具

需要重点说一下repo工具,它的官方文档在这里

因为安卓源码非常庞大,涉及几百个开源项目,如果像普通的项目那样,用一个git的仓库来管理不现实,因为文件特别特别多,如果直接用git,可能一下子就卡死了;除文件特别多以外,虽然有上百个项目,但是不同的项目之间的关系程度并不大,有些项目之间完全没有关系,有些虽然有依赖,但是也没有源方面的直接依赖。所以,其实每个项目都是一个独立的git仓库,单独版本管理,安卓整体的源码就是这些项目的集合,用一个配置文件(manifest.xml)来描述,这个文件里面写着有多少个项目,每个项目的仓库在哪里,以及使用哪个分支。

因为项目复杂,有单独的配置文件,所以也就是需要一个工具,这就是repo工具,它会根据manifest文件,来协助管理源码。repo的原理也不复杂,它就是一个Python脚本,操作git命令。如何使用repo就直接看它的帮助文档就可以了,文档相当详细,这里就不重复了。

1
2
repo --help
repo help init|start|sync|upload

如何优雅的下载源码

可以参考官方文档,就不重复了,输入以下命令,然后漫长等待就可以了:

1
2
3
4
mkdir aosp
cd aosp
repo init -u https://android.googlesource.com/platform/manifest
repo sync

如果网络都正常的情况下,执行上面的命令后,等待就可以了。但是不要too yong,too simple,因为『你懂得』的原因,上面的命令是无法成功的,即使你有梯子,也会很慢,而且源码几十个G,白白浪费这流量干嘛呢?要学会站在巨人肩膀上,不知尔等发现没有,凡是国外一些源码啊,软件库啊,在国内都是有镜像的,以应对一些网络不好的情况,比如像Ubuntu的软件库,像Ruby的源。是的,安卓源码,在国内也是有镜像的,我们直接从镜像网站下载,不但不会有网络连接问题,而且速度非常的快,十分钟就可以下完。

比较好的镜像有清化大学的镜像中科大的镜像。具体镜像怎么使用,看相应的主页上面就可以,都有介绍的。

搭建OpenGrok来浏览代码

如上面所说的安卓源码是非常庞大的,所以浏览源码是相当费劲的,光靠find+grep+vim也是可以,但是效率太低了,源码中的交叉索引,函数调用栈这些东西如果 没有像IDE一样专业的工具来看,还是相当的蛋痛的。当然 啦,也可以用Eclipse或者AndroidStudio或者SourceInsight把某些模块导入去来查看,这也是可以的,但是如果只看某个模块还是可以的。如果多了的话IDE也扛不住。

这里就需要用到专业级别的交叉索引工具了,比如OpenGrok这是一个开源的代码交叉索引引挚,相当强大,特别适合像安卓源码这种超级庞大的项目。折腾起来也不算费劲,要先安装tomcat,可以考这篇文章,相当详细。

这里需要说一下可能遇到的坑,因为安卓 源码文件数量相当庞大,这里的意思是不但整体占用硬盘空间大,而且文件数量也非常非常的多,OpenGrok的安装运行时间特别长,因为它要过一遍源码生成交叉引用所需要的cache,综合起来的结果 就是,整体会占用非常大的磁盘空间(可能会上百G),以及特别特别特别多的文件,你至少需要准备一个500G以上的硬盘,否则会出现一个致命的问题,不是简单的磁盘满了,而是文件系统的inode数满了,简单来理解就是每个文件在内核看来是一个inode,它与文件所占的空间类似,一块硬盘分区的空间是有限的,当达到一定限额后将无法再存储新的文件,文件系统的inode也是如此,当一块硬盘达到80%以后,便无法再添加新文件,整体文件系统将不可操作,对,连删除文件都无法进行,这个时候没有别的办法,只能重新装系统,相当麻烦。

如何编译

编译的话,最好选择Ubuntu的LTS版本,如LTS14.04,因为这个是用的比较多的,像Google自己以及很多厂商的编译服务器也都基于Ubuntu LTS来搭建的,这样可以避免很多烦人的问题。之后再安装一些交叉所需要的库就可以了,这个follow官方文档就可以了,比较详细。

具体的编译的话,也是一样的,直接follow官方文档就好了,人家写的非常详细也相当的专业,没有必要重复。

如何刷机

这个都是用fastboot这个工具,可以参考官方文档不过现在除非是厂商的工程机,否则折腾解锁也比较麻烦,可以到厂商的论坛以及像XDA上面多逛逛。

不过,如果有亲儿子的话,还是比较好折腾的,官方文档上面就有相应的方法,以及一些带有版权的BSP依赖包,可以刷起来玩一玩。

优雅的读代码

如果不想编译自定义的ROM,就是想看看源码的话,其实没有必要这么费劲的折腾,把代码下载下来不但费时费力,慢,而且还不是最新的代码。当然是有有更好的方式,有好多在线的源码查看工具。

  • 官方source. 这个是官方的版本管理的在线浏览,不是很方便,不够强大(比如没有交叉索引),而且速度不快,还需要翻墙
  • androidXef. 这个基于OpenGrok搭建的,在线浏览安桌源代码的在线工具,但是貌似2018年以后就不更新了,上面最新的版本是Android Pie。速度也不算快,但好在能查看好多个版本。
  • 官方code search 这个是2019年Google新推出的查阅安卓源码的在线工具,速度非常快,貌似不是基于OpenGrok,相当好用,推荐直接看这个。

拓展资源

除了安卓源代码以外,还有一坨资源可以看,像芯片厂商也会发布相当多的源码,比如像高通就有安卓源码相在的一坨源码,高通芯片的手机基本上也都有基于这些代码进行二次开发,所以也非常值得一看。

Comments