Android 的源代碼樹(shù)在 Google 托管的 Git 倉(cāng)庫(kù)中。本文主要闡述如何下載源碼樹(shù)中具體的 Android 代碼。
Repo 是一個(gè)方便在 Android 中使用 Git 的工具。想了解更多關(guān)于 Repo 的信息,請(qǐng)參閱 Developing 章節(jié)。
如何安裝 Repo:
確保在你的主目錄下有一個(gè) bin/ 目錄并且它包含在你的路徑中:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
下載 Repo 工具并確保它是可執(zhí)行的:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
1.17 版本,repo 的 SHA-1 校驗(yàn)值是ddd79b6d5a7807e911b524cb223bc3544b661c28
1.19 版本,repo 的 SHA-1 校驗(yàn)值是 92cbad8c880f697b58ed83e348d06619f8098e6c
1.20 版本,repo 的 SHA-1 校驗(yàn)值是 e197cb48ff4ddda4d11f23940d316e323b29671c
1.21 版本,repo 的 SHA-1 校驗(yàn)值是 b8bd1804f432ecf1bab730949c82b93b0fc5fede
安裝完 Repo 之后,建起一個(gè)客戶(hù)端來(lái)訪(fǎng)問(wèn) Android 的源碼倉(cāng)庫(kù):
創(chuàng)建一個(gè)空目錄來(lái)存放你的工作文件。如果你使用的是 MacOS,則這個(gè)目錄需要在一個(gè)區(qū)分大小寫(xiě)的文件系統(tǒng)上??梢砸匀魏文阆矚g的名稱(chēng)命名:
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
運(yùn)行repo init更新最新版本的 Repo 該版本已經(jīng)修復(fù)了大量已知 Bug。你必須為 manifest 指定一個(gè) URL ,它指定了 Android 源碼樹(shù)里的各個(gè)倉(cāng)庫(kù)都會(huì)被存放在你工作的目錄下。
$ repo init -u https://android.googlesource.com/platform/manifest
要查看 "master" 以外的分支,用 -b 來(lái)指定。想查看分支列表,參閱 Source Code Tags and Builds 。
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1
成功初始化的時(shí)候會(huì)顯示這樣的消息狀態(tài)- Repo 已經(jīng)在你的工作目錄下完成了初始化。你的客戶(hù)端目錄下應(yīng)該會(huì)包含一個(gè) .repo 目錄用來(lái)存放像 manifest 一類(lèi)的文件。
要將 manifest 中默認(rèn)指定的 Android 代碼樹(shù)拉取到你的工作目錄下,請(qǐng)運(yùn)行:
$ repo sync
你的工作目錄下會(huì)有對(duì)應(yīng)的工程名并存儲(chǔ)了 Android 源碼文件。這個(gè)初始化同步操作大概會(huì)需要一個(gè)小時(shí)或更多的時(shí)間才能完成。想了解更多關(guān)于 Repo sync 的信息和 Repo 的其它指令,請(qǐng)參閱 Developing 章節(jié)。
通常情況下,訪(fǎng)問(wèn) Android 源碼資源都是匿名的。為了防止服務(wù)器負(fù)荷過(guò)大,每個(gè) IP 地址都關(guān)聯(lián)一個(gè) quota。
當(dāng)和他們共享同一個(gè) IP 地址時(shí)(比如訪(fǎng)問(wèn)代碼倉(cāng)庫(kù)時(shí)越過(guò) NAT 防火墻),即使在正常模式下 quotas 也會(huì)被觸發(fā)(例如許多用戶(hù)在較短時(shí)段里從同一個(gè) IP 地址下創(chuàng)建新客戶(hù)端并發(fā)起同步請(qǐng)求)。
在這種情況下,可以使用授權(quán)來(lái)訪(fǎng)問(wèn),每個(gè)用戶(hù)將會(huì)使用一個(gè)獨(dú)立的與 IP 地址無(wú)關(guān)的 quota。
第一步首先是使用密碼生成器,然后按照頁(yè)面上的說(shuō)明進(jìn)行操作。
第二步是通過(guò)使用 https://android.googlesource.com/a/platform/manifest 這個(gè) manifest URL 來(lái)進(jìn)行強(qiáng)制授權(quán)訪(fǎng)問(wèn)。注意 /a/ 目錄如何進(jìn)行前綴強(qiáng)制觸發(fā)認(rèn)證。你可以使用下面的指令進(jìn)行強(qiáng)制認(rèn)證來(lái)轉(zhuǎn)化你的客戶(hù)端:
$ repo init -u https://android.googlesource.com/a/platform/manifest
當(dāng)通過(guò)代理下載的時(shí)候(通常企業(yè)經(jīng)常使用),需要去用 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>
更少見(jiàn)的是,Linux 客戶(hù)端遇到連接問(wèn)題,下載到一半的時(shí)候中止(典型的就是在“正在接受數(shù)據(jù)”過(guò)程中)。據(jù)報(bào)道調(diào)整 TCP/IP 堆的設(shè)置并使用非平行的命令可以改善這個(gè)問(wèn)題。你需要 root 權(quán)限訪(fǎng)問(wèn)并修改 TCP 設(shè)定:
$ sudo sysctl -w net.ipv4.tcp_window_scaling=0
$ repo sync -j1
當(dāng)使用多個(gè)客戶(hù)端時(shí),尤其是在帶寬有限的情況下,最好在本地對(duì)整個(gè)服務(wù)器內(nèi)容創(chuàng)建一個(gè)鏡像,然后從這個(gè)鏡像同步到客戶(hù)端(這樣就不需要網(wǎng)絡(luò)訪(fǎng)問(wèn)權(quán)限)。當(dāng)包含更大量?jī)?nèi)容的時(shí)候,下載一個(gè)完整鏡像和兩個(gè)客戶(hù)端分別同時(shí)進(jìn)行下載是大致相同的。
這些說(shuō)明假設(shè)鏡像在 /usr/local/aosp/mirror 里被創(chuàng)建。第一步是創(chuàng)建一個(gè)鏡像然后對(duì)自己進(jìn)行同步。注意 --mirror 標(biāo)識(shí)只可以在創(chuàng)建一個(gè)新客戶(hù)端的時(shí)候被指定:
$ mkdir -p /usr/local/aosp/mirror
$ cd /usr/local/aosp/mirror
$ repo init -u https://android.googlesource.com/mirror/manifest --mirror
$ repo sync
一旦鏡像被同步,新的客戶(hù)端就可以從中創(chuàng)建,注意一定要指定一個(gè)絕對(duì)路徑:
$ mkdir -p /usr/local/aosp/master
$ cd /usr/local/aosp/master
$ repo init -u /usr/local/aosp/mirror/platform/manifest.git
$ repo sync
最后,客戶(hù)端要對(duì)服務(wù)器進(jìn)行同步,鏡像需要對(duì)客戶(hù)端進(jìn)行同步,然后客戶(hù)端同步鏡像:
$ cd /usr/local/aosp/mirror
$ repo sync
$ cd /usr/local/aosp/master
$ repo sync
可以將鏡像存儲(chǔ)在一個(gè)局域網(wǎng)服務(wù)器上,然后通過(guò) NFS,SSH 或者 Git 訪(fǎng)問(wèn)它。同樣也可以將它存儲(chǔ)在可移動(dòng)設(shè)備上,然后在用戶(hù)或者機(jī)器直接傳遞它。
加載下面的公鑰到你的 GunPG 密鑰庫(kù)。這個(gè)密鑰用來(lái)進(jìn)行標(biāo)簽注釋并簽署發(fā)布。
$ gpg --import
復(fù)制粘貼下面的密鑰,然后鍵入 EOF(或者 Ctrl-D)來(lái)結(jié)束輸入病保存這個(gè)密鑰。
-----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-----
輸入完密鑰,你可以使用下面的指令校驗(yàn)任何標(biāo)記
$ git tag -v TAG_NAME
如果你還沒(méi)有搭建 ccache,現(xiàn)在是完成他的最好時(shí)機(jī)。