概述
Android.bp说明
Android.bp 文件是 Android 系统中使用的构建文件,用于描述 Android 项目的模块、依赖关系、编译选项等信息。Android.bp 文件是 Soong 构建系统的一部分,而不同于传统的 makefile 格式。
Soong 构建系统是 Android 在构建过程中使用的现代构建系统,用于替代之前的 make 构建系统。Soong 构建系统更加灵活、可扩展,并提供更高效的构建速度。Android.bp 文件是 Soong 构建系统使用的一种配置文件。
官方文档
基本类型
模块定义
Android.bp文件结构是以模块为基本单位的,一个模块通常包含以下部分:
- 模块类型:如cc_binary、cc_library、filegroup、java_library等;
- 模块名称:通过name字段定义,是模块的唯一标识符;
- 模块属性:这些属性可以控制模块的构建行为,如src属性指定源代码文件。
| 常用模块类型 | 说明 |
|---|---|
| cc_binary | |
| cc_defaults | |
| cc_library | |
| cc_library_headers | |
| cc_library_shared | |
| cc_library_static | |
| filegroup | filegroup 通常用于组织一些文件,以便在其他模块中引用。 |
| java_defaults | 在项目中定义一组默认属性,然后在多个 java_library 模块中引用这些默认值,而不必在每个模块中重复相同的配置。 |
| java_library | 构建Java库,生成jar文件 |
| license | 指定代码的许可证信息。这个属性通常用于声明代码的开源许可证,以确保代码的合法使用。 |
| 常用模块属性 | 说明 |
|---|---|
| cflags cppflags | 分别用于指定 C 和 C++ 编译器的编译标志。 cflags: [“-Wall”], cppflags: [“-std=c++11”], |
| include_dirs | 指定头文件的搜索路径。 include_dirs: [“include”] |
| resource_dirs | 指定资源目录的路径,用于包含项目的资源文件。 如:resource_dirs: [“res”], |
| srcs | 指定源代码文件的路径 如:srcs: [“src/*/.java”] |
| shared_libs | 列出该模块依赖的其他共享库。 如:shared_libs: [“libcommon”] |
| static_libs | 列出该模块依赖的其它静态库。 如:static_libs: [“libcommon”] |
注释
Android.bp 文件可以包含 C 样式的多行 /* */ 注释以及 C++ 样式的单行 // 注释。
Glob 模式
使用路径时(例如 srcs属性)可以采用 glob 模式。
- 使用*匹配文件名,例如 *.java。
- 使用**匹配零个或多个路径。例如,java/**/*.java 同时匹配 java/Main.java 和 java/com/android/Main.java 。
其它
filegroup
filegroup 通常用于组织一些文件,以便在其他模块中引用。例如,一个 cc_library 模块可能依赖于一个 filegroup,以包含一些额外的源文件。
示例1:展示了如何在 cc_library 中引用 filegroup
filegroup {
name: "myfiles",
srcs: ["file1.txt", "file2.txt"],
}
cc_library {
name: "mymodule",
srcs: ["main.c"],
filegroup: "myfiles",
}
以上示例中,mymodule 使用了 filegroup 中定义的文件,使得这些文件成为 mymodule 的一部分。这种方式有助于更清晰地组织和管理项目中的文件。
示例2:在一个filegroup中引用另一个filegroup
filegroup {
name: "myfiles",
srcs: ["file1.txt", "file2.txt", ":otherfilegroup"],
}
说明:
- name 属性定义了该文件组的名称。
- srcs 属性定义了该文件组包含的文件列表。这可以是具体的文件路径或其他文件组的引用。
- :otherfilegroup 表示引用了另一个名为 otherfilegroup 的文件组。
java_library
java_library用于将源代码构建到.jar文件中。默认情况下,java_library只有一个变量,它生成一个包含根据设备引导类路径编译的.class文件的.jar包。生成的jar不适合直接安装在设备上,通过会用作另一个模块的static_libs依赖项。
| 属性 | 说明 |
|---|---|
| host_supported | host_supported:true将产生两个变量,一个根据device的bootclasspath编译,另一个根据host的bootclasspath编译。 |
| installable | installable:true将生成一个包含classes.dex文件的.jar文件,适合在设备上安装。 |
| static_libs | 该模块依赖的其它静态库 |
| apex_available | |
| stem | |
| sdk_version | |
| visibility |
示例:来自frameworks/base/Android.bp
java_library {
name: "framework-minus-apex",
defaults: ["framework-minus-apex-defaults"],
installable: true,
// For backwards compatibility.
stem: "framework",
apex_available: ["//apex_available:platform"],
visibility: [
"//frameworks/base",
// TODO(b/147128803) remove the below lines
"//frameworks/base/apex/blobstore/framework",
"//frameworks/base/apex/jobscheduler/framework",
"//frameworks/base/packages/Tethering/tests/unit",
"//packages/modules/Connectivity/Tethering/tests/unit",
],
lint: {
extra_check_modules: ["AndroidFrameworkLintChecker"],
},
errorprone: {
javacflags: [
"-Xep:AndroidFrameworkBinderIdentity:ERROR",
"-Xep:AndroidFrameworkCompatChange:ERROR",
"-Xep:AndroidFrameworkUid:ERROR",
],
},
}
java_library {
name: "framework-all",
installable: false,
static_libs: [
"all-framework-module-impl",
"framework-minus-apex",
],
apex_available: ["//apex_available:platform"],
sdk_version: "core_platform",
visibility: [
// DO NOT ADD ANY MORE ENTRIES TO THIS LIST
"//external/robolectric-shadows:__subpackages__",
"//frameworks/layoutlib:__subpackages__",
],
}
xx_defaults
soong提供了一系列xx_defaults模块类型,例如:cc_defaults, java_defaults, doc_defaults, stubs_defaults等等。
xx_defaults的模块提供了一组可由其它模块继承的属性,避免在每个模块中重复相同的配置。其它模块可以通过defaults:[”<:default_module_name>”]来继承xx_defaults类型模块中定义的属性。
示例:在cc_binary模块中使用名为”gzip_defaults”的配置
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}