Soong 建構系統

在 Android 7.0 版本之前,Android 專門使用 GNU Make 來描述並執行建構規則。Make 建構系統受到廣泛支援及使用,但在 Android 的規模上,變得越來越慢、容易出錯、無法擴充且難以測試。Soong 建構系統提供 Android 建構作業所需的彈性。

因此,平台開發人員應盡快從 Make 改用 Soong。如有任何問題,請向 android- building Google 群組尋求支援。

什麼是 Soong?

Soong 建構系統是在 Android 7.0 (Nougat) 中推出,用於取代 Make。並利用 Kati GNU Make clone 工具和 Ninja 建構系統元件加快 Android 建構速度。

請參閱 Android 開放原始碼計畫 (Android 開放原始碼計畫) 中的 Android Make Build 系統說明,查看一般操作說明Android.mk Writers 的建構系統變更,瞭解從 Make to Soong 調整內容需要的修改內容。

如需重要詞彙的定義,請參閱詞彙表中的建構相關項目;如需完整詳細資料,請參閱 Soong 參考檔案

廠牌與 Soong 比較

以下比較「Make」設定與 Soong 在 Soong 設定 (Blueprint 或 .bp) 中完成相同功能的比較。

製作範例

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Soong 範例

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

如需測試專用的 Soong 設定範例,請參閱簡易建構設定

如需 Android.bp 檔案中的欄位說明,請參閱 Android.bp 檔案格式

特殊模組

某些特殊模組群組具備獨特特性。

預設模組

預設模組可用於在多個模組中重複相同的屬性。舉例來說:

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

預先建構的模組

部分預先建構的模組類型允許模組名稱與來源型的對應項目相同。例如,已有名稱相同的 cc_binary 時,可能會有一個名為 foocc_prebuilt_binary。這樣一來,開發人員就能彈性選擇要在最終產品中納入哪個版本。如果建構設定包含兩個版本,預建模組定義中的 prefer 旗標值會指定哪個版本的優先順序。請注意,部分預先建構模組的名稱開頭不是 prebuilt,例如 android_app_import

命名空間模組

在 Android 從 Make 完全轉換為 Soong 之前,Make 產品設定必須指定 PRODUCT_SOONG_NAMESPACES 值。其值應為以空格分隔的命名空間清單,供 m 指令用來建構 Soong。在 Android 轉換至 Soong 後,啟用命名空間的詳細資料可能會改變。

Soong 讓不同目錄中的模組指定相同名稱,但前提是每個模組是在不同的命名空間中宣告。命名空間的宣告方式如下:

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

請注意,命名空間沒有命名空間;系統會自動將其路徑指派為名稱。

每個 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 會在根命名空間中尋找。