第25章 Android式多版本库协同

Android是谷歌(Google)开发的适合手持设备的操作系统,提供了当前最吸引眼球的开源的手持设备操作平台,大有超越苹果(Apple.com)专有的iOS系统的趋势。而Android的源代码就是使用Git进行维护的。Android项目在使用Git进行源代码管理上有两个伟大的创造,一个是用Java开发的名为Gerrit的代码审核服务器(将在第5篇第32章专题介绍),另外一个就是本章要重点介绍的repo。

repo是一个用Python语言开发的命令行工具,可以更方便地进行多版本库的管理。先来看看Android到底包含了多少个Git库:

Android的版本库管理工具repo。


git://android.git.kernel.org/tools/repo.git


保存GPS配置文件的版本库。


git://android.git.kernel.org/device/common.git


160多个其他的版本库(截至2010年10月)。

如果把160多个版本库都列在这里,恐怕各位的下巴都会掉下来。那么为什么Android的版本库会有这么多呢?怎么管理这么复杂的版本库呢?

Android版本库众多的原因,主要是版本库太大,以及Git不能部分检出。Android的版本库有接近2个GB之大。如果把所有的东西都放在一个库中,而某个开发团队感兴趣的可能就是某个驱动,或者是某个应用,却要下载如此庞大的版本库,是有些说不过去。

好了,既然接受了Android有多达160多个版本库这一事实,那么Android是不是用之前介绍的“子模组”方式组织起来的呢?如果真的用“子模组”方式来管理这160多个代码库,可能就需要如此管理:

建立一个索引版本库,在该版本库中,通过子模组方式,将目录一个一个地对应到这160多个版本库。

对此索引版本库执行克隆操作后,再执行git submodule init命令。

当执行git submodule update命令时,开始分别克隆这160多个版本库。

如果想修改某个版本库中的内容,需要进入到相应的子模组目录,执行切换分支的操作。因为子模组是以某个固定提交的状态存在的,是不能更改的,必须先切换到某个工作分支后,才能进行修改和提交。

如果要将所有的子模组都切换到某个分支(如master)进行修改,必须自己通过脚本对这160多个版本库一一进行切换。

Android有多个版本:android-1.0、android-1.5、……、android-2.2_r1.3……如何维护这么多的版本呢?也许索引库要通过分支和里程碑,与子模组的各个不同的提交状态进行对应。但是由于子模组的状态只是一个提交ID,如何能够动态地指定到分支,真的给不出答案。

幸好上面只是假设。聪明的Android程序设计师一早就考虑到了Git子模组的局限性,以及多版本库管理的问题,开发出了repo这一工具。

关于repo有这么一则小故事:Android之父安迪·鲁宾在回应乔布斯关于Android太开放导致开发维护更麻烦的言论时,在Twitter[1]上留了下面这段简短的话:


the definition of open:"mkdir android;cd android;repo init-u

git://android.git.kernel.org/platform/manifest.git;repo sync;make"


是的,就是repo让Android的开发变得如此简单。

25.1 关于repo

repo是Google开发的用于管理Android版本库的一个工具。repo并不是用于取代Git,而是用Python对Git进行了一定的封装,简化了对多个Git版本库的管理。对于repo管理的任何一个版本库,都需要使用Git命令进行操作。

repo的使用过程大致如下:

(1)运行repo init命令,克隆Android的一个清单库。这个清单库和前面假设的“子模组”方式工作的索引库不同,是通过XML技术建立的版本库清单。

(2)清单库中的manifest.xml文件,列出了160多个版本库的克隆方式。包括版本库的地址和工作区地址的对应关系,以及分支的对应关系。

(3)运行repo sync命令,开始同步,即分别克隆这160多个版本库到本地的工作区中。

(4)同时对160多个版本库执行切换分支操作,切换到某个分支。

[1]http://twitter.com/Arubin