根据设计,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
属性,并且相应值在所有 name
文件中必须是唯一的,仅有两个例外情况是命名空间和预构建模块中的 Android.bp
属性值,这两个值可能会重复。
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(在这种语言中,您可以使用高级语言功能,并且可以跟踪条件语句引入的隐式依赖项)中处理。大多数条件语句都会转换为映射属性,其中选择了映射中的某个值并将其附加到顶级属性。
例如,要支持特定于架构的文件,请使用以下命令:
cc_library {
...
srcs: ["generic.cpp"],
arch: {
arm: {
srcs: ["arm.cpp"],
},
x86: {
srcs: ["x86.cpp"],
},
},
}
格式设置工具
Soong 包含一个针对 Blueprint 文件的规范格式设置工具,类似于 gofmt。如需以递归方式重新设置当前目录中所有 Android.bp
文件的格式,请运行以下命令:
bpfmt -w .
规范格式包括缩进四个空格、多元素列表的每个元素后面有换行符,以及列表和映射末尾有英文逗号。