Android.bp 文件格式

按照设计,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>" 引用生成源文件的其他模块(如 genrulefilegroup)的输出。

如需查看有效模块类型及其属性的列表,请参阅 Soong 模块参考

类型

变量和属性是强类型的,变量根据第一次赋值动态确定类型,属性由模块类型静态设置。支持的类型包括:

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

映射可以包含任何类型的值,包括嵌套映射。列表和映射在最后一个值后可以有尾随逗号。

Glob 模式

接受文件列表的属性(如 srcs)也可以接受 glob 模式。Glob 模式可以包含正常的 UNIX 通配符 *,例如 *.java。Glob 模式还可以包含单个 ** 通配符作为路径元素,该通配符匹配零个或多个路径元素。例如,java/**/*.java 同时匹配 java/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 文件中的条件语句。相反,构建规则中需要条件语句的复杂性在 Go 中处理,在 Go 中可以使用高级语言功能,并且可以跟踪由条件语句引入的隐式依赖项。大多数条件语句都转换为映射属性,其中选择映射中的一个值并将其追加到顶层属性。

例如,为了支持特定于架构的文件:

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

格式化程序

Soong 包括 Blueprint 文件的规范格式化程序,类似于 gofmt。要以递归方式重新格式化当前目录中的所有 Android.bp 文件,请运行:

bpfmt -w .

规范格式包括四个空格缩进、多元素列表的每个元素后的换行符以及列表和映射中的尾随逗号。