配置下載Android源代碼的過程及問題解決


        最近在學習Android底層框架,今天打算研究一下Android源代碼,源碼的下載過程可沒有想像的順利。主要原因是網上的很多資料都是多年以前的,而一些網站都發生了變更,所以域名也會失效。OK,廢話少說,我把遇到的各種問題和大家分享一下,希望大家能對號入座,避免浪費不必要的時間~

        以下是我按照正常下載過程總結出的步驟,遇到的問題將在後面講述。


       第一步:創建下載腳本文件(repo)的存放目錄(可任意),這裏我選用 ~/android/bin


  1. # mkdir  ~/android/bin              //創建repo目錄  
  2. #PATH=  ~/android/bin:$PATH         //爲repo工具配置環境變量,方便後面使用  

     第二步:下載repo文件(出錯點)

  1. # curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~ /bin/repo//下載repo文件  
  2. # chmod a+x ~/bin/repo           //修改repo文件的權限設定  
    repo其實是一個應python腳本對Git的封裝,主要是爲了簡化下載Android源代碼的步驟。       

      第三步:創建用於存放Android源代碼的目錄(可任意),這裏我選用~/android/bin/android_source

  1. # mkdir android_source              //創建文件目錄  
  2. # cd android_source                 //進入該目錄  

    第四步:初始化:(出錯點)

  1. # repo init -u https://android.googlesource.com/platform/manifest           //repo的初始化  

            此時便會要求repo工具自動下載Android源代碼(默認是Master分支,也可以下載其他分支)

如果下載其他分支,使用一下語句:

  1. # 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

    隨後可看到終端輸出如下信息:

  1. Getting repo ...  
  2.    from git://codeaurora.org/tools/repo.git  
  3. remote: Counting objects: 2818, done.  
  4. remote: Compressing objects: 100% (863/863), done.  
  5. remote: Total 2818 (delta 1907), reused 2818 (delta 1907)  
  6. Receiving objects: 100% (2818/2818), 959.24 KiB | 798 KiB/s, done.  
  7. Resolving deltas: 100% (1907/1907), done.  
  8. From git://codeaurora.org/tools/repo  
  9.  * [new branch]      aosp-new/maint -> origin/aosp-new/maint  
  10.  * [new branch]      aosp-new/master -> origin/aosp-new/master  
  11.  * [new branch]      aosp-new/stable -> origin/aosp-new/stable  
  12.  * [new branch]      caf-stable -> origin/caf-stable  
  13.  * [new branch]      master     -> origin/master  
  14.  * [new branch]      stable     -> origin/stable  
  15.  * [new tag]         v1.10.4    -> v1.10.4  
  16.  * [new tag]         v1.12.16   -> v1.12.16  
  17.  * [new tag]         v1.12.2    -> v1.12.2  
  18.  * [new tag]         v1.6.8.1   -> v1.6.8.1  
  19.  * [new tag]         v1.7.5     -> v1.7.5  

        可以看到Android源代碼中的分支([new branch]和[new tag])。    

第五步:開始下載Android源代碼:

  1. # repo sync       //同步,即下載源代碼  
至此,下載Android源代碼的基本步驟就到此結束,如果順利的話,Linux終端可以看到如下的信息:

之後會正式開始下載源代碼,下載過程漫長,會根據具體情況的不同速度差異很大,整個過程Git會儘可能佔用帶寬,朋友們需要耐心等待。

下載過程中可能遇到的問題:    

1.首先容易出錯的是第二步,這裏由於網站或者本地網絡的問題,可能會出現如下故障:

  1. root@mc-virtual-machine:~/android/bin# curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/android/bin/repo  
  2.   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current  
  3.                                  Dload  Upload   Total   Spent    Left  Speed  
  4.   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


此時再次執行第四步:
  1. # repo init -u https://android.googlesource.com/platform/manifest       //repo的初始化  
      便可看到如第五步中所示的正確結果。

