Android.bp語法和使用方法講解
1. Android.bp 文件是什么?
Android.bp 文件首先是 Android 系統(tǒng)的一種編譯配置文件,是用來代替原來的 Android.mk文件的。在 Android7.0 以前,Android 都是使用 make 來組織各模塊的編譯,對(duì)應(yīng)的編譯配置文件就是 Android.mk。
在 Android7.0 開始,Google 引入了 ninja 和 kati 來編譯,為啥引入 ninja?因?yàn)殡S著 Android 越來越龐大,module 越來越多,編譯時(shí)間也越來越久,而使用 ninja 在編譯的并發(fā)處理上較 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系統(tǒng)使用 Blueprint 和 Soong 工具來解析 Android.bp 轉(zhuǎn)換生成 ninja文件。為了兼容老的 mk 配置文件,Android 當(dāng)初也開發(fā)了 Kati 工具來轉(zhuǎn)換 mk 文件生成ninja,目前 Android Q 里邊,還是支持 Android.mk 方式的。相信在將來的版本中,會(huì)徹底讓 mk 文件廢棄,同時(shí) Kati 也就淘汰了,只保留 bp 配置方式,所以我們要提前學(xué)習(xí)bp。
這里涉及到Ninja, kati, Soong, bp概念,接下來分別簡(jiǎn)單介紹一下。
1.1 Ninja
ninja是一個(gè)編譯框架,會(huì)根據(jù)相應(yīng)的ninja格式的配置文件進(jìn)行編譯,但是ninja文件一般不會(huì)手動(dòng)修改,而是通過將Android.bp文件轉(zhuǎn)換成ninja格文件來編譯。
1.2 Android.bp
Android.bp的出現(xiàn)就是為了替換Android.mk文件。bp跟mk文件不同,它是純粹的配置,沒有分支、循環(huán)等流程控制,不能做算數(shù)邏輯運(yùn)算。如果需要控制邏輯,那么只能通過Go語言編寫。
1.3 Soong
Soong類似于之前的Makefile編譯系統(tǒng)的核心,負(fù)責(zé)提供Android.bp語義解析,并將之轉(zhuǎn)換成Ninja文件。Soong還會(huì)編譯生成一個(gè)androidmk命令,用于將Android.mk文件轉(zhuǎn)換為Android.bp文件,不過這個(gè)轉(zhuǎn)換功能僅限于沒有分支、循環(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. 語法對(duì)應(yīng)規(guī)則
我們可能已經(jīng)習(xí)慣了Android.mk 中的語法,現(xiàn)在要變更為 Android.bp, 為了便于理解,可以找到源碼,查看Android.mk 與 Android.bp 語法對(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. 語法講解
為了便于理解,把Android.mk 和 Android.bp 的語法放在一起說明,更容易理解一點(diǎn):
4.1 編譯不同類型的模塊
4.1.1 編譯成 Java 庫
Android.mk include $(BUILD_JAVA_LIBRARY) Android.bp java_library { ...... }
4.1.2 編譯成 Java 靜態(tài)庫
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)庫
Android.mk include $(BUILD_SHARED_LIBRARY) Android.bp cc_library_shared { ...... }
4.1.5 編譯成 Native 靜態(tài)庫
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 編譯成頭文件庫
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 庫依賴
4.3.1 依賴的靜態(tài)庫
Android.mk LOCAL_STATIC_LIBRARIES := Android.bp static_libs: ["xxx", "xxx", ...]
4.3.2 依賴的動(dòng)態(tài)庫
Android.mk LOCAL_SHARED_LIBRARIES := Android.bp shared_libs: ["xxx", "xxx", ...]
4.3.3 依賴的頭文件庫
Android.mk LOCAL_JAVA_LIBRARIES := Android.bp header_libs: ["xxx", "xxx", ...]
4.3.4 依賴的 Java 庫
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: true
4.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語法和使用方法講解的文章就介紹到這了,更多相關(guān)Android.bp語法和使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Android中Service服務(wù)的基礎(chǔ)知識(shí)及編寫方法
這篇文章主要介紹了詳解Android中Service服務(wù)的基礎(chǔ)知識(shí)及編寫方法,包括Service的啟動(dòng)流程及生命周期等基本內(nèi)容,需要的朋友可以參考下2016-04-04Android實(shí)現(xiàn)環(huán)形進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)環(huán)形進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android Studio中CodeStyle模板的配置方式
這篇文章主要介紹了Android Studio中CodeStyle模板的配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android利用BitMap獲得圖片像素?cái)?shù)據(jù)的方法
這篇文章主要介紹了Android利用BitMap獲得圖片像素?cái)?shù)據(jù)的方法,結(jié)合實(shí)例對(duì)比分析了Android獲取圖片像素?cái)?shù)據(jù)的相關(guān)技巧,需要的朋友可以參考下2016-02-02Android仿zaker用手向上推動(dòng)的特效開發(fā)【推動(dòng)門效果】(附demo源碼下載)
這篇文章主要介紹了Android仿zaker用手向上推動(dòng)的特效,結(jié)合完整實(shí)例形式分析了Android滑動(dòng)切換效果的實(shí)現(xiàn)步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07Android Jetpack架構(gòu)中ViewModel接口暴露的不合理探究
這篇文章主要介紹了Android Jetpack架構(gòu)組件 ViewModel詳解,ViewModel類讓數(shù)據(jù)可在發(fā)生屏幕旋轉(zhuǎn)等配置更改后繼續(xù)存在,ViewModel類旨在以注重生命周期的方式存儲(chǔ)和管理界面相關(guān)的數(shù)據(jù)。感興趣可以來學(xué)習(xí)一下2022-07-07Android LinearLayout實(shí)現(xiàn)自動(dòng)換行
這篇文章主要為大家詳細(xì)介紹了Android LinearLayout實(shí)現(xiàn)自動(dòng)換行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08