官網上教程:http://source.android.com/source/building.html,基本是按照這個一步一步來的。
一、初始化配置
1.安裝jdk7(5.1需要openjdk7,其他版本看文檔)
$ sudo apt-get update
$ sudo apt-get install openjdk-7-jdk
更新默認jdk版本
$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac
2.1404需要下載的依賴
sudo apt-get install bison g++-multilib git gperf libxml2-utils make python-networkx zlib1g-dev:i386 zip
我的出現如下錯誤
下列軟件包有未滿足的依賴關系:
g++-multilib : 依賴: gcc-multilib (>= 4:4.8.2-1ubuntu6) 但是它將不會被安裝
依賴: g++ (>= 4:4.8.2-1ubuntu6) 但是它將不會被安裝
E: 無法修正錯誤,因為您要求某些軟件包保持現狀,就是它們破壞了軟件包間的依賴關系
分別安裝gcc-multilib和g++即可:
sudo apt-get install g++
sudo apt-get install gcc-multilib
3.配置USB訪問權限
新建/etc/udev/rules.d/51-android.rules文件,可以使用 sudo gedit /etc/udev/rules.d/51-android.rules,添加如下代碼:
# adb protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>" # fastboot protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>" # adb protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>" # fastboot protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>" # adb protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>" # fastboot protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>" # adb protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>" # fastboot protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>" # adb protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>" # adb protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>" # fastboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>" # usbboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>" # usbboot protocol on panda (PandaBoard ES) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>" # adb protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>" # fastboot protocol on grouper/tilapia (Nexus 7) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>" # adb protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>" # fastboot protocol on manta (Nexus 10) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
然后將<username>替換為系統的用戶名。
4.配置輸出目錄
export OUT_DIR_COMMON_BASE=<path-to-your-out-directory>
5.設置ccache
export USE_CCACHE=1
默認存放在~/.ccache,如果是NFS文件系統還需特別指定:
export CCACHE_DIR=<path-to-your-cache-directory>
建議cache大小50-100G,源碼下載完后執行:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
環境配置完成,接下來下載源碼。
二、源碼下載
1.安裝Repo
新建bin目錄並添加到環境變量中:
$ mkdir ~/bin
$ PATH=~/bin:$PATH
下載Repo
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
由於國內被牆,google可能無法下載,推薦使用tsinghua的aosp源下載:
git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
拷貝到bin目錄並添加權限:
cp git-repo/repo ~/bin/
chmod a+x ~/bin/repo
修改repo文件,設置REPO_URL如下:
REPO_URL = 'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'
2.初始化repo
創建源碼下載目錄:
$ mkdir ~/source
$ cd ~/srouce
初始化repo
$ repo init -u https://android.googlesource.com/platform/manifest
google連不上的可以用這個:
repo init -u git://aosp.tuna.tsinghua.edu.cn/android/platform/manifest
此命令默認下載master分支的最新版本,此時即5.1,如果要指定版本,需要加-b,如下:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1

