懒人一个,最讨厌英文文档,可惜中文教程又都残缺不全,只好自己动手翻译一个,第一次翻译,各种错误,翻译不当之处希望大家指出。
原文地址:http://source.android.com/source/downloading.html
Android源码被托管在Git库中,由Google负责维护。这份文档描述了如何下载源码树中明确的代码行。
安装Repo
Repo是一个可以使你更方便地在Android环境中使用Git的小工具。想要了解更多关于Repo的信息,可以看Developing这一节
安装Repo的方法
1、 在你的home目录下创建一个bin/目录,然后把它包含到你的路径中
$ mkdir ~/bin
$ PATH=~/bin:$PATH
2、 下载Repo工具并确认它可以被执行
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo $ chmod a+x ~/bin/repo
初始化Repo客户端
Repo初始化完毕之后,设置你的客户端去访问Android源码库
1、 创建一个空的目录来保存你的工作文件。如果你使用MacOS,那么这个必须使用一个区分大小写的文件系统。你可以取任何你喜欢的名字:
$ mkdir WORKING_DIRECTORY $ cd WORKING_DIRECTORY
2、 运行repo init,获取最近版本的Repo,这个版本的Repo已经修复了最新的Bug。你必须明确给出manifest文件的URL,这个文件具体说明了包含在Android源码中的不同的库将放在你的那个工作目录下
$ repo init -u https://android.googlesource.com/platform/manifest
查看某个分支版本而不是最新版本,使用-b命令说明
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
3、 当出现提示时,用你的姓名和邮件地址配置Repo。为了使用Gerrit代码审查工具,你需要一个与注册的Google账户相关联的的邮件地址。确认你输入的是一个可以接收邮件的地址。当你提交代码时,将显示你在这里配置的姓名。
当初始化完成之后,将会有一个提示信息告诉你Repo已经对你的工作目录初始化完毕。你的客户端目录下会包含一个.repo的目录,这个目录用来保存manifest等文件。
下载Android源码
如果按照默认的manifest配置从源码库中下载Android源码,只需要运行
$ repo sync
Android源码文件将会被放置在工作目录中的工程名字下。最初的Sync操作可能会花费一个小时甚至更多时间来完成与那妈的下载。关于repo sync命令以及其他的Repo命令,可以查看Developing一节
使用授权证书
在默认情况下,用户是匿名访问Android源码的。为了保护服务器不被过分使用,每个IP被分配了一定的限额。
当一个IP与其它人共享时(例如通过NAT防火墙访问Android源码),配额限制甚至会被一些正常的行为触发。(比如,如果许多用户在极短的时期内用同一个IP同步新的客户端)
在这种情况下,可能就需要使用授权访问了。采用这种方式,每个用户的限额相互独立,不受IP地址的影响。
第一步,你需要到the password generator创建一个口令,然后按照那个页面上所说的把口令保存在~/.netrc目录下
第二步,通过使用下面的manifest URI使用强制授权访问https://android.googlesource.com/a/platform/manifest
。注意把 /a/
目录放在前面以触发强制授权访问。你可以用下面的命令转换一个存在的客户端使用授权访问:
$ repo init -u https://android.googlesource.com/a/platform/manifest
检修网络问题
当通过代理下载源码时(在公司环境中很普遍),必须明确说明Repo使用的代理
$ export HTTP_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>
$ export HTTPS_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>
在极少情况下,Linux客户端会遇到连接问题,在下载过程中出现阻塞(比较典型的是在 "Receiving objects"期间)。当TCP/IP栈的配置有问题时会报告阻塞问题,通过使用non-parallel commands可以改进这种状况。你需要root权限来修改TCP设置:
$ sudo sysctl -w net.ipv4.tcp_window_scaling=0
$ repo sync -j1
使用本地镜像
当有数个客户端需要同步,特别是在带宽不足的情况下,更好的选择是创建一个包含服务器全部内容的本地镜像,并且让客户端从镜像中同步(这个不需要网络访问)。下载一个镜像比下载两个客户端更小,然而却包含更多信息。
在下面的介绍中我们假定镜像被创建在 /usr/local/aosp/mirror
目录下。首先我们需要创建并同步镜像自身,这个需要大概13GB网络带宽和差不多大小的硬盘空间。注意--mirror
标识,这在创建一个新客户端时必须明确说明:
$ mkdir -p /usr/local/aosp/mirror
$ cd /usr/local/aosp/mirror
$ repo init -u https://android.googlesource.com/mirror/manifest --mirror
$ repo sync
镜像同步完成之后,新的客户端就可以借助镜像创建。一定注意使用绝对路径:
$ mkdir -p /usr/local/aosp/master
$ cd /usr/local/aosp/master
$ repo init -u /usr/local/aosp/mirror/platform/manifest.git
$ repo sync
最后,为了使客户端与服务器同步,镜像需要首先与服务器同步,然后客户端与镜像同步:
$ cd /usr/local/aosp/mirror
$ repo sync
$ cd /usr/local/aosp/master
$ repo sync
可以把镜像保存在局域网服务器上并通过NFS、SSH或Git来访问。也可以把镜像存储到可移动设备上,然后通过可移动设备在两个用户或两台机器上使用。
验证Git标签
把下面的公共密钥加载到你的GnuPG key数据库中。这个key被用来说明这是一个release版本。
$ gpg --import
复制并粘贴下面的key,然后输入EOF结束输入并处理key。
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.2.2(GNU/Linux)
mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----
导入key之后,你可以通过下面的命令验证任何标签:
$ git tag -v TAG_NAME