1. 程式人生 > >安卓系統原始碼編譯系列(一)——下載安卓系統原始碼教程

安卓系統原始碼編譯系列(一)——下載安卓系統原始碼教程

最近需要編譯安卓系統,諮詢了一個編譯過安卓系統的朋友,說是下載原始碼就得下載兩天,於是做好了長期抗戰的準備,開始了下載安卓原始碼的旅程。在剛開始下載時,可以參照的內容只有官方教程,於是跟著官方教程一步一步走,遇到問題就百度谷歌,結果發現自己因為經驗不足走了很多彎路,寫下這篇教程是為了讓以後打算下載安卓原始碼的朋友提供一些建議和思路。本篇教程會不斷更新,力求彌補其他教程的不足並覆蓋所有問題,希望大家看完本教程後可以一次性下載成功!

同時,也歡迎大家將遇到的問題以及解決方案告訴我,一起完善這個教程。

配置虛擬機器

首先是搭建下載原始碼的環境,官方推薦是使用64位的Ubuntu,版本是12.04。如果使用Mac OSX的話,編譯的時候還需要解決大小寫問題,所以建議使用Ubuntu系統。另外由於之後還要編譯原始碼,進行各種配置,所以建議配置一個虛擬機器。本人使用的是Mac OSX Mountain Lion 10.8.5系統,VMware 5.03,使用的Ubuntu映象是ubuntu-12.04-desktop-amd64.iso。

安裝完VMware之後,下載好Ubuntu之後就可以開始配置虛擬機器了,由於之後還要編譯安卓系統,建議大家配置虛擬機器磁碟空間為200G,記憶體為2G(最好是2G或以上,本人曾經用1G結果各種問題),CPU核數為2核(核數多的話之後的編譯速度會快很多)。

注意:

1.VMware預設為動態分配磁碟空間,所以不一定在建立的時候就要有200G的磁碟空間,但由於之後編譯安卓原始碼需要佔用很大空間(我編譯完成後原始碼目錄是35G),所以請大家預留足夠的空間。

2.雖然VMware支援動態增加磁碟空間,但請一次性分配200G,避免之後空間不夠用。本人第一次下載原始碼的時候就只分配了20G,結果下載到一半提示空間不足。關閉虛擬機器擴充套件磁碟空間之後,開機就再也無法進入系統了,只能通過新建虛擬機器再掛載的形式恢復資料,所以請大家謹記。

3.由於下載或者編譯原始碼中間可能會與外部系統有互動,方便起見,建議大家安裝VMware Tools,可以自由複製以及進行檔案共享。

配置下載原始碼環境

接下來是配置下載原始碼的環境,先看看官方網站上的要求:
  • Python 2.6 -- 2.7, which you can download from python.org.
  • GNU Make 3.81 -- 3.82, which you can download from gnu.org,
  • JDK 6 if you wish to build Gingerbread or newer; JDK 5 for Froyo or older. You can download both from
    java.sun.com
    .
  • Git 1.7 or newer. You can find it at git-scm.com.
Python、GNU Make都是Ubuntu12.04自帶的,而且版本都符合要求,所以不用管。 下面就需要安裝JDK,官網提供的步驟是:
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk
但是按照該步驟可能會報錯如下:
Package sun-java6-jdk is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package sun-java6-jdk has no installation candidate
網上給出了兩種解決辦法,第一種是:
sudo add-apt-repository ppa:ferramroberto/java
sudo apt-get update
sudo apt-get install sun-java6-jdk
第二種是:
1. 在終端輸入:sudo gedit /ect/apt/sources.list檔案
2. 在sources.list最後新增一行
deb http://us.archive.ubuntu.com/ubuntu/ hardy multiverse
3. 儲存關閉gedit
4. 執行 sudo apt-get update
5. 再次執行sudo apt-get install sun-java6-jdk。
但很不幸的是,以上兩種方法對本人都無效,所以無奈之下,只得手動下載jdk進行安裝。如果大家的情況和我一樣,建議手動安裝,安裝步驟可以參見這篇文章。 安裝完JDK後,再安裝Git:
sudo apt-get install git
最後配置一下其他必需的包:
$ sudo apt-get install git gnupg flex bison gperf build-essential \
  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
官網上教程中的Configuring USB Access好像用不著,Setting up ccache和Using a separate output directory都是編譯的時候用的。

安裝下載原始碼的工具

由於安卓的原始碼很大而且很多,所以需要用到一個下載工具repo,可以直接按照官網的步驟:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
安裝完下載工具之後,可以建立一個存放原始碼的目錄,這裡用WORKING_DIRECTORY代替:
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

下載原始碼

現在萬事俱備,只欠東風了。我們即將開始下載安卓系統原始碼。首先可以在這裡選擇要下載的安卓版本,例如本人選的是android-4.3_r2.3。

根據官網的說明,如果下載最新版本可以直接輸入:

$ repo init -u https://android.googlesource.com/platform/manifest
指定版本可以輸入:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.3_r2.3
這個過程中會提示你輸入名字和郵箱,名字隨意,郵箱建議輸入gmail的郵箱。最後執行:
$ repo sync
即可開始下載。需要說明的是,repo支援斷點續傳,如果中間下載中斷了或者出錯了,可以再次執行repo sync來繼續下載。

但是先不要急,由於下載過程還會遇到各種各樣的問題,所以請大家稍安勿躁,再做一些準備工作,首先我們需要建立一個自動下載指令碼,確保出錯了之後會自動執行repo sync,可以省掉我們很多重複勞動。指令碼如下:

#!/bin/bash    
echo "======start repo sync======"    
../bin/repo sync    
while [ $? == 1 ]; do    
echo "======sync failed, re-sync again======"    
sleep 3    
../bin/repo sync    
done    
將以上指令碼放入一個sh檔案中(例如dw.sh),在終端中cd到該指令碼的目錄下,執行以下命令即可:
sudo sh ./dw.sh

需要注意的是,這個指令碼並不能解決下載中間卡住的問題,如果在一個地方卡住超過10分鐘以上,建議ctrl+z停掉以後重新執行指令碼。本人就曾經第二天早上起來發現還卡在前天晚上的位置。

接下來,我們需要再增加一個驗證。由於訪問都是匿名的,為了防止連線過多,谷歌對同一個ip的訪問次數進行了限制。
machine android.googlesource.com login git-jacky.rg4.net password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA   
machine android-review.googlesource.com login git-jacky.rg4.net password 1/dkRiGEvvC8o8Pgg-GsM2AbMNS_32-U0Pf0_VWkYogIA
在~(/home/username/.netrc)目錄下建立一個.netrc檔案,將以上兩行內容貼上進去,儲存。

repo init的時候地址需要加上/a

repo init -u https://android.googlesource.com/a/platform/manifest

需要注意的是,這兩行內容每次登入有可能得到的不一樣,但似乎不會有差別。

下載輸出說明


下面對下載過程中終端的輸出做一個說明,由於安卓原始碼是由很多個子工程組成的,repo會依此對各個工程呼叫命令下載。 每次終端輸出Fetching project則說明開始一個工程的下載,後面跟的是該工程的名稱。 每下載完幾個工程,終端會輸出Fetching projects則說明已經下載完成若干工程,後面跟的是當前進度,如92%(334/362)說明總共有362個工程,目前下載到334個,進度是92%。 中間如果出現error: The requested URL returned error: 403 while accessing https://...,則說明下載該工程時伺服器沒有響應,不會有什麼影響,只要下次同步的時候該工程不出錯就行。 最後下載完成會同步整個工程目錄,出現以下兩行內容時,則說明下載成功。
Fetching projects: 100% (362/362), done.  
Syncing work tree: 100% (362/362), done. 

總結

