配置下載Android源代碼的過程及問題解決
最近在學習Android底層框架,今天打算研究一下Android源代碼,源碼的下載過程可沒有想像的順利。主要原因是網上的很多資料都是多年以前的,而一些網站都發生了變更,所以域名也會失效。OK,廢話少說,我把遇到的各種問題和大家分享一下,希望大家能對號入座,避免浪費不必要的時間~
以下是我按照正常下載過程總結出的步驟,遇到的問題將在後面講述。
第一步:創建下載腳本文件(repo)的存放目錄(可任意),這裏我選用 ~/android/bin
# mkdir ~/android/bin //創建repo目錄
#PATH= ~/android/bin:$PATH //爲repo工具配置環境變量,方便後面使用
第二步:下載repo文件:(出錯點)
# curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~ /bin/repo//下載repo文件
# chmod a+x ~/bin/repo //修改repo文件的權限設定
repo其實是一個應python腳本對Git的封裝,主要是爲了簡化下載Android源代碼的步驟。
第三步:創建用於存放Android源代碼的目錄(可任意),這裏我選用~/android/bin/android_source:
# mkdir android_source //創建文件目錄
# cd android_source //進入該目錄
第四步:初始化:(出錯點)
# repo init -u https://android.googlesource.com/platform/manifest //repo的初始化
此時便會要求repo工具自動下載Android源代碼(默認是Master分支,也可以下載其他分支)。
如果下載其他分支,使用一下語句:
# repo init -u https://android.googlesource.com/platform/manifest -bandroid-4.4.2_r2 //下載Android4.4.2源代碼
如果要下載其他版本,分支名參考官方網站:http://git.omapzoom.org/?p=platform/manifest.git;a=tags
隨後可看到終端輸出如下信息:
Getting repo ...
from git://codeaurora.org/tools/repo.git
remote: Counting objects: 2818, done.
remote: Compressing objects: 100% (863/863), done.
remote: Total 2818 (delta 1907), reused 2818 (delta 1907)
Receiving objects: 100% (2818/2818), 959.24 KiB | 798 KiB/s, done.
Resolving deltas: 100% (1907/1907), done.
From git://codeaurora.org/tools/repo
* [new branch] aosp-new/maint -> origin/aosp-new/maint
* [new branch] aosp-new/master -> origin/aosp-new/master
* [new branch] aosp-new/stable -> origin/aosp-new/stable
* [new branch] caf-stable -> origin/caf-stable
* [new branch] master -> origin/master
* [new branch] stable -> origin/stable
* [new tag] v1.10.4 -> v1.10.4
* [new tag] v1.12.16 -> v1.12.16
* [new tag] v1.12.2 -> v1.12.2
* [new tag] v1.6.8.1 -> v1.6.8.1
* [new tag] v1.7.5 -> v1.7.5
可以看到Android源代碼中的分支([new branch]和[new tag])。
第五步:開始下載Android源代碼:
# repo sync //同步,即下載源代碼
至此,下載Android源代碼的基本步驟就到此結束,如果順利的話,Linux終端可以看到如下的信息:
之後會正式開始下載源代碼,下載過程漫長,會根據具體情況的不同速度差異很大,整個過程Git會儘可能佔用帶寬,朋友們需要耐心等待。
下載過程中可能遇到的問題:
1.首先容易出錯的是第二步,這裏由於網站或者本地網絡的問題,可能會出現如下故障:
root@mc-virtual-machine:~/android/bin# curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/android/bin/repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:21 --:--:-- 0
下載會卡在一開始,而且卡住的概率很高。此時不必急着檢查問題,可能是暫時的網絡故障,可以ctrl + c 中斷之後再次執行,嘗試多次通常可解決此問題。
2.其次容易出錯的地方便是第四步。
由於站點的問題,有些朋友在第四步執行repo init命令的時候會報錯,如下:
./bin/repo: 行 1: 未預期的符號 `newline' 附近有語法錯誤
./bin/repo: 行 1: `<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'
解決方法:更換repo下載站點,使用如下命令
<pre class="html" code_snippet_id="336920" snippet_file_name="blog_20140509_9_9007086" name="code"># curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo" > ./repo //獲取repo
此時再次執行第四步:
# repo init -u https://android.googlesource.com/platform/manifest //repo的初始化
便可看到如第五步中所示的正確結果。3.在第四步的時候終端會詢問如下問題:
root@mc-virtual-machine:~/android/bin/android_source# repo init -u https://android.googlesource.com/platform/manifest
error: Failed to connect to 2404:6800:4005:c00::52: Network is unreachable while accessing https://android.googlesource.com/platform/manifest/info/refs
fatal: HTTP request failed
fatal: cannot obtain manifest https://android.googlesource.com/platform/manifest
由於訪問是匿名的,爲了防止連接過多,谷歌對同一IP地址的連接數做了一定的限制。這裏需要用gmail帳號進行認證。通常在公司內部網絡或者用虛擬機下運行的話,會經常遇到這個問題。
解決方法:
1. 瀏覽器登錄https://android.googlesource.com/new-password,並用gmail帳號登錄;
2. 點擊網頁上的“是”(有些資料上寫的是點擊“允許訪問”,我看到到是“是”),得到類似如下結果:
Username: git-hust.mczy.gmail.com
Password: 1/3t2difm8LDvgpYCdci5nripSiQuWBaIv
然後將網頁上由machine開頭到兩行複製下來,在linux終端裏新建~/.netrc文本文檔,複製進去,保存退出。最後在域名中加一個“/a”,完整命令如下
# repo init -u https://android.googlesource.com/platform/manifest //repo的初始化
隨後會在終端中輸出如下驗證信息:Your Name [root]: MC
Your Email [root@mc-virtual-machine.(none)]: [email protected]
Your identity is: MC <[email protected]>
is this correct [y/n]? y
Testing colorized output (for 'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/n)?
此時需要驗證gmail郵箱,然後輸入用戶名和Gmail郵箱,選擇Y回車即可。
4.最後一步在執行repo sync時,可能會報如下錯誤:
fatal: '../platform/abi/cpp.git' does not appear to be a git repository fata
這說明獲取的路徑有問題。
解決方法:
進入安裝repo的bin目錄下一個叫.repo的目錄,打開manifest.xml文件(命令gedit manifest.xml)並找到fetch屬性,在我的文件中顯示fetch="..",將fetch修改爲fetch="git://Android.git.linaro.org/",保存並退出。再次執行repo sync 即可開始下載。
5.另外還有一個很少出現的錯誤。同樣是在repo sync時,如果出現如下錯誤:
remote: Sending approximately 1.11 GiB ...
remote: Counting objects: 42, done
remote: Finding sources: 100% (42/42)
remote: Sending approximately 200.67 MiB ...
remote: Counting objects: 18, done
remote: Finding sources: 100% (18/18)
error: RPC failed; result=56, HTTP code = 2000 KiB/s
fatal: The remote end hung up unexpectedly
fatal: 過早的文件結束符(EOF)
fatal: index-pack failed
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: unpack-objects failed
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: 過早的文件結束符(EOF)
fatal: index-pack failed
error: RPC failed; result=56, HTTP code = 200
fatal: The remote end hung up unexpectedly
fatal: 過早的文件結束符(EOF)
fatal: index-pack failed
這個問題挺尷尬的,這是由於網絡信號不順暢造成的,比較Android官方網站設在國外,國內的網絡常常會故障。大家可以留意一下在崩潰之前終端顯示的下載速度,是不是由M編程KB ,然後慢慢變小,最後直接崩潰。。。
解決方法:
網絡不順通常是一時的,這裏的辦法除了換網之外只有反覆執行 repo sync。當然這裏完全不需要自己去反覆執行,可以通過編寫一個腳本程序,讓計算機在下載崩潰後自動重新下載。在代碼目錄建立一個腳本(sh)文件,輸入如下:
#!/bin/bash
echo ¨================start repo sync===============¨
repo sync -f -j10
while [ $? == 1 ]; do
echo ¨================sync failed, re-sync again=============¨
sleep 3
repo sync -f -j10
done
之後可以做自己的事,讓程序自動下載,當你驀然回首的時候,它已經默默下載成功了。。
總結:
好了,基本上大部分出現的問題都是由於這兩個原因造成的,所以對於其他原因,這裏我就不詳談了。如果各位按照以上步驟仍然無法下載成功,歡迎給我留言,相信大家互相探討學習,一定能夠客服困難,共同進步!
謝謝~~