Android.bp 语法编程指南
一、Android.bp 简介
Android.bp 是 Android 构建系统(Soong)使用的构建描述文件,用于替代传统的 Android.mk 文件。它使用 Blueprint 语言,是一种简单的声明式语言。
二、基本语法规则
1. 注释
go
// 单行注释
/*
多行注释
这是第二行
*/
2. 模块定义
每个模块以 模块类型 { 开始,} 结束:
go
模块类型 {
属性1: "值1",
属性2: ["值2", "值3"],
属性3: 值4,
}
3. 变量定义
go
// 字符串变量
变量名 := "值"
// 数组变量
列表变量 := ["item1", "item2"]
// 布尔变量
布尔变量 := true
三、常用模块类型
1. cc_binary - C/C++ 可执行文件
go
cc_binary {
name: "my_executable",
srcs: ["main.cpp", "utils.cpp"],
shared_libs: ["liblog", "libutils"],
static_libs: ["libmystatic"],
cflags: ["-Wall", "-O2"],
}
2. cc_library - C/C++ 库
go
// 静态库
cc_library_static {
name: "mystaticlib",
srcs: ["lib.cpp"],
export_include_dirs: ["include"],
}
// 动态库
cc_library_shared {
name: "mysharedlib",
srcs: ["shared.cpp"],
shared_libs: ["liblog"],
}
3. java_library - Java 库
go
java_library {
name: "mylib",
srcs: ["src/**/*.java"],
static_libs: ["otherlib"],
sdk_version: "current",
}
4. android_app - Android 应用
go
android_app {
name: "MyApp",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
manifest: "AndroidManifest.xml",
static_libs: ["support-v4"],
certificate: "platform", // 或具体证书名
}
5. android_test - 测试模块
go
android_test {
name: "MyAppTest",
srcs: ["test/**/*.java"],
instrumentation_for: "MyApp",
}
四、完整实例
示例 1:简单的 C++ 程序
go
// Android.bp 文件
// 编译标志
common_flags := [
"-Wall",
"-Werror",
"-O2",
]
// 静态库
cc_library_static {
name: "mylib",
srcs: [
"src/utils.cpp",
"src/calculator.cpp",
],
cflags: common_flags,
export_include_dirs: ["include"],
local_include_dirs: ["src"],
}
// 可执行文件
cc_binary {
name: "myapp",
srcs: ["src/main.cpp"],
static_libs: ["mylib"],
shared_libs: ["liblog"],
cflags: common_flags,
}
示例 2:Android 应用
go
// 应用模块
android_app {
name: "MyCalculator",
// Java 源文件
srcs: [
"app/src/main/java/com/example/calculator/*.java",
"app/src/main/java/com/example/calculator/utils/*.java",
],
// 资源文件
resource_dirs: ["app/src/main/res"],
// 清单文件
manifest: "app/src/main/AndroidManifest.xml",
// 依赖库
static_libs: [
"android-support-v4",
"android-support-v7-appcompat",
],
// 平台签名
certificate: "platform",
// 权限
privileged: true,
// 优化选项
optimize: {
enabled: true,
proguard_flags_files: ["proguard.flags"],
},
}
// 单元测试
android_test {
name: "MyCalculatorTests",
srcs: ["app/src/test/**/*.java"],
instrumentation_for: "MyCalculator",
}
示例 3:复杂的多模块项目
go
// 全局变量
gen_src_dir := "generated/"
common_cflags := [
"-DDEBUG=1",
"-DANDROID",
]
// 生成文件规则
genrule {
name: "generate_header",
tools: ["code_generator"],
cmd: "$(location code_generator) --output $(genDir)/config.h",
srcs: ["config.txt"],
out: ["config.h"],
}
// 库模块
cc_library {
name: "core_lib",
srcs: [
"core/*.cpp",
":generate_header", // 依赖生成的文件
],
generated_headers: ["config_header"],
cflags: common_cflags,
export_include_dirs: ["include"],
}
// 另一个库
cc_library {
name: "network_lib",
srcs: ["network/*.cpp"],
shared_libs: [
"libcore",
"libnetd",
],
}
// 最终的可执行文件
cc_binary {
name: "server",
srcs: ["main/server_main.cpp"],
static_libs: ["core_lib"],
shared_libs: [
"network_lib",
"liblog",
"libcutils",
],
cflags: common_cflags,
}
五、常用属性和函数
1. 文件操作
go
// 文件列表
srcs: [
"file1.cpp",
"subdir/file2.cpp",
"*.cpp", // 通配符
"**/*.cpp", // 递归通配符
],
// 排除文件
exclude_srcs: ["bad_file.cpp"],
2. 条件编译
go
target: {
android: {
cflags: ["-DANDROID"],
shared_libs: ["libandroid"],
},
host: {
cflags: ["-DHOST"],
},
}
3. 版本控制
go
// 版本名称
version_name: "1.0.0",
// 版本代码
version_code: 100,
六、高级特性
1. 默认配置
go
// defaults 模块(在单独文件中,如 build/soong/defaults.bp)
my_defaults {
name: "my_defaults",
cflags: ["-O3"],
shared_libs: ["libbase"],
}
// 使用 defaults
cc_binary {
name: "mybinary",
defaults: ["my_defaults"],
srcs: ["main.cpp"],
}
2. 预构建模块
go
prebuilt_etc {
name: "my_config",
src: "config/my_config.txt",
filename: "my_config.txt",
sub_dir: "myapp",
}
七、调试技巧
- 查看依赖 :
m <module_name> - 构建单个模块 :
make <module_name> - 查看构建命令 :添加
-n参数
八、最佳实践
- 保持简洁:每个模块只做一件事
- 使用变量:复用公共配置
- 合理分组:相关文件放在一起
- 注释清晰:说明模块用途
- 版本控制:维护构建配置的版本
学习资源
- 官方文档 :
build/soong/README.md - 示例代码:AOSP 源码中的各种 Android.bp 文件
- 命令行工具 :
bpmodify(修改 .bp 文件)
这个指南涵盖了 Android.bp 的主要语法和用法。实际开发中,建议多参考 AOSP 源码中的现有 Android.bp 文件来学习更多高级用法。