網站首頁 編程語言 正文
1.? Android.bp 文件是什么?
Android.bp 文件首先是 Android 系統的一種編譯配置文件,是用來代替原來的 Android.mk文件的。在 Android7.0 以前,Android 都是使用 make 來組織各模塊的編譯,對應的編譯配置文件就是 Android.mk。
在 Android7.0 開始,Google 引入了 ninja 和 kati 來編譯,為啥引入 ninja?因為隨著 Android 越來越龐大,module 越來越多,編譯時間也越來越久,而使用 ninja 在編譯的并發處理上較 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系統使用 Blueprint 和 Soong 工具來解析 Android.bp 轉換生成 ninja文件。為了兼容老的 mk 配置文件,Android 當初也開發了 Kati 工具來轉換 mk 文件生成ninja,目前 Android Q 里邊,還是支持 Android.mk 方式的。相信在將來的版本中,會徹底讓 mk 文件廢棄,同時 Kati 也就淘汰了,只保留 bp 配置方式,所以我們要提前學習bp。
這里涉及到Ninja, kati, Soong, bp概念,接下來分別簡單介紹一下。
1.1 Ninja
ninja是一個編譯框架,會根據相應的ninja格式的配置文件進行編譯,但是ninja文件一般不會手動修改,而是通過將Android.bp文件轉換成ninja格文件來編譯。
1.2 Android.bp
Android.bp的出現就是為了替換Android.mk文件。bp跟mk文件不同,它是純粹的配置,沒有分支、循環等流程控制,不能做算數邏輯運算。如果需要控制邏輯,那么只能通過Go語言編寫。
1.3 Soong
Soong類似于之前的Makefile編譯系統的核心,負責提供Android.bp語義解析,并將之轉換成Ninja文件。Soong還會編譯生成一個androidmk命令,用于將Android.mk文件轉換為Android.bp文件,不過這個轉換功能僅限于沒有分支、循環等流程控制的Android.mk才有效。
1.4 Blueprint
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong負責Android編譯而設計的工具,而Blueprint只是解析文件格式,Soong解析內容的具體含義。Blueprint和Soong都是由Golang寫的項目,從Android 7.0,prebuilts/go/目錄下新增Golang所需的運行環境,在編譯時使用。
1.5 Kati
kati是專為Android開發的一個基于Golang和C++的工具,主要功能是把Android中的Android.mk文件轉換成Ninja文件。代碼路徑是build/kati/,編譯后的產物是ckati。
?
2.? 語法對應規則
我們可能已經習慣了Android.mk 中的語法,現在要變更為 Android.bp, 為了便于理解,可以找到源碼,查看Android.mk 與 Android.bp 語法對應規則:
源碼位置:?/build/soong/androidmk/cmd/androidmk/android.go 中, 這里我只粘貼一部分,完整代碼請查看源文件。
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 文件轉換成 Android.bp
? ? ? ? ?1. 在工程源碼中:
? ? ? ? ?1.? ?source build/envsetup.sh
? ? ? ? ?2.? ?lunch? xxx?
? ? ? ? ?3.? ?make? androidmk?
? ? ? ? ?生成androidmk轉換工具,路徑為:/out/soong/host/linux-x86/bin/androidmk
? ? ? ? 2.? 直接把你要轉換的Android.mk 文件放置到此目錄下,然后執行命令:
? ? ??????????androidmk? ?Android.mk? >? Android.bp
4.? 語法講解
為了便于理解,把Android.mk 和 Android.bp 的語法放在一起說明,更容易理解一點:
4.1 編譯不同類型的模塊
4.1.1?編譯成 Java 庫
Android.mk
include $(BUILD_JAVA_LIBRARY)
Android.bp
java_library {
......
}
4.1.2?編譯成 Java 靜態庫
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
Android.bp
java_library_static {
......
}
4.1.3?編譯成 App 應用
Android.mk
include $(BUILD_PACKAGE)
Android.bp
android_app {
......
}
4.1.4? 編譯成?Native?動態庫
Android.mk
include $(BUILD_SHARED_LIBRARY)
Android.bp
cc_library_shared {
......
}
4.1.5?編譯成 Native 靜態庫
Android.mk
include $(BUILD_STATIC_LIBRARY)
Android.bp
cc_library_static {
......
}
4.1.6?編譯成 Native 執行程序
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?導出的頭文件路徑
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?依賴的靜態庫
Android.mk
LOCAL_STATIC_LIBRARIES :=
Android.bp
static_libs: ["xxx", "xxx", ...]
4.3.2?依賴的動態庫
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?安裝到不同分區中
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?編譯參數
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", ...]
總結
原文鏈接:https://blog.csdn.net/u012514113/article/details/125443131
相關推薦
- 2022-03-15 this.$cookie.set(‘token‘, data.token) token賦值失效
- 2022-09-25 創建的對象如何在堆區分配內存
- 2022-10-12 Python?Pandas的concat合并_python
- 2022-12-14 C++?容器中map和unordered?map區別詳解_C 語言
- 2022-06-16 詳解Flutter中網絡框架dio的二次封裝_Android
- 2022-03-30 SQL基礎查詢和LINQ集成化查詢_MsSql
- 2022-04-07 C#接口INotifyPropertyChanged使用方法_C#教程
- 2022-08-29 Python可視化神器pyecharts繪制漏斗圖_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支