作為一個(gè)Android開發(fā)者沒有編譯過Android源碼怎么能行墓臭,如果還沒編譯過那就趕緊看看下面的內(nèi)容。
先介紹一下Android源碼有關(guān)的一些網(wǎng)址:
源碼官網(wǎng):https://source.android.com/
搭建編譯環(huán)境:https://source.android.com/source/initializing.html
下載源代碼:https://source.android.com/source/downloading.html
編譯 Android:https://source.android.com/setup/build/building
Android鏡像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
一、設(shè)置 Mac OS 編譯環(huán)境
創(chuàng)建區(qū)分大小寫的磁盤映像
Mac OS 默認(rèn)會(huì)在不區(qū)分大小寫的文件系統(tǒng)中運(yùn)行谜喊。Git 并不支持此類文件系統(tǒng),而且此類文件系統(tǒng)會(huì)導(dǎo)致某些 Git 命令(例如 git status)的行為出現(xiàn)異常倦始。因此斗遏,建議在區(qū)分大小寫的文件系統(tǒng)中對(duì) AOSP 源文件進(jìn)行操作。
1鞋邑、shell命令創(chuàng)建
可以通過 shell 使用以下命令創(chuàng)建磁盤映像:
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 200g ~/android.dmg
這將創(chuàng)建一個(gè) .dmg(也可能是 .dmg.sparseimage)文件诵次,該文件在裝載后可用作具有 Android 開發(fā)所需格式的存儲(chǔ)卷。
如果以后需要更大的存儲(chǔ)卷炫狱,還可以使用以下命令來調(diào)整稀疏映像的大性謇痢:
hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
- 要載磁盤映像,請(qǐng)運(yùn)行以下命令:
hdiutil attach ~/android.dmg -mountpoint /Volumes/android
- 要卸載磁盤映像视译,請(qǐng)運(yùn)行以下命令:
hdiutil detach /Volumes/android
裝載 android 存儲(chǔ)卷后嬉荆,您將在其中開展所有工作。您可以像對(duì)待外接式存儲(chǔ)盤一樣將其彈出(卸載)酷含。
2鄙早、磁盤工具創(chuàng)建
設(shè)置文件描述符數(shù)量上限
在 Mac OS 中,可同時(shí)打開的文件描述符的默認(rèn)數(shù)量上限太低椅亚,在高度并行的編譯流程中限番,可能會(huì)超出此上限。
要提高此上限呀舔,請(qǐng)將下列行添加到 ~/.bash_profile 中:
# set the number of open files to be 1024
ulimit -S -n 1024
二弥虐、下載Android源碼
1扩灯、安裝 Repo
Repo 是一款工具,可讓您在 Android 環(huán)境中更輕松地使用 Git
1.要安裝 Repo霜瘪,請(qǐng)執(zhí)行以下操作:
確保主目錄下有一個(gè) bin/ 目錄珠插,并且該目錄包含在路徑中:
mkdir ~/bin
PATH=~/bin:$PATH
2.下載 Repo 工具,并確保它可執(zhí)行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
2颖对、初始化 Repo 客戶端
運(yùn)行 repo init 以獲取最新版本的 Repo 及其最近的所有錯(cuò)誤更正內(nèi)容捻撑。您必須為清單指定一個(gè)網(wǎng)址,該網(wǎng)址用于指定 Android 源代碼中包含的各個(gè)代碼庫將位于工作目錄中的什么位置缤底。
repo init -u https://android.googlesource.com/platform/manifest
要對(duì)“master”以外的分支進(jìn)行校驗(yàn)顾患,請(qǐng)使用 -b
來指定相應(yīng)分支。要查看分支列表个唧,請(qǐng)參閱源代碼標(biāo)記和版本江解。
repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r42
三、下載 Android 源代碼
要將 Android 源代碼樹從默認(rèn)清單中指定的代碼庫下載到工作目錄坑鱼,請(qǐng)運(yùn)行以下命令:
repo sync
四膘流、編譯 Android
1、設(shè)置環(huán)境
使用 envsetup.sh 腳本初始化環(huán)境鲁沥。
source build/envsetup.sh
或
. build/envsetup.sh
2、選擇目標(biāo)
使用 lunch 選擇要編譯的目標(biāo)耕魄。確切的配置可作為參數(shù)進(jìn)行傳遞画恰。例如,以下命令表示針對(duì)模擬器進(jìn)行完整編譯吸奴,并且啟用所有調(diào)試功能.
lunch aosp_arm-eng
如果在沒有參數(shù)的情況下運(yùn)行允扇,則 lunch
會(huì)提示您從菜單中選擇目標(biāo)。要了解所有現(xiàn)有設(shè)備的編譯配置则奥,請(qǐng)參閱選擇設(shè)備編譯系統(tǒng)一文考润。
所有編譯目標(biāo)都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號(hào)读处。BUILDTYPE 是以下類型之一
user
權(quán)限受限糊治;適用于生產(chǎn)環(huán)境
userdebug
與“user”類似,但具有 root 權(quán)限和調(diào)試功能罚舱;是進(jìn)行調(diào)試時(shí)的首選編譯類型
eng
具有額外調(diào)試工具的開發(fā)配置
五井辜、編譯代碼
請(qǐng)使用 make
進(jìn)行所有編譯。make
可以使用 -jN 參數(shù)處理并行任務(wù)管闷。如果您未提供 -j 參數(shù)粥脚,編譯系統(tǒng)便會(huì)自動(dòng)選擇其認(rèn)為對(duì)您的系統(tǒng)最佳的并行任務(wù)計(jì)數(shù)。
編譯完成后out/target/product/generic 目錄生成了三個(gè)重要的鏡像文件: system.img包个、userdata.img刷允、ramdisk.img:
system.img
:系統(tǒng)鏡像,里面包含了Android系統(tǒng)主要的目錄和文件,通過init.c進(jìn)行解析并mount掛載到/system目錄下树灶。
userdata.img
:用戶鏡像纤怒,是Android系統(tǒng)中存放用戶數(shù)據(jù)的,通過init.c進(jìn)行解析并mount掛載到/data目錄下破托。
ramdisk.img
:根文件系統(tǒng)鏡像肪跋,包含一些啟動(dòng)Android系統(tǒng)的重要文件,比如init.rc土砂。
六州既、啟動(dòng)模擬器
source build/envsetup.sh
lunch aosp_x86_64-eng
emulator -partition-size 2562 -memory 2048
七、Android源碼導(dǎo)入Android Studio
1萝映、由于Android太大了,所以我們需要給IDE更多的內(nèi)存:
在Help > Edit Custom VM 中添加:
-Xms1g
-Xmx5g
這兩個(gè)參數(shù)的意思是初始堆內(nèi)存為1G,最大堆內(nèi)存為5G,
2吴叶、AndroidStudio的類大小配置,在Help -> Edit custom properties中添加:
idea.max.intellisense.filesize=100000
這個(gè)參數(shù)是定義AS默認(rèn)的類大小的,默認(rèn)值是2500,會(huì)導(dǎo)致太大的Java文件不能被識(shí)別,把這個(gè)數(shù)調(diào)大了之后,就可以導(dǎo)入更大的Java文件。
配置完成后重啟IDE
3序臂、源碼導(dǎo)入
首先我們還是要執(zhí)行一遍上述的source build/envsetup.sh 命令和 lunch 命令,當(dāng)然,如果終端沒有關(guān)閉的話,可以省略這一步,
然后執(zhí)行
mmm development/tools/idegen
編譯生成idegen.jar蚌卤,生成完idegen.jar之后,就可以使用命令來掃描生成ipr文件了:
sudo ./development/tools/idegen/idegen.sh
此時(shí)在根目錄下,就已經(jīng)生成了android.ipr奥秆、android.iml逊彭,可以將整個(gè)源代碼導(dǎo)入AS。
(可選)設(shè)置模塊過濾
有些不想導(dǎo)入AS的模塊构订,可以通過在android.iml中加入excludeFolder侮叮,達(dá)到過濾效果。
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/abi"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/art"/>
<excludeFolder url="file://$MODULE_DIR$/bionic"/>
<excludeFolder url="file://$MODULE_DIR$/bootable"/>
<excludeFolder url="file://$MODULE_DIR$/out"/>
<excludeFolder url="file://$MODULE_DIR$/pdk"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilts"/>
<excludeFolder url="file://$MODULE_DIR$/sdk"/>
<excludeFolder url="file://$MODULE_DIR$/system"/>
<excludeFolder url="file://$MODULE_DIR$/tools"/>
<excludeFolder url="file://$MODULE_DIR$/trusty"/>
<excludeFolder url="file://$MODULE_DIR$/vendor"/>
...
八悼瘾、編譯中遇到的問題
ninja: build stopped: subcommand failed.
14:03:54 ninja failed with: exit status 1
https://github.com/phracker/MacOSX-SDKs/releases
下載sdk 12.0版本囊榜,解壓,然后copy到
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs