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檔案中必須是唯一的,命名空間和預先建置模組中的name屬性值除外,這些值可能會重複。

srcs屬性指定用於建立模組的來源文件,作為字串清單。您可以使用模組引用語法":<module-name>"引用產生原始檔案的其他模組的輸出,例如genrulefilegroup

有關有效模組類型及其屬性的列表,請參閱Soong Modules Reference

類型

變數和屬性是強類型的,變數根據第一次賦值動態設置,屬性由模組類型靜態設定。支援的類型有:

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

映射可以包含任何類型的值,包括巢狀映射。列表和映射的最後一個值後面可能有逗號。

格洛布斯

採用檔案清單的屬性(例如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 包含一個藍圖檔案的規範格式化程序,類似於gofmt 。若要遞歸地重新格式化目前目錄中的所有Android.bp文件,請執行:

bpfmt -w .

規範格式包括四空格縮排、多元素列表的每個元素後面的換行以及列表和映射中的尾隨逗號。