下載Android源代碼錯誤彙總分析

配置下載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

之後可以做自己的事,讓程序自動下載,當你驀然回首的時候,它已經默默下載成功了。。

總結:

    下載Android源代碼會出現很多問題(光是本人就有很多問題),網上查找到的許多資料也都是很早以前的,故未必能解決。個人認爲主要的問題有三個:一個是下載的repo版本,要是最新版,很多版本不是被牆掉了,就是失效了;第二個就是初始化源代碼的站點。同樣的,由於站點的無效也會導致一系列的問題。第三則是谷歌對谷歌郵箱的驗證,按照這個步驟執行,一般都能夠搞定。
好了,基本上大部分出現的問題都是由於這兩個原因造成的,所以對於其他原因,這裏我就不詳談了。如果各位按照以上步驟仍然無法下載成功,歡迎給我留言,相信大家互相探討學習,一定能夠客服困難,共同進步!

謝謝~~


超低空










發佈了24 篇原創文章 · 獲贊 8 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章