本次編譯源碼的電腦為Ubuntu 16.04,4核 + 4G內存。
注. 對于電腦配置低的建議不要編譯7.0以上的版本,就像我這臺電腦,基本編譯7.0以上都會報內存不足問題,因為在7.0版以上android改用ninja來編譯源碼了,雖然它比make速度還快,但是對電腦要求也相應的增加了。
網上有人說虛擬機如果想編譯7.0以上版本,電腦配置不低于:
CPU核心: InterXeon E5-2630 16核(2顆8核16線程)
內存容量: 32GB(DDR4)
硬盤容量: 2TB(SAS/SSD)
Android源碼編譯的流程為:
- 源碼下載
- 構建編譯環境
- 編譯源碼
- 運行
一、源碼下載
- 安裝Git
sudo apt-get install git
git config –global user.email “×××@××.com”
git config –global user.name “×××”
- 下載repo工具
mkdir ~/bin PATH=~/bin
$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可訪問,可以用下面的:
curl https://storage-googleapis.lug.ustc.edu.cn/git-repo-downloads/repo > ~/bin/repo
chmod a+x~/bin/repo
- 建立一個工作目錄
mkdir android
cd android
- 初始化倉庫命令
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示無法連接到 gerrit.googlesource.com,可以編輯 ~/bin/repo,把 REPO_URL 一行替換成下面的:
REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
- 如果需要某個特定的 Android 版本
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.1.0_r9
- 同步源碼樹(以后只需執行這條命令來同步)
repo sync
二、構建編譯環境
源碼下載完成后,就可以構建編譯環境了.在開始之前,我們先來看看一些編譯要求:
1. 硬件要求:
64位的操作系統只能編譯2.3.x以上的版本,如果你想要編譯2.3.x以下的,那么需要32位的操作系統.
磁盤空間越多越好,至少在100GB以上.意思就是,你可以去買個大點的硬盤了啊
如果你想要在是在虛擬機運行linux,那么至少需要16GB的RAM/swap.
(實際上,我非常不推薦在虛擬機中編譯2.3.x以上的代碼.)
2. 軟件要求:
1. 操作系統要求
在AOSP開源中,主分支使用Ubuntu長期版本開發和測試的,因此也建議你使用Ubuntu進行編譯,下面我們列出不同版本的的Ubuntu能夠編譯那些android版本:
Android版本 | 編譯要求的Ubuntu最低版本 |
---|---|
Android 6.0至AOSP master | Ubuntu 14.04 |
Android 2.3.x至Android 5.x | Ubuntu 12.04 |
Android 1.5至Android 2.2.x | Ubuntu 10.04 |
2. JDK版本要求
除了操作系統版本這個問題外,我們還需要關注JDK版本問題,為了方便,同樣我們也列出的不同Android版本的源碼需要用到的JDK版本:
Android版本 | 編譯要求的JDK版本 |
---|---|
AOSP的Android主線 | OpenJDK 8 |
Android 5.x至android 6.0 | OpenJDK 7 |
Android 2.3.x至Android 4.4.x | Oracle JDK 6 |
Android 1.5至Android 2.2.x | Oracle JDK 5 |
3、添加編譯依賴
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
網上有人說不同版本ubuntu 所需的依賴不同,本人沒驗證過,但是在Ubuntu16.04上面是OK的。
4、初始化編譯環境
上面的步驟準備完畢,直接執行初始化命令:
source build/envsetup.sh
執行完成,如果正確會出現下圖樣式:
三、編譯源碼
終于進入正題了。
選擇編譯目標,就是選擇編譯出來的鏡像你想跑在什么設備上,你可以通過下面命令查看可以選擇編譯什么鏡像
lunch
你會發現有很多,直接輸入你想要選擇的序號,回車就行。
開始編譯
通過make指令進行代碼編譯,該指令通過-j參數來設置參與編譯的線程數量,以提高編譯速度.比如這里我們設置16個線程同時編譯:
make -j16
需要注意的是,參與編譯的線程并不是越多越好,通常是根據你機器cup的核心來確定:core*2,即當前cpu的核心的2倍.比如,我現在的筆記本是雙核四線程的,因此根據公式,最快速的編譯可以make -j8.
(通過cat /proc/cpuinfo查看相關cpu信息)
提示:如果電腦配置不高,還是建議直接make
就行,否則你的電腦容易炸了。
如果沒什么問題,會在好幾個小時之后出現### make completed successfully (01:18:45(hh:mm:ss)) ###
就說明已經編譯好了。
四、運行
至于運行其實就是啟動刷入你剛剛編譯的鏡像的模擬器
source build/envsetup.sh
lunch(選擇剛才你設置的目標版本,比如這里了我選擇的是2)
emulator
好了,到此你的源碼就搞定了,后面你可以隨意修改代碼了,當然如果你僅僅修改單一模塊的代碼,在整體編譯一次之后,就不需要每一次都整編了,僅需要對單一模塊編譯就行,對單一模塊編譯比較簡單:
./build/envsetup.sh
mmm packages/apps/Email/
比如我們修改了email模塊的代碼, 編譯后會在out/target/product/generic/system/app目錄下看到Email.apk文件,如果是自己手機測試的話,直接將該apk push進原先的位置,替換原先apk。
adb remount
adb push 目錄/Email.apk /system/app/
或者我們在編譯apk后,重新打包sysytem.img文件
make snod
之后再重新emulator
。