傳統(tǒng)方法
JDK安裝和版本切換
- 安裝Oracle JDK (此處編譯Android4.4的源碼昵宇,使用JDK6版本)
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java6-installer
- 也可以安裝OpenJDK(安卓官方使用)(推薦)
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jdk
- JDK版本切換
sudo update-alternatives --config java
sudo update-alternatives --config javac
安裝依賴軟件
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 bison
下載 repo 工具
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可訪問声旺,可以用下面的:
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
這里最好將加入到環(huán)境變量中,這樣以后每次啟動都不用再設置PATH
-
vim ~/.bashrc
在文件最后添加
export PATH=~/bin:$PATH
然后刷新
source ~/.bashrc
- 如果是zsh的話,則編輯
vim ~/.zshrc
添加
export PATH=~/bin:$PATH
然后刷新
source ~/.zshrc
下載和同步源碼
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-7.1.1_r1
repo sync --force-sync --force-broken
- 如果提示無法連接到 gerrit.googlesource.com乾蓬,可以編輯 ~/bin/repo错维,把 REPO_URL 一行替換成下面的:
REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
- 同步也可以使用
repo sync
編譯
執(zhí)行
export USE_CCACHE=1
export CCACHE_DIR=ccache
prebuilts/misc/linux-x86/ccache/ccache -M 50G
準備編譯環(huán)境
source build/envsetup.sh
用lunch命令選擇編譯目標
lunch aosp_angler-userdebug //lunch aosp_arm64-eng
make clobber
make -j12
所有的編譯目標的格式都是:BUILD-BUILDTYPE
,BUILD
指的是指定特性的結合间涵,
BUILDTYPE
是下面列出的其中一個:
Buildtype | 用途 |
---|---|
user | 有限的權限;適合一般用戶 |
userdebug | 類似user模式榜揖,但有root權限和debug能力勾哩,適合debug |
eng | 帶有額外的debug工具的開發(fā)配置。 |
運行
export ANDROID_PRODUCT_OUT=out/target/product/generic
export ANDROID_BIN=out/host/linux-x86/bin
PATH=$ANDROID_BIN:$PATH
source build/envsetup.sh
lunch aosp_arm-eng
emulator64-arm -gpu off -memory 2048
PS
編譯出錯
編譯出現flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertioncnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed. Aborted (core dumped)
可以將
export LC_ALL=C
添加到bashrc举哟∷祭停或者直接執(zhí)行。LC_ALL=C
是為了去除所有本地化的設置妨猩,讓命令能正確執(zhí)行敢艰。
make版本問題
編譯Android源碼需要make的版本為3.8.1或者3.8.2(在Ubuntu18上的make版本太新了)需要降版本
- 在http://ftp.gnu.org/gnu/make/下載相應版本的壓縮包,然后解壓,切換目錄
- 執(zhí)行
./configure --prefix=/usr
make
sudo make install
如果出現錯誤提示glob/glob.c:xxx: undefined reference to __alloca'
的錯誤册赛,
修改 /glob/glob.c
為(即加兩行注釋)
// #if !defined __alloca && !defined __GNU_LIBRARY__
# ifdef __GNUC__
# undef alloca
# define alloca(n) __builtin_alloca (n)
# else /* Not GCC. */
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
# else /* Not HAVE_ALLOCA_H. */
# ifndef _AIX
# ifdef WINDOWS32
# include <malloc.h>
# else
extern char *alloca ();
# endif /* WINDOWS32 */
# endif /* Not _AIX. */
# endif /* sparc or HAVE_ALLOCA_H. */
# endif /* GCC. */
# define __alloca alloca
// #endif
保存后編譯通過钠导。(這個錯誤是glibc2.7引起的)
隨筆
編譯的時候make 12線程就會有這樣的壯觀場面
采用docker自動編譯
linux至少要分配100g的硬盤空間。
安裝docker
默認源中沒有docker,我們需要在添加backports源森瘪,在/etc/apt/sources.list文件 加入下面這行
deb http://http.debian.net/debian jessie-backports main
運行如下命令安裝docker
apt-get update
apt-get install docker.io
開始編譯
- 開始之前先啟動docker服務,不然到后面會報錯
/etc/init.d/docker start
- 設置
AOSP_VOL
環(huán)境變量,設置為你要存放源碼的路徑,給VMWare添加硬盤擴容的設置成掛載的硬盤的路徑牡属。(注意這個export會在重新打開一個shell以后失效)
export AOSP_VOL=/home/Android
- 下載Wrapper腳本,我這里演示編譯kitkat(Android 4.4),編譯其他版本可以參考, 腳本對國內環(huán)境做了優(yōu)化,使用速度比較快的清華源扼睬。
curl -O https://raw.githubusercontent.com/tiann/docker-aosp/master/tests/build-kitkat.sh
- 編譯源碼,直接運行上一步下載下來的源碼逮栅。該腳本會下載docker鏡像,并且下載Android源碼到
AOSP_VOL
指定的路徑窗宇,然后編譯措伐。(注意要使用root權限,否則將無法正常使用docker)
sudo bash ./build-kitkat.sh
編譯完成后,使用的是系統(tǒng)默認自帶的內核军俊,