概念
Android.bp文件是安卓构建系统(Android Build System)中使用的构建描述文件,它用于定义Android项目中的模块、库、应用等构建规则,该文件使用 Blueprint 语言,是 Soong 构建系统的一部分。
Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。Android.bp文件用类似JSON的简洁声明来描述需要构建的模块。
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。
Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。
Android.bp 文件首先是 Android 系统的一种编译配置文件,是用来代替原来的 Android.mk文件的。在 Android7.0 以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。
在 Android7.0 开始,Google 引入了 ninja 和 kati 来编译,为啥引入ninja因为随着 Android 越来越庞大,module 越来越多,编译时间也越来越久,而使用 ninja 在编译的并发处理上较 make 有很大的提升。Ninja 的配置文件就是Android.bp,Android 系统使用 Blueprint 和 Soong 工具来解析 Android.bp 转换生成 ninja文件。为了兼容老的 mk 配置文件,Android 当初也开发了 Kati 工具来转换 mk 文件生成ninja。
1.1 Ninja
ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将Android.bp文件转换成ninja格文件来编译。
1.2 Android.bp
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。
1.3 Soong
Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件,不过这个转换功能仅限于没有分支、循环等流程控制的Android.mk才有效。
1.4 Blueprint
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用。
1.5 Kati
kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati。
Android.bp的主要作用
模块定义
Android.bp 文件用于定义 Android 项目中的模块,这些模块可以是共享库、可执行文件、静态库等。每个模块都有其自己的属性和规则,用于描述模块的构建过程和依赖关系。
依赖关系
在 Android.bp 文件中,你可以指定一个模块依赖于其他模块,定义了模块之间的依赖关系。这包括依赖于其他库、系统库、源代码文件等。
构建规则
通过 Android.bp 文件,你可以指定模块的构建规则,包括编译选项、链接选项、源文件列表等。这使得开发者可以配置模块的构建过程。
模块属性
对每个模块,你可以定义一系列属性,这些属性包括模块的名称、类型、源文件列表、编译选项、依赖项等。这些属性在构建过程中用于指导构建系统。
插件支持
Android.bp 文件支持插件,这使得开发者可以自定义构建规则,添加额外的构建步骤或其他功能。
模块的可配置性
通过 Android.bp 文件,你可以定义模块的可配置属性,允许构建系统在不同的场景或设备上使用不同的配置。
在整个 Android 构建系统中,Android.bp 文件是非常重要的一部分,它提供了一种灵活且可扩展的方式来定义和配置 Android 项目的构建过程。这样的设计使得 Android 构建系统能够适应不同的硬件、设备和项目需求。
Android.mk 文件转换成 Android.bp
一.在工程源码中:
1.source build/envsetup.sh
2.lunch xxx
3.make androidmk
生成androidmk转换工具,路径为:/out/soong/host/linux-x86/bin/androidmk
二.直接把你要转换的Android.mk 文件放置到此目录下,然后执行命令:
androidmk Android.mk > Android.bp
编译不同类型的模块
1.1、编译成Java库
会把aidl java 等文件编译成 .jar 库
Android.mk
include $(BUILD_JAVA_LIBRARY)
Android.bp
java_library {
......
}
1.2、编译成Java静态库
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
Android.bp
java_library_static {
......
}
1.3、编译成App应用
Android.mk
include $(BUILD_PACKAGE)
Android.bp
android_app {
......
}
1.4、编译成Native动态库
Android.mk
include $(BUILD_SHARED_LIBRARY)
Android.bp
cc_library_shared {
......
}
1.5、编译成Native静态库
Android.mk
include $(BUILD_STATIC_LIBRARY)
Android.bp
cc_library_static {
......
}
1.6、编译成Native执行程序
Android.mk
include $(BUILD_EXECUTABLE)
Android.bp
cc_binary {
......
}
1.7、编译成头文件库
Android.mk
include $(BUILD_HEADER_LIBRARY)
Android.bp
cc_library_headers {
......
}
文件路径
2.1、本地头文件路径
Android.mk
LOCAL_C_INCLUDES :=
Android.bp
local_include_dirs: ["xxx", ...]
2.2、导出的头文件路径
Android.mk
LOCAL_EXPORT_C_INCLUDE_DIRS :=
Android.bp
export_include_dirs: ["xxx", ...]
2.3、资源文件路径
Android.mk
LOCAL_RESOURCE_DIR :=
Android.bp
resource_dirs: ["xxx", ...]
库依赖
3.1、依赖的静态库
Android.mk
LOCAL_STATIC_LIBRARIES :=
Android.bp
static_libs: ["xxx", "xxx", ...]
3.2、依赖的动态库
Android.mk
LOCAL_SHARED_LIBRARIES :=
Android.bp
shared_libs: ["xxx", "xxx", ...]
3.3、依赖的头文件库
Android.mk
LOCAL_HEADER_LIBRARIES :=
Android.bp
header_libs: ["xxx", "xxx", ...]
3.4、依赖的Java库
Android.mk
LOCAL_STATIC_JAVA_LIBRARIES :=
Android.bp
static_libs: ["xxx", "xxx", ...]
安装到不同分区中
4.1、安装到vendor中
Android.mk
LOCAL_VENDOR_MODULE := true
or
LOCAL_PROPRIETARY_MODULE := true
Android.bp
proprietary: true
or
vendor: true
⚠️ 注意:
LOCAL_PROPRIETARY_MODUL,true控制生成路径到vendor/lib,false就是system/lib LOCAL_CLANG,clang:true来指定默认编译器为Clang,Android 8.0后不需要指定,默认是Clang
4.2、安装到product中
Android.mk
LOCAL_PRODUCT_MODULE := true
Android.bp
product_specific: true
4.3、安装到odm中
Android.mk
LOCAL_ODM_MODULE := true
Android.bp
device_specific: true
编译参数
5.1、C flags
Android.mk
LOCAL_CFLAGS :=
Android.bp
cflags: ["xxx", "xxx", ...]
5.2、Cpp flags
Android.mk
LOCAL_CPPFLAGS :=
Android.bp
cppflags: ["xxx", "xxx", ...]
5.3、Java flags
Android.mk
LOCAL_JAVACFLAGS :=
Android.bp
javacflags: ["xxx", "xxx", ...]
语法
Android.bp 文件是 Soong 构建系统中的构建描述文件,用于配置 Android 项目的构建规则。以下是 Android.bp 文件的主要语法要点:
模块类型定义:
使用 module_type 字段指定模块的类型,例如 module_type: “android_library” 或 module_type: “android_app”。
模块名定义:
使用 name 字段指定模块的名称,例如 name: “MyLibrary”。
模块属性:
使用各种字段来定义模块的属性,例如 srcs(源文件列表)、cflags(编译选项)、include_dirs(包含目录)等。
例如:
默认属性集:
使用 defaults 字段引用一个默认属性集,以便继承一组默认的属性。例如:
模块依赖关系:
使用 deps 字段指定模块的依赖关系,即依赖于其他模块。例如:
可选依赖关系:
使用 optional_uses_libs 字段指定可选的依赖关系。例如:
构建配置块:
使用 build 字段定义一个构建配置块,其中可以包含 target、host 或 device 等不同配置。例如:
构建工具配置:
使用 tool 字段配置构建过程中使用的工具。例如:
标记特定模块属性:
使用 tags 字段给模块打标签,以便在其他模块中引用。例如:
架构相关配置:
使用 arch 字段指定特定的架构相关配置。例如:
变量和函数:
可以使用变量和函数来简化配置。例如:
命名空间:
使用 namespace 字段来定义一个命名空间,将一组模块组织在同一个命名空间下。例如:
模块分隔:
使用 group 字段将一组模块组织在同一个分组中,以便对它们应用相同的配置。例如:
源文件通配符:
使用通配符指定源文件,例如 srcs: [“src/**/*.c”],表示匹配 src 目录及其所有子目录下的所有 .c 文件。
条件语句:
使用条件语句来根据不同的条件执行不同的配置。例如:
标签过滤:
使用 required 和 host_required 字段指定模块的标签过滤条件。例如:
模块替代:
使用 overrides 字段指定被当前模块替代的其他模块。例如:
私有模块属性:
使用 private 字段指定私有属性,这些属性只能在同一 Android.bp 文件中的其他属性块中使用。例如:
自动生成的源文件:
使用 generated_sources 字段指定由构建系统自动生成的源文件。例如:
构建工具:
使用 tool 字段指定使用的构建工具及其配置。例如:
这些语法要点提供了 Android.bp 文件中一些常见的配置选项和结构。要了解更多详细信息,可以查阅官方 Soong 构建系统文档,该文档提供了全面的语法和配置选项说明,以及更多实际的示例。