Android.bp 檔案格式

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 檔案中,該值都必須是唯一的,但 namespace 和預先建構的模組中的 name 屬性值則不在此限,這些值可以重複。

srcs 屬性會將用於建構模組的來源檔案指定為字串清單。您可以使用模組參照語法 ":<module-name>",參照產生來源檔案 (例如 genrulefilegroup) 的其他模組輸出內容。

如需有效模組類型及其屬性的清單,請參閱 Soong 模組參考資料

類型

變數和屬性具有強型別,變數會根據第一次指派動態變化,而屬性則由模組類型靜態設定。支援的類型如下:

  • 布林值 (truefalse)
  • 整數 (int)
  • 字串 ("string")
  • 字串清單 (["string1", "string2"])
  • 地圖 ({key1: "value1", key2: ["value2"]})

地圖可包含任何類型的值,包括巢狀地圖。清單和地圖的最後一個值後面可能會加上半形逗號。

Globs

若是檔案清單的屬性 (例如 srcs),也可能採用 glob 模式。Glob 模式可包含一般 UNIX 萬用字元 *,例如 *.java。Glob 模式也可以包含單一 ** 萬用字元做為路徑元素,這可比對零或多個路徑元素。例如,java/**/*.java 會比對 java/Main.javajava/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 包含 Blueprint 檔案的標準格式器,類似 gofmt。如要遞迴重新格式化目前目錄中的所有 Android.bp 檔案,請執行以下指令:

bpfmt -w .

標準格式包含四個空格縮排、在多元素清單中的每個元素後方加上換行符號,以及清單和對應的結尾半形逗號。