mtk android.mk --> android.bp
例如\frameworks\base\media\jni 由7.0的android.mk转换成android.bp .
首先从Soong说起,Soong是Android中对基于GNU make的编译系统的替代物,编译文件“Android.mk”被替换为“Android.bp”。bp文件的目的就是一切从简,格式类似于JSON,像mk文件的条件控制语句等这些复杂的东西都由Go来处理,bp文件是由Go语言来解析的,为“blueprint”框架,随后转为Ninja文件,这大概就是Google的Go兴起后转而使用Go来重构自己的编译系统。bp文件的语法、语义同Bazel,如下网址是Bazel的参考文档:
https://bazel.build/versions/master/docs/be/overview.html
Bazel是Google开源的自动化构建工具,意在替换复杂、臃肿的Makefile,这里不做详细介绍。下面介绍bp文件的常用规则。
1、模块
定义一个模块从模块的类型开始,模块有不同的类型,如下例子中的“cc_binary”,模块包含一些属性,格式为“property-name: property-value”,其中name属性必须指定,其属性值必须是全局唯一的。
cc_binary {
name: "gzip",
srcs: ["src/test/minigzip.c"],
shared_libs: ["libz"],
stl: "none",
}
默认模块“cc_defaults”的用法如下(效果同上面的例子):
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
2、变量
变量赋值使用“=”或“+=”,有其作用域,例子如下。
gzip_srcs = ["src/test/minigzip.c"],
cc_binary {
name: "gzip",
srcs: gzip_srcs,
shared_libs: ["libz"],
stl: "none",
}
3、注释
注释包括单行注释和多行注释,例子如下。
// single-line comment
/*
* multi-line comment
*/
4、类型
变量和属性都有类型,变量的类型在其第一次赋值时而定,属性的类型由其模块类型而定,具体支持以下几种类型。
true
或false
String类型:"string"
字符串列表类型:["string1", "string2"]
Map类型:{key1: "value1", key2: "value2"}
5、操作符
String类型、字符串列表类型和Map类型支持操作符“+”。
6、格式控制工具
bpfmt是一个bp文件的格式控制工具,包括4个空格的缩进、列表有多个元素时每个元素一行、列表和map的最后一个元素多一个冗余的逗号等等,如下例子用于递归格式化当前目录下的所有bp文件
bpfmt -w .
7、从Android.mk到Android.bp
androidmk Android.mk > Android.bp
androidmk工具可以把mk文件转换为bp文件,但一些发杂的用法和自定义的规则需要手动转换。