Soong 建構系統

在 Android 7.0 版本之前,Android 使用的是 GNU 品牌 專門描述並執行建構規則Make 建構系統是 儘管 Android 規模越來越慢、容易出錯 且難以測試Song 建構系統可提供 Android 版本所需的彈性。

因此,平台開發人員應盡快從 Make 切換並採用 Soong。請將問題傳送至 Android 建構 尋求支援的 Google 網路論壇群組。

什麼是 Soong?

Soong 建構系統在 Android 7.0 (Nougat) 中推出,用來取代 Make。這項工具會利用 Kati GNU Make 複本工具和 Ninja 建構系統元件,加快 Android 的建構作業。

如需一般操作說明,請參閱 Android 開放原始碼計畫 (AOSP) 中的 Android Make 建構系統說明,以及 Android.mk 編寫者適用的建構系統變更,瞭解從 Make 改用 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 完全轉換為 Soong 之前,請傳送「Make」產品設定 必須指定 PRODUCT_SOONG_NAMESPACES 值。結果 值應為以空格分隔的清單,當中列有 Soong 要匯出的命名空間 要由 m 指令建構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 會在該模組中尋找名為 D 的模組 命名空間 I1、I2、I3...
  4. 最後,Soong 會在根命名空間中尋找。