介紹Android最新的編譯系統(tǒng)
一秃励、簡(jiǎn)介
早期的Android系統(tǒng)都是采用Android.mk的配置來(lái)編譯源碼,從Android 7.0開(kāi)始引入Android.bp。很明顯Android.bp的出現(xiàn)就是為了替換掉Android.mk。
再來(lái)說(shuō)一說(shuō)跟著Android版本相應(yīng)的發(fā)展演變過(guò)程:
- Android 7.0引入ninja和kati
- Android 8.0使用Android.bp來(lái)替換Android.mk挺尾,引入Soong
- Android 9.0強(qiáng)制使用Android.bp
轉(zhuǎn)換關(guān)系圖如下:
;
通過(guò)Kati將Android.mk轉(zhuǎn)換成ninja格式的文件,通過(guò)Blueprint+ Soong將Android.bp轉(zhuǎn)換成ninja格式的文件站绪,通過(guò)androidmk將將Android.mk轉(zhuǎn)換成Android.bp遭铺,但針對(duì)沒(méi)有分支、循環(huán)等流程控制的Android.mk才有效恢准。
這里涉及到Ninja, kati, Soong, bp概念魂挂,接下來(lái)分別簡(jiǎn)單介紹一下。
1. Ninja
ninja是一個(gè)編譯框架馁筐,會(huì)根據(jù)相應(yīng)的ninja格式的配置文件進(jìn)行編譯涂召,但是ninja文件一般不會(huì)手動(dòng)修改,而是通過(guò)將Android.bp文件轉(zhuǎn)換成ninja格文件來(lái)編譯敏沉。
2. Android.bp
Android.bp的出現(xiàn)就是為了替換Android.mk文件果正。bp跟mk文件不同,它是純粹的配置盟迟,沒(méi)有分支秋泳、循環(huán)等流程控制,不能做算數(shù)邏輯運(yùn)算队萤。如果需要控制邏輯,那么只能通過(guò)Go語(yǔ)言編寫矫钓。
3. Soong
Soong類似于之前的Makefile編譯系統(tǒng)的核心要尔,負(fù)責(zé)提供Android.bp語(yǔ)義解析,并將之轉(zhuǎn)換成Ninja文件新娜。Soong還會(huì)編譯生成一個(gè)androidmk命令赵辕,用于將Android.mk文件轉(zhuǎn)換為Android.bp文件,不過(guò)這個(gè)轉(zhuǎn)換功能僅限于沒(méi)有分支概龄、循環(huán)等流程控制的Android.mk才有效还惠。
4. Blueprint
Blueprint是生成、解析Android.bp的工具私杜,是Soong的一部分蚕键。Soong負(fù)責(zé)Android編譯而設(shè)計(jì)的工具,而B(niǎo)lueprint只是解析文件格式衰粹,Soong解析內(nèi)容的具體含義锣光。Blueprint和Soong都是由Golang寫的項(xiàng)目,從Android 7.0铝耻,prebuilts/go/目錄下新增Golang所需的運(yùn)行環(huán)境誊爹,在編譯時(shí)使用蹬刷。
5. Kati
kati是專為Android開(kāi)發(fā)的一個(gè)基于Golang和C++的工具,主要功能是把Android中的Android.mk文件轉(zhuǎn)換成Ninja文件频丘。代碼路徑是build/kati/办成,編譯后的產(chǎn)物是ckati。
二搂漠、Android.bp語(yǔ)法
Android.bp是一種純粹的配置文件迂卢,設(shè)計(jì)簡(jiǎn)單,沒(méi)有條件判斷或控制流語(yǔ)句状答,采用在Go語(yǔ)言編寫控制邏輯冷守。
Android.bp文件記錄著模塊信息,每一個(gè)模塊以模塊類型開(kāi)始惊科,后面跟著一組模塊的屬性拍摇,以名值對(duì)(name: value)表示,每個(gè)模塊都必須有一個(gè) name屬性馆截〕浠睿基本格式,以frameworks/base/services/Android.bp文件為例
java_library {
name: "services",
dex_preopt: {
app_image: true,
profile: "art-profile",
},
srcs: [
"java/**/*.java",
],
static_libs: [
"services.core",
"services.accessibility",
"services.appwidget",
"services.autofill",
"services.backup",
"services.companion",
"services.coverage",
"services.devicepolicy",
"services.midi",
"services.net",
"services.print",
"services.restrictions",
"services.usage",
"services.usb",
"services.voiceinteraction",
"android.hidl.base-V1.0-java",
],
libs: [
"android.hidl.manager-V1.0-java",
"miuisdk",
"miuisystemsdk"
],
}
cc_library_shared {
name: "libandroid_servers",
defaults: ["libservices.core-libs"],
whole_static_libs: ["libservices.core"],
}