本人從開始下載到下載成功總共花了兩天多的時間,其中誤刪除資料重新下載一次,Ubuntu系統崩潰一次。網速好的話(本人在教育網,不需要開VPN),實際下載過程大概半天左右,最後下載完虛擬機器共29.36G,估計下載的資料有15G左右,加上配置環境總共花費流量20G左右。 下載完成的效果見截圖:

其他問題

1. 重新啟動虛擬機器之後有可能會出現repo命令出錯:
No command 'repo' found, did you mean:
 Command 'rep' from package 'rep' (universe)
 Command 'repl' from package 'nmh' (universe)
 Command 'repl' from package 'mailutils-mh' (universe)
repo: command not found
出現這個錯誤的話,建議將~/bin目錄下的repo資料夾刪除,重新安裝repo。注意,不是將安卓原始碼目錄下的.repo檔案刪除,否則就需要重新下載之前下過的原始碼!本人就曾經誤刪除過.repo檔案導致所有檔案都要重新下載。 2.安裝其他必需的包時候遇到錯誤:
E: Sub-process /usr/bin/dpkg returned an error code (1)
執行:
cd /var/lib/dpkg 
sudo mv info info.bak 
sudo mkdir info
再次執行命令,遇到錯誤:
Errors were encountered while processing:
 libc6-dev:i386
E: Sub-process /usr/bin/dpkg returned an error code (1)
執行:
apt-get install linux-libc-dev:i386
apt-get install libc6-dev:i386
最後再次執行安裝其他必需包命令,就沒有錯誤了 3.如果中間出現類似以下錯誤的話:
error: Failed connect to android.googlesource.com:443; Connection timed out while accessing https://android.googlesource.com/a/platform/sdk/info/refs
fatal: HTTP request failed
可以嘗試ping一下android.googlesource.com,如果ping不通的話,可以修改hosts。方法為,在終端中輸入:
sudo gedit /etc/hosts
在host檔案中增加以下內容:
74.125.31.82 www.googlesource.com  
74.125.31.82 android.googlesource.com  
203.208.46.172 cache.pack.google.com
59.24.3.173 cache.pack.google.com
注意,一定要檢查該域名是否能ping通,ping不通的話再改,本人就是本來能ping通的,改完就出錯了 4.下載過程中出錯:
error: gnutls_handshake() failed: A TLS packet with unexpected length was received. while accessing https://android.googlesource.com/a/platform/packages/screensavers/WebView/info/refs
fatal: HTTP request failed

5.關閉Ubuntu虛擬機器之後無法啟動系統 本人就曾經遇到過這個問題,還是在基本下載完成的時候,眼看著就要重新下載了,一個師兄給我提供瞭解決方案,真是山重水複疑無路,柳暗花明又一村啊。可以新建一個虛擬機器,將舊的虛擬機器作為硬碟掛載到新的虛擬機器上。再將舊虛擬機器上的安卓原始碼目錄複製到新的虛擬機器上,繼續執行指令碼下載即可。 6.下載結束時出錯:
error: frameworks/base/: platform/frameworks/base checkout 
4b77609a983b08f163853df2a77e1d535d684aec 
進入到frameworks/base目錄,執行:
git reset --hard
7.下載過程中出錯:
Fetching projects:   0% (1/363)  Fetching project platform/hardware/samsung_slsi/exynos5
fatal: Invalid gitfile format: /home/zhaoxy/develop/.repo/repo/.git/clone.bundle
fatal: The remote end hung up unexpectedly 
再次repo sync即可 8.下載結束時出錯:
fatal: Unable to create '/home/zhaoxy/develop/system/media/.git/index.lock': Permission denied
是由於中間本人更換過虛擬機器引起的許可權問題,執行以下命令修復檔案所有者及許可權即可:
sudo chgrp -R zhaoxy /home/zhaoxy/develop
sudo chmod -R g+w /home/zhaoxy/develop

之後遇到問題會持續補充。 下載完成一個版本的原始碼後,如果需要下載其他版本的原始碼,可以見《安卓系統原始碼編譯系列(三)——常用命令