Build Branch Version Supported devices
LMY47Z android-5.1.1_r4 Lollipop Nexus 6 (For Sprint, USC ONLY)
LMY48B android-5.1.1_r3 Lollipop Nexus 5
LMY47X android-5.1.1_r2 Lollipop Nexus 9 (volantis)
LMY47V android-5.1.1_r1 Lollipop Nexus 7 (flo/grouper), Nexus 10, Nexus Player
LMY47O android-5.1.0_r5 Lollipop Nexus 4, Nexus 7 (flo/deb)
LMY47M android-5.1.0_r4 Lollipop Nexus 6 (For T-Mobile ONLY)
LMY47I android-5.1.0_r3 Lollipop Nexus 5, Nexus 6
LMY47E android-5.1.0_r2 Lollipop Nexus 6
LMY47D android-5.1.0_r1 Lollipop Nexus 5, Nexus 6, Nexus 7 (grouper/tilapia), Nexus 10, Nexus Player
LRX22L android-5.0.2_r3 Lollipop Nexus 9 (volantis/volantisg)
LRX22G android-5.0.2_r1 Lollipop Nexus 7 (flo/deb/grouper/tilapia), Nexus 10
LRX22C android-5.0.1_r1 Lollipop Nexus 4, Nexus 5, Nexus 6 (shamu), Nexus 7 (flo), Nexus 9 (volantis/volantisg), Nexus 10
LRX21V android-5.0.0_r7.0.1 Lollipop Nexus Player (fugu)
LRX21T android-5.0.0_r6.0.1 Lollipop Nexus 4
LRX21R android-5.0.0_r5.1.0.1 Lollipop Nexus 9 (volantis)
LRX21Q android-5.0.0_r5.0.1 Lollipop Nexus 9 (volantis)
LRX21P android-5.0.0_r4.0.1 Lollipop Nexus 7 (flo/grouper), Nexus 10
LRX21O android-5.0.0_r3.0.1 Lollipop Nexus 5 (hammerhead), Nexus 6 (shamu)
LRX21M android-5.0.0_r2.0.1 Lollipop Nexus Player (fugu)
LRX21L android-5.0.0_r1.0.1 Lollipop Nexus 9 (volantis)
KTU84Q android-4.4.4_r2 KitKat Nexus 5 (hammerhead) (For 2Degrees/NZ, Telstra/AUS and India ONLY)
KTU84P android-4.4.4_r1 KitKat Nexus 5, Nexus 7 (flo/deb/grouper/tilapia), Nexus 4, Nexus 10
KTU84M android-4.4.3_r1.1 KitKat Nexus 5 (hammerhead)
KTU84L android-4.4.3_r1 KitKat Nexus 7 (flo/deb/grouper/tilapia), Nexus 4, Nexus 10
KVT49L android-4.4.2_r2 KitKat Nexus 7 (deb Verizon)
KOT49H android-4.4.2_r1 KitKat Nexus 5, Nexus 7 (flo/deb/grouper/tilapia), Nexus 4, Nexus 10
KOT49E android-4.4.1_r1 KitKat Nexus 5, Nexus 7 (flo/deb/grouper/tilapia), Nexus 4, Nexus 10
KRT16S android-4.4_r1.2 KitKat Nexus 7 (flo/deb/grouper/tilapia), Nexus 4, Nexus 10
KRT16M android-4.4_r1 KitKat Nexus 5 (hammerhead)
JLS36I android-4.3.1_r1 Jelly Bean Nexus 7 (deb)
JLS36C android-4.3_r3 Jelly Bean Nexus 7 (deb)
JSS15R android-4.3_r2.3 Jelly Bean Nexus 7 (flo)
JSS15Q android-4.3_r2.2 Jelly Bean Nexus 7 (flo)
JSS15J android-4.3_r2.1 Jelly Bean Nexus 7 (flo/deb)
JSR78D android-4.3_r2 Jelly Bean Nexus 7 (deb)
JWR66Y android-4.3_r1.1 Jelly Bean Galaxy Nexus, Nexus 7 (grouper/tilapia), Nexus 4, Nexus 10
JWR66V android-4.3_r1 Jelly Bean Galaxy Nexus, Nexus 7 (grouper/tilapia), Nexus 4, Nexus 10
JWR66N android-4.3_r0.9.1 Jelly Bean Galaxy Nexus, Nexus 7 (grouper/tilapia/flo), Nexus 4, Nexus 10
JWR66L android-4.3_r0.9 Jelly Bean Nexus 7
JDQ39E android-4.2.2_r1.2 Jelly Bean Nexus 4
JDQ39B android-4.2.2_r1.1 Jelly Bean Nexus 7
JDQ39 android-4.2.2_r1 Jelly Bean Galaxy Nexus, Nexus 7, Nexus 4, Nexus 10
JOP40G android-4.2.1_r1.2 Jelly Bean Nexus 4
JOP40F android-4.2.1_r1.1 Jelly Bean Nexus 10
JOP40D android-4.2.1_r1 Jelly Bean Galaxy Nexus, Nexus 7, Nexus 4, Nexus 10
JOP40C android-4.2_r1 Jelly Bean Galaxy Nexus, Nexus 7, Nexus 4, Nexus 10
JZO54M android-4.1.2_r2.1 Jelly Bean
JZO54L android-4.1.2_r2 Jelly Bean
JZO54K android-4.1.2_r1 Jelly Bean Nexus S, Galaxy Nexus, Nexus 7
JRO03S android-4.1.1_r6.1 Jelly Bean Nexus 7
JRO03R android-4.1.1_r6 Jelly Bean Nexus S 4G
JRO03O android-4.1.1_r5 Jelly Bean Galaxy Nexus
JRO03L android-4.1.1_r4 Jelly Bean Nexus S
JRO03H android-4.1.1_r3 Jelly Bean
JRO03E android-4.1.1_r2 Jelly Bean Nexus S
JRO03D android-4.1.1_r1.1 Jelly Bean Nexus 7
JRO03C android-4.1.1_r1 Jelly Bean Galaxy Nexus
IMM76L android-4.0.4_r2.1 Ice Cream Sandwich
IMM76K android-4.0.4_r2 Ice Cream Sandwich Galaxy Nexus
IMM76I android-4.0.4_r1.2 Ice Cream Sandwich Galaxy Nexus
IMM76D android-4.0.4_r1.1 Ice Cream Sandwich Nexus S, Nexus S 4G, Galaxy Nexus
IMM76 android-4.0.4_r1 Ice Cream Sandwich
IML77 android-4.0.3_r1.1 Ice Cream Sandwich
IML74K android-4.0.3_r1 Ice Cream Sandwich Nexus S
ICL53F android-4.0.2_r1 Ice Cream Sandwich Galaxy Nexus
ITL41F android-4.0.1_r1.2 Ice Cream Sandwich Galaxy Nexus
ITL41D android-4.0.1_r1.1 Ice Cream Sandwich Galaxy Nexus
ITL41D android-4.0.1_r1 Ice Cream Sandwich Galaxy Nexus
GWK74 android-2.3.7_r1 Gingerbread Nexus S 4G
GRK39F android-2.3.6_r1 Gingerbread Nexus One, Nexus S
GRK39C android-2.3.6_r0.9 Gingerbread Nexus S
GRJ90 android-2.3.5_r1 Gingerbread Nexus S 4G
GRJ22 android-2.3.4_r1 Gingerbread Nexus One, Nexus S, Nexus S 4G
GRJ06D android-2.3.4_r0.9 Gingerbread Nexus S 4G
GRI54 android-2.3.3_r1.1 Gingerbread Nexus S
GRI40 android-2.3.3_r1 Gingerbread Nexus One, Nexus S
GRH78C android-2.3.2_r1 Gingerbread Nexus S
GRH78 android-2.3.1_r1 Gingerbread Nexus S
GRH55 android-2.3_r1 Gingerbread earliest Gingerbread version, Nexus S
FRK76C android-2.2.3_r2 Froyo
FRK76 android-2.2.3_r1 Froyo
FRG83G android-2.2.2_r1 Froyo Nexus One
FRG83D android-2.2.1_r2 Froyo Nexus One
FRG83 android-2.2.1_r1 Froyo Nexus One
FRG22D android-2.2_r1.3 Froyo
FRG01B android-2.2_r1.2 Froyo
FRF91 android-2.2_r1.1 Froyo Nexus One
FRF85B android-2.2_r1 Froyo Nexus One
EPF21B android-2.1_r2.1p2 Eclair
ESE81 android-2.1_r2.1s Eclair
EPE54B android-2.1_r2.1p Eclair Nexus One
ERE27 android-2.1_r2 Eclair Nexus One
ERD79 android-2.1_r1 Eclair Nexus One
ESD56 android-2.0.1_r1 Eclair
ESD20 android-2.0_r1 Eclair
DMD64 android-1.6_r1.5 Donut
DRD20 android-1.6_r1.4
DRD08 android-1.6_r1.3
DRC92 android-1.6_r1.2
如果是首次使用git會提示email驗證,輸入如下命令:
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
3.替換已有的AOSP源代碼的remote
如果你之前已經通過某種途徑獲得了AOSP的源碼,但是你希望以后通過TUNA同步,只需要將.repo/manifest.xml中的
<remote name="aosp" fetch=".." review="https://android-review.googlesource.com/" />
改為
<remote name="aosp" fetch="git://aosp.tuna.tsinghua.edu.cn/android/" review="https://android-review.googlesource.com/" />
4.下載源碼
$ repo sync
這一步要等好久..好久...好久....repo可以看做git的升級版,有斷點續傳的功能,所以慢慢下吧,5.1大概下了30G
三、源碼編譯
1.初始化
執行 $ source build/envsetup.sh 或 $ . build/envsetup.sh
2.選擇平台編譯選項
$ lunch aosp_arm-eng
可以僅輸入lunch來選擇可選的編譯目標。其中各個參數含義為,eng: 工程機,user:最終用戶機,userdebug:調試測試機,tests:測試機
3.編譯
make
如果開發機器配置較好,例如雙核四線程,可以使用
make -j4
當然也可以使用 make -j16、
make -j32,make失敗或停止后,可以使用make -k 繼續編譯。
接下來又是漫長的等待過程。等。。。等。。。等。。。。
若干小時候,出現錯誤:
build/core/shared_library_internal.mk:68 recipe for target 'out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so' failed
make: ** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] Error 1
make: ** Deleting file 'out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/
按照http://jileniao.net/ubunt-add-swap-to-build-libwebviewchromium.html的方法解決。
1.#dd if=/dev/zero of=/opt/swap1 bs=1024 count=1024000
(count的值等於1024 x 你想要的文件大小, 4096000是4G,1024000是1G)
2.#mkswap /opt/swap1
(把這個文件變成swap文件)
3.#swapon /opt/swap1
(啟用這個swap文件)
4.為了使每次開機時都能正常使用swap文件,所以這里需要把swap文件增加到fstab文件中
#sudo vi /etc/fstab
在最后一行增加如下內容
/opt/swap1 swap swap defaults 0 0
重復上述4步,再次增加一個/opt/swap2的文件。
據說增加內存也可以,我也沒試過。
4.結果展示
啟動模擬器: emulator &