最近在學習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文件的權限設定
第三步:創建用於存放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源代碼
隨後可看到終端輸出如下信息:
- 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 //同步,即下載源代碼
之後會正式開始下載源代碼,下載過程漫長,會根據具體情況的不同速度差異很大,整個過程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命令的時候會報錯,如下:
<div class="dp-highlighter bg_html" style="font-family: Consolas, 'Courier New', Courier, mono, serif; font-size: 12px; background-color: rgb(231, 229, 220); width: 693px; overflow: auto; padding-top: 1px; margin: 18px 0px !important;"><div class="bar" style="padding-left: 45px;"><div class="tools" style="padding: 3px 8px 10px 10px; font-size: 9px; line-height: normal; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; color: silver; background-color: rgb(248, 248, 248); border-left-width: 3px; border-left-style: solid; border-left-color: rgb(153, 153, 153);"><strong>[html]</strong> <a target=_blank href="http://blog.csdn.net/mc_hust/article/details/33304733#" class="ViewSource" title="view plain" style="color: rgb(160, 160, 160); text-decoration: none; background-image: none; background-color: inherit; border: none; padding: 0px; margin: 0px 10px 0px 0px; font-size: 9px; background-position: initial initial; background-repeat: initial initial;">view plain</a><a target=_blank href="http://blog.csdn.net/mc_hust/article/details/33304733#" class="CopyToClipboard" title="copy" style="color: rgb(160, 160, 160); text-decoration: none; background-image: none; background-color: inherit; border: none; padding: 0px; margin: 0px 10px 0px 0px; font-size: 9px; background-position: initial initial; background-repeat: initial initial;">copy</a><a target=_blank href="http://blog.csdn.net/mc_hust/article/details/33304733#" class="PrintSource" title="print" style="color: rgb(160, 160, 160); text-decoration: none; background-image: none; background-color: inherit; border: none; padding: 0px; margin: 0px 10px 0px 0px; font-size: 9px; background-position: initial initial; background-repeat: initial initial;">print</a><a target=_blank href="http://blog.csdn.net/mc_hust/article/details/33304733#" class="About" title="?" style="color: rgb(160, 160, 160); text-decoration: none; background-image: none; background-color: inherit; border: none; padding: 0px; margin: 0px 10px 0px 0px; font-size: 9px; background-position: initial initial; background-repeat: initial initial;">?</a><a target=_blank href="https://code.csdn.net/snippets/336920" target="_blank" title="在CODE上查看代碼片" style="color: rgb(160, 160, 160); text-decoration: none; background-image: none; background-color: inherit; border: none; padding: 0px; margin: 0px 10px 0px 0px; font-size: 9px;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代碼片" style="border: none; max-width: 100%; position: relative; top: 1px; left: 2px;" /></a><a target=_blank href="https://code.csdn.net/snippets/336920/fork" target="_blank" title="派生到我的代碼片" style="color: rgb(160, 160, 160); text-decoration: none; background-image: none; background-color: inherit; border: none; padding: 0px; margin: 0px 10px 0px 0px; font-size: 9px;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代碼片" style="border: none; max-width: 100%; position: relative; top: 2px; left: 2px;" /></a><div style="position: absolute; left: 406px; top: 2956px; width: 26px; height: 14px; z-index: 99;"></div></div></div><ol start="1" class="dp-xml" style="padding: 0px; border: none; list-style-position: initial; list-style-image: initial; background-color: rgb(255, 255, 255); color: rgb(92, 92, 92); margin: 0px 0px 1px 45px !important;"><li class="alt" style="margin: 0px !important; padding: 0px 3px 0px 10px !important; border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(153, 153, 153); list-style: decimal-leading-zero outside; background-color: rgb(245, 250, 226); color: inherit; line-height: 18px;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;"><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">./bin/repo: 行 1: 未預期的符號 `newline' 附近有語法錯誤 </span></span></li><li style="margin: 0px !important; padding: 0px 3px 0px 10px !important; border-style: none none none solid; border-left-width: 3px; border-left-color: rgb(153, 153, 153); list-style: decimal-leading-zero outside; background-color: rgb(245, 250, 226); color: rgb(85, 85, 85); line-height: 18px;"><span style="margin: 0px; padding: 0px; border: none; color: black; background-color: inherit;">./bin/repo: 行 1: `<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"<span class="tag" style="margin: 0px; padding: 0px; border: none; color: blue; background-color: inherit; font-weight: bold;">></span><span style="margin: 0px; padding: 0px; border: none; background-color: inherit;">' </span></span></li></ol></div> <span style="font-size: 18px;">解決方法:更換repo下載站點,使用如下命令</span> <pre class="best-text mb-10" code_snippet_id="336920" snippet_file_name="blog_20140509_9_9007086" name="code" style="white-space: pre-wrap; word-wrap: break-word;"># 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
通常在公司內部網絡或者用虛擬機下運行的話,會經常遇到這個問題。
解決方法:
1. 瀏覽器登錄https://android.googlesource.com/new-password,並用gmail帳號登錄;
2. 點擊網頁上的“是”(有些資料上寫的是點擊“允許訪問”,我看到到是“是”),得到類似如下結果:
- Username: git-hust.mczy.gmail.com
- Password: 1/3t2difm8LDvgpYCdci5nripSiQuWBaIv
<pre class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word;"><span style="font-size: 18px;">然後將網頁上由machine開頭到兩行複製下來,在linux終端裏新建~/.netrc文本文檔,複製進去,保存退出。最後在域名中加一個“/a”,完整命令如下 </span>
- # 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 <hust.mczy@gmail.com>
- 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
解決方法:
網絡不順通常是一時的,這裏的辦法除了換網之外只有反覆執行 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
之後可以做自己的事,讓程序自動下載,當你驀然回首的時候,它已經默默下載成功了。。