理解Android.bp

一、簡介
早期的Android系統都是採用Android.mk的配置來編譯源碼,從Android 7.0開始引入Android.bp。很明顯Android.bp的出現就是爲了替換掉Android.mk。

再來說一說跟着Android版本相應的發展演變過程:

Android 7.0引入ninja和kati
Android 8.0使用Android.bp來替換Android.mk,引入Soong
Android 9.0強制使用Android.bp
轉換關係圖如下:

android_build;

通過Kati將Android.mk轉換成ninja格式的文件,通過Blueprint+ Soong將Android.bp轉換成ninja格式的文件,通過androidmk將將Android.mk轉換成Android.bp,但針對沒有分支、循環等流程控制的Android.mk纔有效。

這裏涉及到Ninja, kati, Soong, bp概念,接下來分別簡單介紹一下。

  1. Ninja
    ninja是一個編譯框架,會根據相應的ninja格式的配置文件進行編譯,但是ninja文件一般不會手動修改,而是通過將Android.bp文件轉換成ninja格文件來編譯。

  2. Android.bp
    Android.bp的出現就是爲了替換Android.mk文件。bp跟mk文件不同,它是純粹的配置,沒有分支、循環等流程控制,不能做算數邏輯運算。如果需要控制邏輯,那麼只能通過Go語言編寫。

  3. Soong
    Soong類似於之前的Makefile編譯系統的核心,負責提供Android.bp語義解析,並將之轉換成Ninja文件。Soong還會編譯生成一個androidmk命令,用於將Android.mk文件轉換爲Android.bp文件,不過這個轉換功能僅限於沒有分支、循環等流程控制的Android.mk纔有效。

  4. Blueprint
    Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong負責Android編譯而設計的工具,而Blueprint只是解析文件格式,Soong解析內容的具體含義。Blueprint和Soong都是由Golang寫的項目,從Android 7.0,prebuilts/go/目錄下新增Golang所需的運行環境,在編譯時使用。

  5. Kati
    kati是專爲Android開發的一個基於Golang和C++的工具,主要功能是把Android中的Android.mk文件轉換成Ninja文件。代碼路徑是build/kati/,編譯後的產物是ckati。

二、Android.bp語法
Android.bp是一種純粹的配置文件,設計簡單,沒有條件判斷或控制流語句,採用在Go語言編寫控制邏輯。

Android.bp文件記錄着模塊信息,每一個模塊以模塊類型開始,後面跟着一組模塊的屬性,以名值對(name: value)表示,每個模塊都必須有一個 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”],
}

再附一個帶解釋的例子
cc_binary { //編譯成可執行文件,cc_library_shared編譯成動態庫
name: “bt_test”, //編譯出的可執行文件的名字爲bt_test
vendor: true, //編譯出來放在/vendor目錄下(默認是放在/system目錄下)
srcs: [“bt_test.cpp”], //源文件,格式[“a.cpp”, “b.cpp”]
cflags: [
“-Wall”,
“-Werror”,
“-Wno-unused-parameter”,
], //編譯flag
include_dirs: [
“hardware/interfaces/halnode/1.0/default”, //用戶值定的頭文件查找路徑
],
shared_libs: [ //編譯依賴的動態庫
“liblog”,
“libutils”,
“libhidltransport”,
[email protected]”,
“libhidlbase”,
“libbase”,
],
}

其它可用選項
subdirs = [“ndk”]   //指定進入下層ndk目錄進行編譯
export_include_dirs: [   //從其他模塊添加頭文件檢索路徑 “include”, “include/camera” ],
export_shared_lib_headers: [“libcamera_metadata”],
local_include_dirs: [“aidl”],   //如果從當前目錄添加路徑時使用,將./aidl目錄加入頭文件的搜索路徑
static_libs: [“libupdater”],   //指定對庫libupdater進行靜態鏈接 static_executable: true,

官方最全解釋
Android.bp Build Docs (android-8.0.0-r9):http://note.qidong.name/demo/soong_build/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章