1. 程式人生 > >第二期 AOSP 環境搭建、下載和編譯 《手機就是開發板》

第二期 AOSP 環境搭建、下載和編譯 《手機就是開發板》

https://blog.csdn.net/aggresss/article/details/53393511

  Android最初是由Andy Rubin基於linux核心開發出來用於數碼相機的作業系統,Android名字的原型是Andy Rubin小時候最喜歡的一個遊戲人物,logo的原型是UI設計師在看到衛生間的簡約圖示時設計出來的。2005年8月android被Google發現而且收購併用於手機上,隨著軟體版本的迭代,Android已經有10億級別的使用者量,我們的電視,手機,手持電腦,手錶,車載裝置都有Android的身影,可以通過https://www.android.com/瞭解Android相關的第一手資訊,當然,您要先學會怎麼在大中華區區域網內可以訪問到與Google相關的站點。
        如果想從程式碼級別瞭解Android就得從這裡入口:http://source.android.com/ 
        這一期我們的主題是 Downloading and Building http://source.android.com/source/requirements.html
        AOSP是一個龐大的project,建議單獨找塊160G以上的硬碟搭建實驗環境,記憶體16G起,編譯jar包的時候真的多少記憶體都不夠,CPU四核2.5G起,編譯一次大於90分鐘(一個晚自習的時間)的話不利於及時發現編譯錯誤。作業系統選擇Ubuntu14.04LTS_64bit,一切按google推薦的來,Android6.0需要的JDK為openjdk1.7,Ubuntu14.04原生支援,所以會比較方便。安裝好系統後再安裝必要的工具:

$ sudo apt-get update
$ sudo apt-get install git-core gnupg flex bison gperf build-essential  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip


如果您的系統不是Ubuntu14.04LTS_64bit版本就要複製執行啦,建議每個軟體後使用TAB鍵檢查一下是否有這個軟體,比如google給出的lib32z-dev在實際中要改為lib32z1-dev。
安裝java編譯環境jdk

sudo apt-get install openjdk-7-jdk
vi ~/.profile


檔案尾部加入:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin


AOSP的build系統會自動生成JAVA_HOME變數,但為了嚴禁一點我們還是設定完成的JAVA編譯環境變數。
===========================分割線===========================
        編譯環境基本搭建完成,現在開始下載AOSP程式碼,要有個心理準備,都是10G級別的,不建議使用別人下載好打包的程式碼,少了幾分樂趣。
        AOSP的下載在大中華區就不建議通過google下載啦,我們使用國內的mirrors,AOSP國內經典靠譜非盈利的映象主要有兩個:
清華大學的 tuna    https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 
中國科學技術大學的

[email protected]    https://lug.ustc.edu.cn/wiki/mirrors/help/aosp     
        AOSP的程式碼管理是基於git的管理方式,但是是由幾百個git倉庫構成的,這幾百個git倉庫統一管理就必要要有一個統一的工具,google的工程師用python寫了個指令碼叫repo,使用它來進行管理android的中每個git倉庫對應的版本。
我們先將repo指令碼下載到本地,官方給出的方法是:

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo


如果沒有翻牆,就將上面的地址替換成ustc的地址
https://storage-googleapis.proxy.ustclug.org/git-repo-downloads/repo
repo檔案的 REPO_URL 的值可以修改成國內的地址
repo的原理可以通過下面這個連結學習一下,前輩講得太詳細了:http://blog.csdn.net/luoshengyang/article/details/18195205
大體上repo由三種repository組成:
        repo repository : 每次執行repo命令時repo都會對自己進行一次更新;
        manifest repository:記錄AOSP都包含的子專案的名稱、倉庫地址,manifest repository 實際上是一系列XML檔案組成;
        AOSP project repository:這一層是組成AOSP的各個子專案的repository。
我們來初始化repo倉庫,google給出的方式是:

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


如果想通過國內映象站可以使用:

