Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

宋建系統

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

因此,平台開發人員應盡快從Make轉換為採用Soong。向構建Android的 Google 網上論壇發送問題以獲取支持。

什麼是宋

Soong構建系統在Android 7.0(牛軋糖)中引入,以取代Make。它利用Kati GNU Make克隆工具和Ninja構建系統組件來加快Android的構建。

有關一般說明 ,請參見Android開放源代碼項目(AOSP)中的Android Make構建系統說明; 有關Android.mk編寫器的“構建系統更改”,以了解從Make到Soong進行修改所需的修改。

有關關鍵術語的定義,請參見詞彙表中與構建相關的條目有關完整的詳細信息,請參見Soong參考文件

Make和Soong比較

這是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文件很簡單。它們不包含條件或控制流語句;所有復雜性都由Go編寫的構建邏輯處理。如果可能, Android.bp文件的語法和語義類似於Bazel BUILD文件

模組

Android.bp文件中的模塊模塊類型開頭,後跟一組name: "value",的屬性name: "value",格式為:

cc_binary {
    name: "gzip",
    srcs: ["src/test/minigzip.c"],
    shared_libs: ["libz"],
    stl: "none",
}

每個模塊都必須具有name屬性,並且該值在所有Android.bp文件中必須唯一,但name空間和預建模塊中的name屬性值可能重複。

srcs屬性將用於構建模塊的源文件指定為字符串列表。可以引用產生源的文件,如其他模塊的輸出genrulefilegroup ,通過使用模塊引用語法":<module-name>"

有關有效模塊類型及其屬性的列表,請參見《 Soong模塊參考》

種類

變量和屬性是強類型化的,變量是基於第一個分配動態地設置的,而屬性是通過模塊類型靜態設置的。支持的類型為:

  • 布爾值( truefalse
  • 整數( int
  • 字符串( "string"
  • 字符串列表( ["string1", "string2"]
  • 映射( {key1: "value1", key2: ["value2"]}

映射可以包含任何類型的值,包括嵌套映射。列表和地圖的最後一個值後面可能帶有逗號。

帶有文件列表的屬性(例如srcs )也可以採用全局模式。 Glob模式可以包含普通的UNIX通配符* ,例如*.java 。球形模式還可以包含單個**通配符作為路徑元素,該通配符與零個或多個路徑元素匹配。例如, java/**/*.javajava/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",
}

變量的作用域是聲明它們的文件的其餘部分以及所有子級Blueprint文件。變量是不變的,只有一個例外:它們可以通過+=賦值附加到變量中,但只能在被引用之前。

註釋

Android.bp文件可以包含C樣式多行/* */和C ++樣式單行//註釋。

經營者

可以使用+運算符附加字符串,字符串列表和映射。整數可以使用+運算符求和。追加映射會在兩個映射中生成鍵的並集,並追加兩個映射中都存在的任何鍵的值。

有條件的

Soong不支持Android.bp文件中的條件Android.bp 。取而代之的是,在Go中處理了需要條件的構建規則中的複雜性,可以在其中使用高級語言功能,並且可以跟踪條件引入的隱式依賴關係。大多數條件將轉換為map屬性,在其中選擇map中的值之一併將其附加到頂級屬性。

例如,要支持特定於體系結構的文件:

cc_library {
    ...
    srcs: ["generic.cpp"],
    arch: {
        arm: {
            srcs: ["arm.cpp"],
        },
        x86: {
            srcs: ["x86.cpp"],
        },
    },
}

格式化程序

Soong包含一個用於blueprint文件的規範格式器,類似於gofmt 。要遞歸地重新格式化當前目錄中的所有Android.bp文件,請運行:

bpfmt -w .

規範格式包括四個空格的縮進,在多元素列表的每個元素之後的新行以及列表和映射中的結尾逗號。

特殊模塊

一些特殊的模塊組具有獨特的特性。

默認模塊

可以使用默認模塊在多個模塊中重複相同的屬性。例如:

34

預建模塊

某些預構建的模塊類型允許模塊與其基於源的模塊使用相同的名稱。例如,可以有cc_prebuilt_binary名為foo時候就已經有一個cc_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"],
}

請注意,名稱空間沒有名稱屬性。它的路徑會自動分配為其名稱。

每個Soong模塊都會根據其在樹中的位置分配一個名稱空間。每個Soong模塊都被視為位於在當前目錄或最接近的祖先目錄的Android.bp文件中的soong_namespace定義的命名空間中。如果未找到此類soong_namespace模塊,則該模塊被視為位於隱式根名稱空間中。

這是一個示例:Soong嘗試解析由模塊M聲明的命名空間N中的模塊D聲明的依賴項D導入命名空間I1,I2,I3…

  1. 然後,如果D是//namespace:module形式的完全限定名稱,則僅在指定的名稱空間中搜索指定的模塊名稱。
  2. 否則,Soong首先查找在名稱空間N中聲明的名為D的模塊。
  3. 如果該模塊不存在,Soong將在名稱空間I1,I2,I3中尋找名為D的模塊。
  4. 最後,宋在根名稱空間中查找。