在Android 7.0發布之前,Android的使用GNU製作專門來描述和執行其生成規則。 Make 構建系統得到了廣泛的支持和使用,但在 Android 的規模上變得緩慢、容易出錯、不可擴展且難以測試。該宋楚瑜構建系統提供針對Android建立所需的靈活性。
出於這個原因,平台開發者應該盡快從 Make 切換到採用 Soong。發送問題到Android平台的建立谷歌集團獲得支持。
什麼是宋?
該宋楚瑜構建系統中的Android 7.0(牛軋糖)的推出,取代製作。它利用卡蒂GNU製作克隆工具和忍者構建系統組件,加快構建Android系統。
看到Android的製作構建系統在Android開源項目(AOSP)描述的一般說明和建立Android.mk作家制度變遷,了解從製作適應宋楚瑜必要的修改。
請參閱構建相關條目詞彙表中的關鍵術語和定義宋參考文件的完整細節。
製作和宋比較
下面是對配置的與宋實現相同的宋配置(藍圖或比較.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,
},
},
}
見簡單的構建配置測試特定宋楚瑜配置實例。
Android.bp 文件格式
按照設計, Android.bp
文件是簡單的。它們不包含條件或控制流語句;所有復雜性都由用 Go 編寫的構建邏輯處理。如果可能的話,語法和語義Android.bp
文件類似於巴澤勒構建文件。
模塊
在A模塊Android.bp
與文件開始模塊類型,隨後通過一組在屬性name: "value",
格式:
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
每個模塊都必須有一個name
屬性,並將其值必須在所有獨特Android.bp
文件,除了name
的命名空間和預製的模塊屬性值,這可能重複。
在srcs
屬性指定用於構建模塊的源文件,作為一個字符串列表。可以引用產生源的文件,如其他模塊的輸出genrule
或filegroup
,通過使用模塊引用語法":<module-name>"
對於有效的模塊類型及其屬性的列表,請參閱宋楚瑜模塊參考。
類型
變量和屬性是強類型的,變量基於第一次賦值動態,屬性由模塊類型靜態設置。支持的類型有:
- 布爾(
true
或false
) - 整數(
int
) - 字符串(
"string"
) - 字符串的列表(
["string1", "string2"]
) - 地圖(
{key1: "value1", key2: ["value2"]}
映射可以包含任何類型的值,包括嵌套映射。列表和地圖的最後一個值後可能有尾隨逗號。
球體
稱取文件列表的屬性,如srcs
,也可以採取glob模式。 glob模式可以包含常規的UNIX通配符*
,如*.java
。 glob模式也可以包含單個**
通配符作為路徑元件,其匹配零個或多個路徑元素。例如, java/**/*.java
兩個匹配java/Main.java
和java/com/android/Main.java
模式。
變量
一個Android.bp
文件可能包含頂級變量賦值:
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
變量的作用域是聲明它們的文件的其餘部分,以及任何子藍圖文件。變量是不可變的只有一個例外:它們可以附加到一個+=
分配,但一直只引用才。
註釋
Android.bp
文件可以包含C風格的多/* */
和C ++風格的單行//
註釋。
運營商
可以使用 + 運算符附加字符串、字符串列表和映射。整數可以使用來概括+
運營商。附加映射產生兩個映射中鍵的聯合,附加存在於兩個映射中的任何鍵的值。
條件句
宋楚瑜不支持條件句Android.bp
文件。相反,需要條件的構建規則的複雜性在 Go 中處理,其中可以使用高級語言功能,並且可以跟踪條件引入的隱式依賴關係。大多數條件轉換為地圖屬性,其中選擇地圖中的值之一併將其附加到頂級屬性。
例如,要支持特定於體系結構的文件:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
格式化程序
宋楚瑜包括藍圖的文件,類似於規範格式gofmt 。遞歸格式化所有Android.bp
在當前目錄下,運行文件:
bpfmt -w .
規範格式包括四個空格的縮進、多元素列表的每個元素後的新行以及列表和映射中的尾隨逗號。
特殊模塊
一些特殊的模塊組具有獨特的特性。
默認模塊
默認模塊可用於在多個模塊中重複相同的屬性。例如:
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
名為foo
時候就已經有一個cc_binary
具有相同的名稱。這使開發人員可以靈活地選擇要包含在其最終產品中的版本。如果構建配置包含兩個版本中, prefer
在預製的模塊定義規定了哪些版本具有優先權標誌值。需要注意的是一些預建模塊具有名稱不以啟動prebuilt
,如android_app_import
。
命名空間模塊
直到從Android的作出完全轉換為宋楚瑜,則使產品配置必須指定一個PRODUCT_SOONG_NAMESPACES
值。其值應為命名空間的空格分隔的列表宋楚瑜出口做出由建m
命令。 Android 向 Soong 的轉換完成後,啟用命名空間的細節可能會發生變化。
Soong 提供了為不同目錄中的模塊指定相同名稱的能力,只要每個模塊在單獨的命名空間中聲明即可。命名空間可以這樣聲明:
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
請注意,命名空間沒有 name 屬性;它的路徑被自動指定為其名稱。
每個 Soong 模塊都根據其在樹中的位置分配了一個命名空間。每個宋模塊被認為是在由定義的命名空間soong_namespace
在發現Android.bp
在當前目錄或最近的祖先目錄文件。如果沒有這樣的soong_namespace
發現模塊,所述模塊被認為是在隱式根名稱空間。
下面是一個例子:Soong 試圖解析導入命名空間 I1、I2、I3 的命名空間 N 中的模塊 M 聲明的依賴項 D……
- 然後,如果d的形式是一個完全合格的名稱
//namespace:module
,只有指定的命名空間中搜索指定的模塊名稱。 - 否則,Soong 首先查找在命名空間 N 中聲明的名為 D 的模塊。
- 如果該模塊不存在,Soong 會在命名空間 I1、I2、I3 中查找名為 D 的模塊……
- 最後,Soong 在根命名空間中查找。