$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
或者
$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest


        這個命令實際上是包含了兩個操作:將這個命令拆分開,init執行的是repo檔案中REPO_URL提供的地址進行repo repository的初始化; -u 和後面的地址則提供 Manifest repository的初始化,以後我們如果下載CM的程式碼的時候就要重新初始化Manifest repository 。
        上面的命令成功執行完成後使用ll命名就可以看到當前目錄下生成.repo資料夾,在.repo目錄下,repo資料夾為repo repository目錄,manifests目錄為manifest repository目錄,其中default.xml中記錄了當前manifest repository包含的所有子專案資訊,可以檢視一下里面的內容,每個project對應的一個AOSP子專案,很多人在github放出的androiid ROM原始碼其實都是釋出一個經過修改的manifest庫,大部分專案引用AOSP原地址,修改的部分引用自己的地址。同樣,如果分析一個android修改版本也是從分析default.xml檔案開始的,通過這個檔案與AOSP的這個檔案比對就可以確定其修改了哪些子專案,然後再去將每個專案的程式碼下載來分析就OK了。
        在下載AOSP程式碼前我來確定以下版本,因為如果預設情況下使用master分支,是最新的開發版本,而我們要下載的是android-6.0.1,使用如下命令:
       

 git --git-dir .repo/manifests/.git/ branch -a


可以檢視所有的版本,我們使用 android-6.0.1_r66 版本來作實驗,於是執行:
       

 repo init -b android-6.0.1_r66


來將manifest repository 切換到 android-6.0.1_r66 分支。
        接下來開始下載AOSP程式碼,執行:
   

repo sync -j4  


        -j4 代表4執行緒同時下載,雖然是個漫長的過程,但還是需要不斷關注,如果長時間卡住就ctrl+c,再repo sync重新開始,repo支援斷點傳輸,可以隨時停止和繼續。
===========================分割線===========================
        環境搭建和下載工作都已就緒,下面進入到編譯環節。如果之前工作準備的充分,只需執行:

source ./build/envsetup.sh
lunch
make -j8


就可以開始編譯了,編譯成功後會顯示綠色的 make completed successfully 資訊 。如果編譯出錯可以根據錯誤提示然後利用搜索網站排錯,當然如果配置低,併發執行緒大的情況下經常出現莫名錯誤,多重新執行make,降低-j的數值就能通過。
編譯通過後別急著關閉terminal視窗,在執行編譯的環境下執行

emulator


就會使用AOSP自帶的虛擬機器模擬執行剛才編譯的android系統。

===========================分割線===========================
        這裡補充一下,為了增加編譯速度Google官方推薦我們啟用ccache,ccache 工具通過將標頭檔案快取記憶體到快取原始檔之中而改進了build的效能,因而通過減少每一步編譯時新增標頭檔案所需要的時間而提高了build速度。
可以通過設定以下命令來啟用ccache。可以將該環境變數寫入.bashrc或類似檔案,避免每次都設定。
$ export USE_CCACHE=1  (如果想永久開啟可以將它寫入到~./profile檔案中)
預設cache儲存在~/.ccache. 可以使用下列命令來設定路徑
$ export CCACHE_DIR=<path-to-your-cache-directory>
Google推薦的cache大小為50-100GB. 可以使用下列命令來設定cache size
$ prebuilt/misc/linux-x86/ccache/ccache -M 50G  (工程目錄下執行,該設定只需設定一次)
可以使用以下命令來檢視ccache的執行狀況:
$ watch -n1 -d prebuilt/linux-x86/ccache/ccache -s   (工程目錄下執行)
        使用ccache對AOSP第一編譯並不會有效果,而make clean後第二期編譯時就會節省很多時間,我做了一個實驗:沒有啟用ccache時編譯時間是95分鐘,而啟用ccache後第二次的編譯時間為45分鐘,節省了一半的時間,還是很有價值的,下面是我的截圖,建議使用ccache -s 命令隨時檢視ccache是否真正被啟用,編譯一次AOSP產生的ccache快取大約為7.5G。

        目前android支援x86,arm,mips三個架構,qemu模擬器也同樣支援這三種架構,因為我們的開發環境是x86架構,所以模擬x86處理器會速度更快一些,在lunch 選擇的時候 選 aosp_x86-eng 然後make 就會編譯出x86架構的android系統,用emulator執行一下會發現比arm架構流暢很多。