Soong 建構系統

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

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

什麼是 Soong?

Soong 建構系統是在 Android 7.0 (Nougat) 中導入,用於取代 Make。 這個解決方案會利用 凱蒂 GNU 建立複製工具和 Ninja 建構系統 加快 Android 建構速度

詳情請參閱 Android Make Build 系統 Android 開放原始碼計畫 (AOSP) 中的一般說明 操作說明適用於 Android.mk 寫入者的建構系統變更

請參閱建構相關項目的 詞彙解釋 完整詳細資料的 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_prebuilt_binary 已有同名的 cc_binary,名稱為 foo。這讓 開發人員可自由選擇要納入最終版本 產品。如果建構設定包含兩個版本,系統會加上 prefer 旗標 值會決定哪個版本的優先順序。 請注意,部分預先建構模組的名稱開頭不是 prebuilt。 例如 android_app_import

命名空間模組

從 Android 完全轉換為 Soong 之前,請傳送「Make」產品設定 必須指定 PRODUCT_SOONG_NAMESPACES 值。結果 值應為以空格分隔的清單,當中列有 Soong 要匯出的命名空間 要由 m 指令建構等到 Android 使用者轉換成 Soong 之後 啟用命名空間的詳細資料可能會改變

Soong 可讓不同目錄中的模組指定 同一個名稱,只要每個模組是在不同的命名空間中宣告即可。A 罩杯 命名空間的宣告方式如下:

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

請注意,命名空間沒有名稱屬性;因此路徑會自動變更 。

每個 Soong 模組會根據其在樹狀結構中的位置指派一個命名空間。 每個 Soong 模組都視為位於 在目前目錄中的 Android.bp 檔案中找到 soong_namespace,或 最接近祖系目錄如果找不到此 soong_namespace 模組, 系統會將模組視為隱含的根命名空間。

範例如下:Soong 嘗試解析模組 M 宣告的依附元件 D 匯入命名空間 N 中的 I1、I2、I3...

  1. 如果 D 是 //namespace:module 形式的完整名稱, 系統就會搜尋指定的模組名稱。
  2. 否則,Soong 會先尋找在命名空間中宣告的 D 模組 北
  3. 如果該模組不存在,Soong 會在該模組中尋找名為 D 的模組 命名空間 I1、I2、I3...
  4. 最後,Soong 會在根命名空間中尋找。