Android.bp
是 Android 构建系统的一部分,主要用于描述模块和它们之间的依赖关系。它使用一种名为 Blueprint 的 DSL(领域特定语言)来定义模块的属性和行为,取代了之前的 Android.mk
文件。
Android.bp
文件的基本结构包括:
cc_library
、java_library
等。以下是一些常见的模块类型及其用途:
cc_library
:用于 C/C++ 语言的库。java_library
:用于 Java 的库。android_app
:用于 Android 应用程序。android_library
:用于 Android 库。prebuilt_
:用于引入已构建的二进制文件。以下是一个简单的 C++ 库模块的定义:
cc_library {
name: "mylib",
srcs: [
"src/mylib.cpp",
],
shared_libs: [
"libc",
"libm",
],
include_dirs: [
"include",
],
}
name
:模块的名称。srcs
:源文件列表。shared_libs
:所依赖的共享库。include_dirs
:头文件目录。下面是一个简单的 Java 库的定义:
java_library {
name: "myjavapackage",
srcs: [
"src/MyClass.java",
],
deps: [
":mylib", // 依赖之前定义的 C++ 库
],
}
deps
:该库所依赖的其他模块。在 Android.bp
文件中,可以通过不同的方式声明模块之间的依赖关系:
deps
或 shared_libs
声明直接依赖的模块。在你定义好 Android.bp
文件后,可以使用以下命令来构建你的项目:
m build myapp
比如/frameworks/base/core/java/Android.bp 这个Android.bp文件
java_library {
167 name: "modules-utils-locallog",
168 srcs: ["android/util/LocalLog.java"],
169 libs: ["unsupportedappusage"],
170 sdk_version: "module_current",
171 min_sdk_version: "30",
172 apex_available: [
173 "//apex_available:anyapex",
174 "//apex_available:platform",
175 ],
176 visibility: ["//visibility:public"],
177 }
java_library {
name: "modules-utils-locallog", // 模块的名称
srcs: ["android/util/LocalLog.java"], // 源文件路径
libs: ["unsupportedappusage"], // 依赖的库
sdk_version: "module_current", // SDK 版本
min_sdk_version: "30", // 最小 SDK 版本
apex_available: [ // 可用的 APEX 模块
"//apex_available:anyapex",
"//apex_available:platform",
],
visibility: ["//visibility:public"], // 可见性
}
各个属性的解释
name:
- 定义了库的名称,其他模块可以通过这个名称引用这个库。
- 在这个例子中,名称为
"modules-utils-locallog"
。srcs:
- 指定库的源文件,这里仅有一个源文件
LocalLog.java
。- 源文件路径是相对于构建文件位置的。
libs:
- 列出此库所依赖的其他库。在这个例子中,依赖于
unsupportedappusage
库。- 这些库在编译时会被链接到这个 Java 库中。
sdk_version:
- 指定编译时使用的 SDK 版本,这里使用
module_current
表示当前模块的 SDK 版本。- 这个设置可以确保与当前 Android SDK 的兼容性。
min_sdk_version:
- 指定支持的最低 Android SDK 版本,这里设置为
30
,表示这个库只能在 API 级别 30 或更高的设备上运行。apex_available:
- 指定这个库可用的 APEX 模块,APEX 是 Android 的一部分,用于模块化和版本控制。
- 这个字段包含两个可用的 APEX 模块:
anyapex
和platform
。visibility:
- 设置模块的可见性,这里设置为
//visibility:public
,意味着这个库对所有模块都是可见的。- 如果需要限制可见性,可以使用其他设置,比如只允许特定的模块访问。
在其他模块中引用
modules-utils-locallog
库的示例:plaintextCopy Code
java_library {
name: "myapp-library",
srcs: ["src/MyApp.java"],
deps: [
":modules-utils-locallog", // 引用本地库
],
}