18

如何玩转安卓源代码

 4 years ago
source link: http://toughcoder.net/blog/2020/03/12/play-with-android-source-code/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

BZzuiaQ.jpg!web

好好的为啥折腾源码

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

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

基础工具和开发环境搭建

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

repo工具

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

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

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

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

如何优雅的下载源码

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

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,相当好用,推荐直接看这个。

拓展资源

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK