Android是智能手机市场上炙手可热的开源操作系统,由Google推出后现在已经升级到了4.0版,受到了三星,HTC,摩托罗拉等大手机厂商的支持,最近一两年的增长速度超过了iPhone。
和苹果不一样,Android是开源系统,因此我们每个人都可以下载它的源码,修改,编译,生成自己的系统,然后刷到自己的手机上去。对于喜欢智能手机和DIY的程序员来说,这也是非常有趣的一件事。
Android源码的下载,编译的环境要求,编译步骤在上面的链接里都有,只要按步就班去做就没问题。不过DIYer们是不能满足于只用现成的,我们需要修改系统,而且最好有版本控制,就像Android源码的Repo工具一样。下面我们就来说说如何搭建自己的Repo版本控制服务器。
首先来说说Repo是干什么的。Android是一个非常庞大的项目,里面有很多相对独立的模块,例如Java虚拟机dalvik,例如libc实现bionic,例如浏览器引擎webkit,还有各个厂商的驱动与私有代码,等等。因此,Google将Android划分成多个子项目,每个子项目是一个独立的Git仓库,然后自己用python开发了一个Repo工具来对这几百个子项目(Git仓库)进行管理。
例如你可以通过下面的命令下载repo工具,然后初始化和下载Android的源代码(其中-j16表示使用16个链接同步下载,这段代码是从Android官网上摘录的,页面是Downloading the Source Tree):
从Google下载的Repo的代码很有意思,我们忽略无关的注释,截取开头一段来看:
代码的开头是Shell脚本,但是到了第七行,就神奇滴通过这个命令exec python -E "$0" "$@"
…变成python代码,覆盖自身执行了。它利用了Python代码的长字符串”"”标记,使得第7行只会在Shell下执行,在python里就是一个常量字符串,开始的几行代码在Python和shell下都是有效的表达式。
从Google下载的repo只是一个初始化代码,通过repo init
和repo sync
,它不仅能下载Android源码,也能下载自身的最新代码。
如果我们要搭建自己的源码服务器,首先当然考虑的是Repo,不然我们自己重新构思一个多Git仓库管理的工具,也是非常麻烦的一件事。
下面我们就来看看如何利用Google的repo来管理我们自己的Android源码仓库。
首先我们需要理解repo所管理的Android代码的结构。这些结构都是在.repo/manifest.xml文件中给出的,我们给出一个例子:
在这个文件里主要的节点是remote,default和project。其中remote表示的是代码服务器的地址(fetch)和名称(name),另外还可以设定对应的审核服务器(review),当你通过repo向服务器提交代码的时候,会首先提交到审核服务器,通过了之后才能入库。当然,对于我们自己的内部代码服务器来说,一般是没有审核服务器的。
default表示的是当一个project没有设定remote属性时(例如下面的name属性为CyanogenMod/android_bionic的project节点),这个project从什么地址获取和提交代码。例如对于CyanogenMod/android_bionic项目来说,它的remote属性没有标明,因此就直接使用default的remote,即从github(git://github.com)获取代码,对应的分支是ics分支(refs/heads/ics)。
而对于name属性为platform/abi/cpp的项目来说,它则从aosp(https://android.googlesource.com/)获取代码,获取的只是android-4.0.3_r1这个标签的代码(refs/tags/android-4.0.3_r1)。另外,对于每个project来说,name对应的是远端服务器地址,path对应的是本地代码地址。例如CyanogenMod/android_bionic这个项目就是要将git://github.com/CyanogenMod/android_bionic
的Git仓库的代码同步到本地./bionic目录。除此之外,还要注意的是,我们需要将服务器的Git仓库设置为裸仓库,这样才方便提交代码(git push)。
搞清楚了项目配置文件的结构以后,我们还需要知道如何让repo获取这个配置文件。实际上,repo init的-u参数对应的就是这个项目配置文件的Git仓库地址。这个Git仓库下只需要有一个名为default.xml的文件即可,文件内容即为上述内容。
假设服务器上存放源码的根目录是$REPOROOT,服务器地址是$REPOSVR。因为我们需要同时提供代码下载与提交功能,因此可以通过SSH协议来访问Git仓库。下面是搭建和使用自有Android源码服务器的步骤: