Android.bp語(yǔ)法和使用方法講解
1. Android.bp 文件是什么?
Android.bp 文件首先是 Android 系統(tǒng)的一種編譯配置文件,是用來(lái)代替原來(lái)的 Android.mk文件的。在 Android7.0 以前,Android 都是使用 make 來(lái)組織各模塊的編譯,對(duì)應(yīng)的編譯配置文件就是 Android.mk。
在 Android7.0 開始,Google 引入了 ninja 和 kati 來(lái)編譯,為啥引入 ninja?因?yàn)殡S著 Android 越來(lái)越龐大,module 越來(lái)越多,編譯時(shí)間也越來(lái)越久,而使用 ninja 在編譯的并發(fā)處理上較 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系統(tǒng)使用 Blueprint 和 Soong 工具來(lái)解析 Android.bp 轉(zhuǎn)換生成 ninja文件。為了兼容老的 mk 配置文件,Android 當(dāng)初也開發(fā)了 Kati 工具來(lái)轉(zhuǎn)換 mk 文件生成ninja,目前 Android Q 里邊,還是支持 Android.mk 方式的。相信在將來(lái)的版本中,會(huì)徹底讓 mk 文件廢棄,同時(shí) Kati 也就淘汰了,只保留 bp 配置方式,所以我們要提前學(xué)習(xí)bp。
這里涉及到Ninja, kati, Soong, bp概念,接下來(lái)分別簡(jiǎn)單介紹一下。
1.1 Ninja
ninja是一個(gè)編譯框架,會(huì)根據(jù)相應(yīng)的ninja格式的配置文件進(jìn)行編譯,但是ninja文件一般不會(huì)手動(dòng)修改,而是通過(guò)將Android.bp文件轉(zhuǎn)換成ninja格文件來(lái)編譯。
1.2 Android.bp
Android.bp的出現(xiàn)就是為了替換Android.mk文件。bp跟mk文件不同,它是純粹的配置,沒(méi)有分支、循環(huán)等流程控制,不能做算數(shù)邏輯運(yùn)算。如果需要控制邏輯,那么只能通過(guò)Go語(yǔ)言編寫。
1.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才有效。
1.4 Blueprint
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong負(fù)責(zé)Android編譯而設(shè)計(jì)的工具,而Blueprint只是解析文件格式,Soong解析內(nèi)容的具體含義。Blueprint和Soong都是由Golang寫的項(xiàng)目,從Android 7.0,prebuilts/go/目錄下新增Golang所需的運(yùn)行環(huán)境,在編譯時(shí)使用。
1.5 Kati
kati是專為Android開發(fā)的一個(gè)基于Golang和C++的工具,主要功能是把Android中的Android.mk文件轉(zhuǎn)換成Ninja文件。代碼路徑是build/kati/,編譯后的產(chǎn)物是ckati。

2. 語(yǔ)法對(duì)應(yīng)規(guī)則
我們可能已經(jīng)習(xí)慣了Android.mk 中的語(yǔ)法,現(xiàn)在要變更為 Android.bp, 為了便于理解,可以找到源碼,查看Android.mk 與 Android.bp 語(yǔ)法對(duì)應(yīng)規(guī)則:
源碼位置: /build/soong/androidmk/cmd/androidmk/android.go 中, 這里我只粘貼一部分,完整代碼請(qǐng)查看源文件。
var moduleTypes = map[string]string{
"BUILD_SHARED_LIBRARY": "cc_library_shared",
"BUILD_STATIC_LIBRARY": "cc_library_static",
"BUILD_HOST_SHARED_LIBRARY": "cc_library_host_shared",
"BUILD_HOST_STATIC_LIBRARY": "cc_library_host_static",
"BUILD_HEADER_LIBRARY": "cc_library_headers",
"BUILD_EXECUTABLE": "cc_binary",
"BUILD_HOST_EXECUTABLE": "cc_binary_host",
"BUILD_NATIVE_TEST": "cc_test",
"BUILD_HOST_NATIVE_TEST": "cc_test_host",
"BUILD_NATIVE_BENCHMARK": "cc_benchmark",
"BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",
"BUILD_JAVA_LIBRARY": "java_library_installable", // will be rewritten to java_library by bpfix
"BUILD_STATIC_JAVA_LIBRARY": "java_library",
"BUILD_HOST_JAVA_LIBRARY": "java_library_host",
"BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
"BUILD_PACKAGE": "android_app",
"BUILD_CTS_EXECUTABLE": "cc_binary", // will be further massaged by bpfix depending on the output path
"BUILD_CTS_SUPPORT_PACKAGE": "cts_support_package", // will be rewritten to android_test by bpfix
"BUILD_CTS_PACKAGE": "cts_package", // will be rewritten to android_test by bpfix
"BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix
"BUILD_CTS_HOST_JAVA_LIBRARY": "cts_host_java_library", // will be rewritten to java_library_host by bpfix
}
var prebuiltTypes = map[string]string{
"SHARED_LIBRARIES": "cc_prebuilt_library_shared",
"STATIC_LIBRARIES": "cc_prebuilt_library_static",
"EXECUTABLES": "cc_prebuilt_binary",
"JAVA_LIBRARIES": "java_import",
"ETC": "prebuilt_etc",
}3. 如何把Android.mk 文件轉(zhuǎn)換成 Android.bp
1. 在工程源碼中:
1. source build/envsetup.sh
2. lunch xxx
3. make androidmk
生成androidmk轉(zhuǎn)換工具,路徑為:/out/soong/host/linux-x86/bin/androidmk
2. 直接把你要轉(zhuǎn)換的Android.mk 文件放置到此目錄下,然后執(zhí)行命令:
androidmk Android.mk > Android.bp
4. 語(yǔ)法講解
為了便于理解,把Android.mk 和 Android.bp 的語(yǔ)法放在一起說(shuō)明,更容易理解一點(diǎn):
4.1 編譯不同類型的模塊
4.1.1 編譯成 Java 庫(kù)
Android.mk
include $(BUILD_JAVA_LIBRARY)
Android.bp
java_library {
......
}4.1.2 編譯成 Java 靜態(tài)庫(kù)
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
Android.bp
java_library_static {
......
}4.1.3 編譯成 App 應(yīng)用
Android.mk
include $(BUILD_PACKAGE)
Android.bp
android_app {
......
}4.1.4 編譯成 Native 動(dòng)態(tài)庫(kù)
Android.mk
include $(BUILD_SHARED_LIBRARY)
Android.bp
cc_library_shared {
......
}4.1.5 編譯成 Native 靜態(tài)庫(kù)
Android.mk
include $(BUILD_STATIC_LIBRARY)
Android.bp
cc_library_static {
......
}4.1.6 編譯成 Native 執(zhí)行程序
Android.mk
include $(BUILD_EXECUTABLE)
Android.bp
cc_binary {
......
}4.1.7 編譯成頭文件庫(kù)
Android.mk
include $(BUILD_HEADER_LIBRARY)
Android.bp
cc_library_headers {
......
}4.2 文件路徑
4.2.1 本地頭文件路徑
Android.mk LOCAL_C_INCLUDES := Android.bp local_include_dirs: ["xxx", ...]
4.2.2 導(dǎo)出的頭文件路徑
Android.mk LOCAL_EXPORT_C_INCLUDE_DIRS := Android.bp export_include_dirs: ["xxx", ...]
4.2.3 資源文件路徑
Android.mk LOCAL_RESOURCE_DIR := Android.bp resource_dirs: ["xxx", ...]
4.3 庫(kù)依賴
4.3.1 依賴的靜態(tài)庫(kù)
Android.mk LOCAL_STATIC_LIBRARIES := Android.bp static_libs: ["xxx", "xxx", ...]
4.3.2 依賴的動(dòng)態(tài)庫(kù)
Android.mk LOCAL_SHARED_LIBRARIES := Android.bp shared_libs: ["xxx", "xxx", ...]
4.3.3 依賴的頭文件庫(kù)
Android.mk LOCAL_JAVA_LIBRARIES := Android.bp header_libs: ["xxx", "xxx", ...]
4.3.4 依賴的 Java 庫(kù)
Android.mk LOCAL_STATIC_JAVA_LIBRARIES := Android.bp static_libs: ["xxx", "xxx", ...]
4.4 安裝到不同分區(qū)中
4.4.1 安裝到vendor中
Android.mk
LOCAL_VENDOR_MODULE := true
or
LOCAL_PROPRIETARY_MODULE := true
Android.bp
proprietary: true
or
vendor: true4.4.2 安裝到product中
Android.mk LOCAL_PRODUCT_MODULE := true Android.bp product_specific: true
4.4.3 安裝到odm中
Android.mk LOCAL_ODM_MODULE := true Android.bp device_specific: true
4.5 編譯參數(shù)
4.5.1 C flags
Android.mk LOCAL_CFLAGS := Android.bp cflags: ["xxx", "xxx", ...]
4.5.2 Cpp flags
Android.mk LOCAL_CPPFLAGS := Android.bp cppflags: ["xxx", "xxx", ...]
4.5.3 Java flags
Android.mk LOCAL_JAVACFLAGS := Android.bp javacflags: ["xxx", "xxx", ...]
總結(jié)
到此這篇關(guān)于Android.bp語(yǔ)法和使用方法講解的文章就介紹到這了,更多相關(guān)Android.bp語(yǔ)法和使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android HorizontalScrollView滑動(dòng)與ViewPager切換案例詳解
這篇文章主要介紹了Android HorizontalScrollView滑動(dòng)與ViewPager切換案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
關(guān)于Android中WebView遠(yuǎn)程代碼執(zhí)行漏洞淺析
這篇文章主要給大家介紹了關(guān)于Android中WebView遠(yuǎn)程代碼執(zhí)行漏洞的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
Android實(shí)現(xiàn)ListView異步加載圖片的方法
這篇文章主要介紹了Android實(shí)現(xiàn)ListView異步加載圖片的方法,以實(shí)例形式較為詳細(xì)的分析了Android中ListView異步加載圖片的原理與相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
android支付寶客戶端html5網(wǎng)頁(yè)無(wú)法自動(dòng)關(guān)閉問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了android支付寶客戶端html5網(wǎng)頁(yè)無(wú)法自動(dòng)關(guān)閉問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Android?應(yīng)用程序的啟動(dòng)流程示例詳解
這篇文章主要為大家介紹了Android?應(yīng)用程序的啟動(dòng)流程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
使用RoundedBitmapDrawable生成圓角圖片的方法
由于RoundedBitmapDrawable類沒(méi)有直接提供生成圓形圖片的方法,所以生成圓形圖片首先需要對(duì)原始圖片進(jìn)行裁剪,將圖片裁剪成正方形,最后再生成圓形圖片,具體實(shí)現(xiàn)方法,可以參考下本文2016-09-09
關(guān)于Android多渠道打包問(wèn)題看這一篇就夠了
這篇文章主要介紹了關(guān)于Android程序的多渠道打包方法,還不會(huì)的同學(xué)快進(jìn)來(lái)學(xué)習(xí)下吧,建議收藏以防迷路2021-08-08
詳解Android .9.png “點(diǎn)九”圖片的使用
這篇文章主要為大家詳細(xì)介紹了Android .9.png “點(diǎn)九”圖片的使用方法,感興趣的小伙伴們可以參考一下2016-09-09

