【Bash百寶箱】從Android.mk到Android.bp
最近更新了Android Nougat原始碼,無意間發現Android的編譯系統已經發生了巨大改變,到處是“Android.bp”檔案,下面就來看一下這個bp檔案到底是何方神聖。
首先從Soong說起,Soong是Android中對基於GNU make的編譯系統的替代物,編譯檔案“Android.mk”被替換為“Android.bp”。bp檔案的目的就是一切從簡,格式類似於JSON,像mk檔案的條件控制語句等這些複雜的東西都由Go來處理,bp檔案是由Go語言來解析的,為“blueprint”框架,隨後轉為Ninja檔案,這大概就是Google的Go興起後轉而使用Go來重構自己的編譯系統。bp檔案的語法、語義同Bazel,如下網址是Bazel的參考文件:
Bazel是Google開源的自動化構建工具,意在替換複雜、臃腫的Makefile,這裡不做詳細介紹。下面介紹bp檔案的常用規則。
1、模組
定義一個模組從模組的型別開始,模組有不同的型別,如下例子中的“cc_binary”,模組包含一些屬性,格式為“property-name: property-value”,其中name屬性必須指定,其屬性值必須是全域性唯一的。
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c" ],
shared_libs: ["libz"],
stl: "none",
}
預設模組“cc_defaults”的用法如下(效果同上面的例子):
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
2、變數
變數賦值使用“=”或“+=”,有其作用域,例子如下。
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
3、註釋
註釋包括單行註釋和多行註釋,例子如下。
// single-line comment
/*
* multi-line comment
*/
4、型別
變數和屬性都有型別,變數的型別在其第一次賦值時而定,屬性的型別由其模組型別而定,具體支援以下幾種型別。
Bool型別:true
或false
String型別:"string"
字串列表型別:["string1", "string2"]
Map型別:{key1: "value1", key2: "value2"}
5、操作符
String型別、字串列表型別和Map型別支援操作符“+”。
6、格式控制工具
bpfmt是一個bp檔案的格式控制工具,包括4個空格的縮排、列表有多個元素時每個元素一行、列表和map的最後一個元素多一個冗餘的逗號等等,如下例子用於遞迴格式化當前目錄下的所有bp檔案
bpfmt -w .
7、從Android.mk到Android.bp
androidmk Android.mk > Android.bp
androidmk工具可以把mk檔案轉換為bp檔案,但一些發雜的用法和自定義的規則需要手動轉換。