按照設計, Android.bp
檔案很簡單。它們不包含條件或控制流語句;所有複雜性都由 Go 編寫的建構邏輯處理。如果可能, Android.bp
檔案的語法和語意與Bazel BUILD 檔案類似。
模組
Android.bp
檔案中的模組以模組類型開頭,後面跟著一組屬性name: "value",
格式為:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
每個模組都必須有一個name
屬性,且該值在所有Android.bp
檔案中必須是唯一的,命名空間和預先建置模組中的name
屬性值除外,這些值可能會重複。
srcs
屬性指定用於建立模組的來源文件,作為字串清單。您可以使用模組引用語法":<module-name>"
引用產生原始檔案的其他模組的輸出,例如genrule
或filegroup
。
有關有效模組類型及其屬性的列表,請參閱Soong Modules Reference 。
類型
變數和屬性是強類型的,變數根據第一次賦值動態設置,屬性由模組類型靜態設定。支援的類型有:
- 布林值(
true
或false
) - 整數 (
int
) - 字串(
"string"
) - 字串清單 (
["string1", "string2"]
) - 地圖 (
{key1: "value1", key2: ["value2"]}
)
映射可以包含任何類型的值,包括巢狀映射。列表和映射的最後一個值後面可能有逗號。
格洛布斯
採用檔案清單的屬性(例如srcs
)也可以採用 glob 模式。 Glob 模式可以包含普通的 UNIX 通配符*
,例如*.java
。 Glob 模式還可以包含單一**
通配符作為路徑元素,它會符合零個或多個路徑元素。例如, java/**/*.java
符合java/Main.java
和java/com/android/Main.java
模式。
變數
Android.bp
檔案可能包含頂級變數賦值:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
變數的作用域為聲明它們的檔案的其餘部分以及任何子藍圖檔案。變數是不可變的,但有一個例外:可以使用+=
賦值將它們附加到後面,但只能在引用它們之前進行。
評論
Android.bp
檔案可以包含 C 風格的多行/* */
和 C++ 風格的單行//
註解。
營運商
可以使用 + 運算子附加字串、字串清單和映射。可以使用+
運算子對整數求和。附加映射會產生兩個映射中鍵的並集,從而附加兩個映射中存在的任何鍵的值。
條件句
Soong 不支援Android.bp
檔案中的條件。相反,需要條件的建置規則的複雜性在 Go 中處理,可以使用高階語言功能,並且可以追蹤條件引入的隱式依賴關係。大多數條件都會轉換為映射屬性,其中選擇映射中的值之一並將其附加到頂級屬性。
例如,要支援特定於體系結構的文件:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
格式化程式
Soong 包含一個藍圖檔案的規範格式化程序,類似於gofmt 。若要遞歸地重新格式化目前目錄中的所有Android.bp
文件,請執行:
bpfmt -w .
規範格式包括四空格縮排、多元素列表的每個元素後面的換行以及列表和映射中的尾隨逗號。