開門見山,這篇文章主要講解如何下載和編譯Android 源代碼,以及下載過程中遇到的問題和需要注意的事項。
在準備下載和編譯Android 源碼之前,首先要弄清楚下載和編譯android 源碼所需要具備的條件,這樣才能一步一步地完成。這里將下載和編譯的條件分開來講:
下載Android源碼的條件:
1、Git 工具:由于Google是將Android源碼(即aosp工程)放在git 倉庫中進行管理的,所以我們在下載android 源碼的時候,需要首先下載git 工具。
2、Repo 工具:這個Google基于git 封裝的一層命令集,類似于Windows系統(tǒng)的批處理命令。主要目的是降低大型項目(包含有多個git 倉庫)的管理成本。而Android源碼(aosp工程)就是一個非常龐大的項目,所以適合用repo工具來管理。當然,你也可以不用repo工具,而是直接用git 工具,通過git 命令一個一個倉庫去克隆。但是這樣很容易出錯或遺漏某些倉庫,所以還是強烈推薦使用repo 工具來輔助。
編譯Android 源碼的條件:
1、Linux系統(tǒng) \ Mac系統(tǒng):目前Android 源碼工程只支持Linux\Mac系統(tǒng),不支持在Windows系統(tǒng)上編譯運行。所以對于Windows用戶,要么安裝虛擬機VMware(用于虛擬運行Linux系統(tǒng)),要么安裝Windows+Linux雙系統(tǒng)。我是直接安裝雙系統(tǒng)的,因為電腦配置不算太高,擔心安裝虛擬機VMware,運行編譯速度都會比較慢。
2、JDK(Java Development Kit):這個是由于Android 是基于Java的,尤其是Framework層的代碼。所以需要借助JDK工具將代碼編譯成機器語言,讓電腦能讀懂后運行。
3、gcc & g++等額外工具:gcc & g++ 是用來編譯C\C++的。因為再Framework層以下,尤其是在HAL(硬件抽象層)中封裝的相關(guān)硬件的驅(qū)動程序,基本上都是通過C\C++來實現(xiàn)的。
接下來,我們就按照上面的步驟來完成Android 源碼的下載和編譯
- 第一步:安裝Linux系統(tǒng)。
在安裝Linux系統(tǒng)之前,首先要明確自己需要下載的Android 源碼的版本,如Android 4.4.2還是Android 2.2.2等等,為什么呢?
因為Android 是基于Linux內(nèi)核來開發(fā)的。當Linux系統(tǒng)升級迭代的時候(比如加入一些新特性或者又優(yōu)化一些機制的時候),Android系統(tǒng)就會在下一個版本中看是否可以基于該更新后的Linux系統(tǒng)內(nèi)核進行針對性的優(yōu)化和適配。所以每一版Android 系統(tǒng),基本上都是基于當時最新的穩(wěn)定版的Linux系統(tǒng)內(nèi)核進行開發(fā)的。因此在下載編譯不同版本的Android 源碼的時候,都有一個最適合的Linux系統(tǒng)與之配套。如果Android 源碼和Linux 系統(tǒng)不配套的情況下,大多數(shù)情況下都會出現(xiàn)各種各樣的兼容性問題(如Ubuntu 16.04 LTS + Android 2.2.2,親測)。怎么確定Android 版本和Linux 版本的對應(yīng)關(guān)系呢?
google官方將相關(guān)版本對應(yīng)關(guān)系放在了官網(wǎng)上。具體可以參考這里Android和Linux版本的對應(yīng)關(guān)系-
安裝Ubuntu系統(tǒng)
這個網(wǎng)上有很多教程,一般都是通過U盤+軟諜通來安裝的。需要注意的是,在安裝過程中,選擇Ubuntu系統(tǒng)的安裝位置時:選擇自定義安裝,這樣可以依照自己的想法給Ubuntu各目錄劃分磁盤空間。下圖是我自己電腦的磁盤劃分。其中/home目錄下基本上都是下載編譯Android源碼所占用的空間。所以,保險起見,在你要下載和編譯Android源碼的目錄,至少要預留200G - 250G左右的磁盤空間出來。
Ubuntu 系統(tǒng)的磁盤劃分
- 第二步:安裝Git 工具
確認當前電腦是否已經(jīng)安裝Git工具
打開Ubuntu terminal(命令終端,類似于Windows的dos窗口),快捷鍵為Ctrl + Shift + T,然后輸入git --version,如果已經(jīng)安裝了,就會打印出git 工具的版本號。如果還沒有安裝Git,就在terminal 終端,輸入以下命令進行安裝:
sudo apt-get update -- 更新Ubuntu系統(tǒng)中的軟件源
sudo apt install git -- 安裝Git工具
git --version -- 檢查是否安裝好Git 工具配置git 用戶名和郵箱名
sudo git config --global user.name ×××
sudo git config --global user.email ×××檢查git 用戶名和郵箱名是否設(shè)置成功
sudo git config user.name -- 會打印出上面配置的user.name
sudo git config user.email -- 會打印出上面配置的user.email
-第三步:安裝Repo工具
確認當前電腦是否已經(jīng)安裝Repo工具
打開Ubuntu terminal,輸入命令:which repo 如果能夠找到repo文件,就說明已經(jīng)安裝了Repo工具了。-
如果還沒有安裝好Repo工具,就在terminal 終端,輸入以下命令進行安裝:
sudo mkdir ~/bin/ -- 在用戶主目錄下創(chuàng)建/bin/目錄,用戶存放repo的相關(guān)文件和命令集
sudo curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo -- 下載repo并保存再~/bin/目錄下,文件名為repo
sudo chmod a+x ~/bin/repo -- 為repo文件增加可執(zhí)行權(quán)限,因為我們輸入相關(guān)repo命令實際上都是通過執(zhí)行這個文件,將其轉(zhuǎn)化成對應(yīng)的git 命令的。所以需要為repo文件增加可執(zhí)行權(quán)限。
sudo gedit /etc/profile -- 打開配置文件,在最下面添加export PATH一行,目的是為了在terminal 執(zhí)行repo命令時,系統(tǒng)能夠自己去~/bin/repo目錄下確認該命令是否存在并執(zhí)行。如下圖:
添加后的profile文件
source /etc/profile -- 將修改后的profile立即生效。正常修改后的profile文件都會在下一次開機之后生效,如果你現(xiàn)在不方便重啟電腦,那么就可以通過這個命令讓系統(tǒng)先重新加載最新修改的profile文件 檢查repo是否安裝成功
通過which repo 可以找到repo文件。并且后面通過repo命令可以同步aosp項目,就算安裝成功了。
- 第四步:安裝jdk工具
-
檢查當前電腦是否已經(jīng)安裝了jdk的版本。
打開terminal終端,輸入java -version,如果看到j(luò)dk的版本信息,說明已經(jīng)安裝過jdk版本了。如下圖
jdk版本查詢 核對當前jdk版本是否符合需要編譯的Android 源碼版本的要求,具體可以參考這里Android和jdk版本的對應(yīng)關(guān)系,為什么需要核對jdk的版本呢?
因為Android 版本在更新迭代時,都是基于當時最新的穩(wěn)定版的jdk進行書寫的。例如,jdk 1.8版本開始支持for-each語句,那么Android 當時準備開發(fā)的Android 7.0版本就會基于jdk 1.8進行開發(fā),并且在書寫for循環(huán)的時候,極大可能會用for-each語句代替。所以,如果編譯Android 7.0的時候用的jdk版本低于1.8,那么在編譯的時候就會提示出錯,因為代碼中的for-each語音jdk 1.8以下的版本無法將其準確翻譯成機器語言給計算機執(zhí)行。-
如果沒有安裝過jdk,那么就要去Orecal官網(wǎng)下載。
這里下載較舊版本的jdk需要注冊帳號,網(wǎng)上有個熱心的開發(fā)者提供了一個免費帳號供開發(fā)者下載使用,這里貼上轉(zhuǎn)載的鏈接地址:jdk 1.8以下的版本下載需要的帳號。下載jdk安裝包時,請注意電腦的系統(tǒng)位數(shù)。
由于我想要安裝的是Android 4.4.2,對應(yīng)為jdk 1.6版本,并且我的系統(tǒng)時64位,所以下載x64版本的jdk。如下圖:
系統(tǒng)設(shè)置 -- 詳細信息
下載的jdk版本 -
新建/opt/jvm目錄,將下載好的jdk 安裝包保存到該目錄下
在/opt/jvm目錄下,執(zhí)行chmod a+x jdk-6u45-linux-x64.bin
在/opt/jvm目錄下,執(zhí)行./jdk-6u45-linux-x64.bin ,安裝過程中遇到相關(guān)問題直接按enter鍵就可以了
jdk 安裝 -
安裝完成后,需要進行路徑的配置
sudo gedit /etc/profile -- 打開配置文件,將最下面的路徑配置修改為:如下圖
jdk 路徑配置 -
檢查jdk 安裝是否成功
source /etc/profile -- 重新加載/etc/profile配置文件
java -version -- 如果打印出jdk的版本信息,說明jdk 安裝成功。如下圖
jdk 版本信息
- 安裝 gcc & g++ 等額外的支持工具
- 打開terminal終端,輸入以下命令(以下安裝的各個工具的版本對應(yīng)的是 Android 4.4.2版本):
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
以上所有的工具安裝成功后,我們編譯Android 4.4.2的條件就都滿足了。接下來,要做的就是下載和編譯了。
- 下載Android 4.4.2(跟網(wǎng)速密切相關(guān),耗時較長,我自己用了一天)
- mkdir ~/aosp -- 新建一個目錄(如aosp),用于保存Android 4.4.2源碼(當前目錄所在的磁盤最好預留200 - 250G的空間)。
- cd ~/aosp -- 進入aosp目錄
-
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2.0.1 -- 初始化當前的目錄為Android 4.4.2_r2.0.1的倉庫
3.1 如果在這里無法確定-b 后面的Android版本名稱,可以按如下步驟操作
3.2 mkdir ~/test -- 新建test目錄
3.3 cd ~/test -- 進入test目錄
3.4 repo init -u https://android.googlesource.com/platform/manifest -- 初始化test目錄為倉庫
3.5 ls -al -- 可以看到test目錄有.repo文件夾,如下圖
test 目錄下的文件夾
3.6 cd .repo/manifests/ -- 進入.repo/manifests目錄下
3.7 git branch -a -- 查看所有分支,如下圖
分支結(jié)構(gòu),用于獲取Android 版本對應(yīng)的分支名稱
3.8 這樣就可以確定Android 版本對應(yīng)的分支名稱了 - repo sync -- 下載Android 4.4.2_r2.0.1源碼,如果下載過程中出現(xiàn)中斷,重新執(zhí)行該repo sync命令即可,會繼續(xù)下載
- Syncing work tree: 100%(×××/×××),done. -- 說明下載完成
- 編譯 Android 4.4.2(耗時大約3小時)
cd ~/aosp -- 進入aosp目錄下,也就是下載好的Android 4.4.2源碼的根目錄
make -j×(處理器核 * 2,代表編譯的線程數(shù)) -- 觸發(fā)編譯,因為我的電腦核數(shù)是4核,所以命令為make -j8
-
等待編譯完成,只要不出現(xiàn)fatal exception或者fatal error等報錯,基本上都沒問題。如下圖
編譯完成后的相關(guān)打印 -
ls -- 可以看到aosp目錄下包含了out 目錄,該目錄就是用來保存編譯Android 源碼之后的各種輸出img的。如下圖
編譯后的aosp目錄下的文件結(jié)構(gòu)
- 運行模擬器
- cd ~/aosp -- 進入aosp目錄下,也就是下載好的Android 4.4.2源碼的根目錄下
- source build/envsetup.sh -- 配置模擬器啟動的相關(guān)環(huán)境
- lunch -- 選擇要啟動的模擬器類型
-
emulator -- 啟動模擬器
啟動模擬器
模擬器啟動成功
到這里,基于Ubuntu 16.04 + Android 4.4.2的編譯過程就都完成了。