3.在第四步的時候終端會詢問如下問題:
  1. root@mc-virtual-machine:~/android/bin/android_source# repo init -u https://android.googlesource.com/platform/manifest  
  2. error: Failed to connect to 2404:6800:4005:c00::52: Network is unreachable while accessing https://android.googlesource.com/platform/manifest/info/refs  
  3. fatal: HTTP request failed  
  4. fatal: cannot obtain manifest https://android.googlesource.com/platform/manifest  
由於訪問是匿名的,爲了防止連接過多,谷歌對同一IP地址的連接數做了一定的限制。這裏需要用gmail帳號進行認證。
通常在公司內部網絡或者用虛擬機下運行的話,會經常遇到這個問題。

解決方法:

1. 瀏覽器登錄https://android.googlesource.com/new-password,並用gmail帳號登錄; 
2. 點擊網頁上的“是”(有些資料上寫的是點擊“允許訪問”,我看到到是“是”),得到類似如下結果: 
  1. Username: git-hust.mczy.gmail.com  
  2. 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> 
  1. # repo init -u https://android.googlesource.com/platform/manifest           //repo的初始化  


隨後會在終端中輸出如下驗證信息:
  1. Your Name  [root]: MC  
  2. Your Email [root@mc-virtual-machine.(none)]: [email protected]  
  3.   
  4. Your identity is: MC <hust.mczy@gmail.com>  
  5. is this correct [y/n]? y  
  6.   
  7. Testing colorized output (for 'repo diff', 'repo status'):  
  8.   black    red      green    yellow   blue     magenta   cyan     white   
  9.   bold     dim      ul       reverse   
  10. Enable color display in this user account (y/n)?   

此時需要驗證gmail郵箱,然後輸入用戶名和Gmail郵箱,選擇Y回車即可。

4.最後一步在執行repo sync時,可能會報如下錯誤:

  1. 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時,如果出現如下錯誤:

  1. remote: Sending approximately 1.11 GiB ...  
  2. remote: Counting objects: 42, done  
  3. remote: Finding sources: 100% (42/42)  
  4. remote: Sending approximately 200.67 MiB ...  
  5. remote: Counting objects: 18, done  
  6. remote: Finding sources: 100% (18/18)  
  7. error: RPC failed; result=56, HTTP code = 2000 KiB/s       
  8. fatal: The remote end hung up unexpectedly  
  9. fatal: 過早的文件結束符(EOF)  
  10. fatal: index-pack failed  
  11. error: RPC failed; result=56, HTTP code = 200  
  12. fatal: The remote end hung up unexpectedly  
  13. fatal: early EOF  
  14. fatal: unpack-objects failed  
  15. error: RPC failed; result=56, HTTP code = 200  
  16. fatal: The remote end hung up unexpectedly  
  17. fatal: 過早的文件結束符(EOF)  
  18. fatal: index-pack failed  
  19. error: RPC failed; result=56, HTTP code = 200  
  20. fatal: The remote end hung up unexpectedly  
  21. fatal: 過早的文件結束符(EOF)  
  22. fatal: index-pack failed  
這個問題挺尷尬的,這是由於網絡信號不順暢造成的,比較Android官方網站設在國外,國內的網絡常常會故障。大家可以留意一下在崩潰之前終端顯示的下載速度,是不是由M編程KB ,然後慢慢變小,最後直接崩潰。。。

解決方法:

網絡不順通常是一時的,這裏的辦法除了換網之外只有反覆執行 repo sync。當然這裏完全不需要自己去反覆執行,可以通過編寫一個腳本程序,讓計算機在下載崩潰後自動重新下載。在代碼目錄建立一個腳本(sh)文件,輸入如下

  1. #!/bin/bash  
  2.   
  3.  echo ¨================start repo sync===============¨  
  4.   
  5.  repo sync -f -j10  
  6.   
  7.  while [ $? == 1 ]; do  
  8.  echo ¨================sync failed, re-sync again=============¨  
  9.  sleep 3  
  10.  repo sync -f -j10  
  11.  done  

之後可以做自己的事,讓程序自動下載,當你驀然回首的時候,它已經默默下載成功了。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章