Android.bp 檔案格式

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 屬性會以字串清單的形式,指定用於建構模組的來源檔案。如要參照產生來源檔案 (例如 genrulefilegroup) 的其他模組輸出內容,請使用模組參照語法 ":<module-name>"

如需有效模組類型及其屬性的清單,請參閱「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++ 樣式的單行 // 註解。

運算子

字串、字串清單和對映可以使用 + 運算子附加。 您可以使用 + 運算子加總整數。附加對應會產生兩個對應中的索引鍵聯集,並附加兩個對應中任何索引鍵的值。

預設模組

開發人員可以使用預設值模組,在多個模組中重複使用相同的屬性。例如:

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…

  1. 然後,如果 D 是 //namespace:module 形式的完整名稱,系統只會在指定的命名空間中搜尋指定的模組名稱。
  2. 否則,Soong 會先在命名空間 N 中尋找名為 D 的模組。
  3. 如果該模組不存在,Soong 會在命名空間 I1、I2、I3… 中尋找名為 D 的模組。
  4. 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 .

標準格式包括四個空格的縮排、多元素清單中每個元素後的新行,以及清單和對映中的尾隨半形逗號。