按照设计,Android.bp
文件很简单。它们不包含条件语句或控制流语句;所有复杂性都由 Go 语言编写的构建逻辑处理。在可能的情况下,Android.bp
文件的语法和语义类似于 Bazel BUILD 文件。
模块
Android.bp
文件中的模块以模块类型开头,后跟 name: "value",
格式的一组属性
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
每个模块都必须具有 name
属性,并且该值在所有 Android.bp
文件中都必须是唯一的,但命名空间和预构建模块中的 name
属性值可以重复。
srcs
属性将用于构建模块的源文件指定为字符串列表。您可以使用模块引用语法 ":<module-name>"
引用生成源文件的其他模块(如 genrule
或 filegroup
)的输出。
如需查看有效模块类型及其属性的列表,请参阅 Soong 模块参考。
类型
变量和属性是强类型的,变量根据第一次赋值动态确定类型,属性由模块类型静态设置。支持的类型包括:
- 布尔值(
true
或false
) - 整数 (
int
) - 字符串 (
"string"
) - 字符串列表 (
["string1", "string2"]
) - 映射 (
{key1: "value1", key2: ["value2"]}
)
映射可以包含任何类型的值,包括嵌套映射。列表和映射在最后一个值后可以有尾随逗号。
Glob 模式
接受文件列表的属性(如 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",
}
变量的作用域限定为声明它们的文件以及任何子 Blueprint 文件的其余部分。变量是不可变的,但有一个例外:可以使用 +=
赋值追加变量,但只能在它们被引用之前追加。
注释
Android.bp
文件可以包含 C 风格的多行 /* */
注释和 C++ 风格的单行 //
注释。
运算符
字符串、字符串列表和映射可以使用 + 运算符追加。整数可以使用 +
运算符求和。追加映射会生成两个映射中键的并集,并追加两个映射中都存在的任何键的值。
条件语句
Soong 不支持 Android.bp
文件中的条件语句。相反,构建规则中需要条件语句的复杂性在 Go 中处理,在 Go 中可以使用高级语言功能,并且可以跟踪由条件语句引入的隐式依赖项。大多数条件语句都转换为映射属性,其中选择映射中的一个值并将其追加到顶层属性。
例如,为了支持特定于架构的文件:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
格式化程序
Soong 包括 Blueprint 文件的规范格式化程序,类似于 gofmt。要以递归方式重新格式化当前目录中的所有 Android.bp
文件,请运行:
bpfmt -w .
规范格式包括四个空格缩进、多元素列表的每个元素后的换行符以及列表和映射中的尾随逗号。