宋構建系統

在 Android 7.0 發布之前,Android 僅使用GNU Make來描述和執行其建置規則。 Make 建置系統得到了廣泛的支援和使用,但在 Android 規模上變得緩慢、容易出錯、不可擴展且難以測試。 Soong 建置系統提供了 Android 建置所需的靈活性。

因此,平台開發者預計盡快從Make轉向採用Soong。將問題發送至android-building Google Group 以獲得支援。

宋是什麼?

Android 7.0 (Nougat) 中引進了 Soong 建置系統來取代 Make。它利用Kati GNU Make 克隆工具和Ninja建置系統元件來加速 Android 的建置。

請參閱 Android 開源專案 (AOSP) 中的Android Make 建置系統說明以取得一般說明,並參閱 Android.mk 編寫者的建置系統變更以了解從 Make 適應到 Soong 所需的修改。

請參閱詞彙表中與建置相關的條目以了解關鍵術語的定義,並參閱 Soong 參考文件以了解完整的詳細資訊。

Make和宋比較

以下是 Make 配置與 Soong 在 Soong 配置(藍圖或.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)

宋例子

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值。它的值應該是以空格分隔的名稱空間列表,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 查看根命名空間。