2.1.2 源代码获取
Android的源代码是用Git[1]来进行管理的。Git是一款高效的源码管理工具,关于它的特点和具体指令,可以参见其官网。为了更好地进行源代码管理操作,Android基于Git封装了一个工具,叫做Repo。它隐藏了较为繁琐的Git指令细节,帮助开发者更方便地进行源码的同步。
按照以下步骤,可以下载并配置好Repo:
$cd~
$mkdir bin
$curl http://android.git.kernel.org/repo>~/bin/repo
$chmod a+x~/bin/repo
有了Repo,就可以开始下载源代码了。首先,需要建立一个Android工作目录(本书的后续内容,均以粗体的MY_ANDROID代表该工作目录):
$mkdir MY_ANDROID
$cd MY_ANDROID
如果是想同步版本库中最新的源代码,可以按照如下指令,在Android工作目录MY_ANDROID中初始化版本库:
$repo init-u git://android.git.kernel.org/platform/manifest.git
类似地,如果期望同步特定分支上的源代码,可以通过-b参数来指定分支的版本或别名,比如,同步cupcake(即Android 1.6)分支上的最新代码,可如下执行:
$repo init-u git://android.git.kernel.org/platform/manifest.git-b cupcake
在初始化版本库的工作完成以后,就可以使用同步指令,将源代码同步更新到本地:
$repo sync
如果是首次在工作目录下调用该指令,它会将源码库中指定版本的文件完整地下载到本地,而日后再执行该指令,则会和本地已有文件做比较,将更新的部分同步并进行合并。
Android的源代码大小约为2GB,为了给后续工作留出充足够的余量,建议最好准备6~10GB空间,以及1.5GB的内存空间。在硬盘容量动辄上百GB的今天,这个需求并不算太过分。
通过上述方法获取到的源代码,包含了Android应用层、框架层、运行时和底层类库的所有代码,可以用来编译出运行在模拟器上的Android ROM,以及相关的开发工具。但是,这份源代码并不能编译出可以在真实设备上运行的ROM,因为还缺少了Linux操作系统层和硬件抽象层相关的代码。如果你希望为自己或他人的手机打造一份印有自己Logo的Android ROM,那么需要将这些缺失的内容(可能是源码,也可能是已编译好的类库和资源)同步至本地[2]。
包含在Android源代码库中的其他所需代码,可以通过修改工作目录MY_ANDROID下的.repo/local_manifest.xml来让源码管理工具帮你同步。比如,添加Linux的核心代码以及厂商提供的一些开源的设备相关模块,可以将local_manifest.xml修改如下[3]:
<?xml version="1.0"encoding="UTF-8"?>
<manifest>
<project path="kernel"name="kernel/msm"revision="refs/heads/android-msm-2.6.29-donut"/>
<project path="vendor/htc/common-open"name="platform/vendor/htc/common-open"revision="master"/>
<project path="vendor/htc/dream-open"name="platform/vendor/htc/dream-open"revision="master"/>
<project path="vendor/htc/prebuilt-open"name="platform/vendor/htc/prebuilt-open"revision="master"/>
<project path="vendor/htc/sapphire-open"name="platform/vendor/htc/sapphire-open"revision="master"/>
<project path="vendor/qcom/android-open"name="platform/vendor/qcom/android-open"revision="master"/>
<project path="vendor/qcom/proprietary-open"name="platform/vendor/qcom/proprietary-open"revision="master"/>
<project path="vendor/pv-open"name="platform/vendor/pv-open"revision="master"/>
<project path="vendor/aosp"name="platform/vendor/aosp"revision="master"/>
<project path="hardware/htc/dream"name="platform/hardware/htc/dream"revision="master"/>
</manifest>
其中,project单元中的path属性指明了同步到本地的文件夹位置;name属性指的是源代码位于源码库(http://android.git.kernel.org/)的相对路径;revision则对应源码库中具体版本的信息。通过这样的xml配置文件,你可以将高通芯片的Linux核心代码同步到本地的kernel目录,并把厂商硬件相关的代码同步至vendor或者hardware文件夹中。
[1]Git的官网是:http://git-scm.com/。
[2]这些内容可以从Android的源码库(http://android.git.kernel.org/)或者设备厂商的网站(比如HTC的手机可以查看http://developer.htc.com/adp.html)中找到;如果没有,就可能需要自己动手来编写了。
[3]请参考:http://code.google.com/p/android-development-environment/wiki/EclaironADP1andADP2。