Android.bp
檔案的設計很簡單,這些檔案不含條件或控制流程陳述式,所有複雜度都由以 Go 編寫的建構邏輯處理。
模組
Android.bp
檔案中的模組會以模組類型開頭,後面接著 name: "value",
格式的一組屬性:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
每個模組都必須有 name
屬性,且值在所有 Android.bp
檔案中都不得重複,但命名空間和預先建構模組中的 name
屬性值除外,這些值可能會重複。
srcs
屬性會以字串清單的形式,指定用於建構模組的來源檔案。如要參照產生來源檔案 (例如 genrule
或 filegroup
) 的其他模組輸出內容,請使用模組參照語法 ":<module-name>"
。
如需有效模組類型及其屬性的清單,請參閱「Soong 模組參考資料」。
類型
變數和屬性是強型別,變數會根據第一次指派動態設定,屬性則由模組類型靜態設定。支援的類型如下:
- 布林值 (
true
或false
) - 整數 (
int
) - 字串 (
"string"
) - 字串清單 (
["string1", "string2"]
) - 地圖 (
{key1: "value1", key2: ["value2"]}
)
對應可包含任何類型的值,包括巢狀對應。清單和對應可能在最後一個值後方有尾隨逗號。
Globs
採用檔案清單的屬性 (例如 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++ 樣式的單行 //
註解。
運算子
字串、字串清單和對映可以使用 + 運算子附加。
您可以使用 +
運算子加總整數。附加對應會產生兩個對應中的索引鍵聯集,並附加兩個對應中任何索引鍵的值。
預設模組
開發人員可以使用預設值模組,在多個模組中重複使用相同的屬性。例如:
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
預先建構的模組
部分預建模組類型允許模組與來源型對應項目同名。舉例來說,如果已有同名的 cc_binary
,則可以有同名的 cc_prebuilt_binary
foo
。開發人員可彈性選擇要在最終產品中加入哪個版本。如果建構設定同時包含這兩個版本,預先建構模組定義中的 prefer
旗標值會決定優先順序。請注意,部分預先建構的模組名稱開頭並非 prebuilt
,例如 android_app_import
。
命名空間模組
在 Android 完全從 Make 轉換為 Soong 之前,Make 產品設定必須指定 PRODUCT_SOONG_NAMESPACES
值。這個值應是以空格分隔的命名空間清單,Soong 會將這些命名空間匯出至 Make,以便由 m
指令建構。Android 轉換為 Soong 後,啟用命名空間的詳細資料可能會有所變更。
只要每個模組都在不同的命名空間中宣告,Soong 就能讓不同目錄中的模組指定相同名稱。開發人員可以宣告命名空間:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
請注意,命名空間沒有 name
屬性,系統會自動將路徑指派為名稱。
系統會根據每個 Soong 模組在樹狀結構中的位置,為其指派命名空間。系統會將每個 Soong 模組視為位於命名空間中,該命名空間是由目前目錄或最接近的祖先目錄中 Android.bp
檔案內的 soong_namespace
所定義。如果找不到這類 soong_namespace
模組,系統會將模組視為位於隱含根命名空間中。
舉例來說,Soong 會嘗試解析命名空間 N 中模組 M 宣告的依附元件 D,該命名空間會匯入命名空間 I1、I2、I3…
- 然後,如果 D 是
//namespace:module
形式的完整名稱,系統只會在指定的命名空間中搜尋指定的模組名稱。 - 否則,Soong 會先在命名空間 N 中尋找名為 D 的模組。
- 如果該模組不存在,Soong 會在命名空間 I1、I2、I3… 中尋找名為 D 的模組。
- Soong 會在根命名空間中尋找。
條件式
Soong 不支援 Android.bp
檔案中的條件。而是以 Go 處理建構規則中需要條件的複雜性,因為 Go 可使用高階語言功能,並追蹤條件導入的隱含依附元件。大多數條件都會轉換為對應屬性,並選取對應中的其中一個值,然後附加至頂層屬性。
舉例來說,如要支援特定架構的檔案,請執行下列操作:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
格式設定工具
Soong 包含 Blueprint 檔案的標準格式化工具,類似於 gofmt。如要以遞迴方式重新格式化目前目錄中的所有 Android.bp
檔案,請執行:
bpfmt -w .
標準格式包括四個空格的縮排、多元素清單中每個元素後的新行,以及清單和對映中的尾隨半形逗號。