1. 文件定位
- 用途:Android 构建系统(Soong)的核心配置文件,替代传统
Android.mk
- 语法基础:类似 JSON 的声明式语法,无流程控制语句(如
if-else
) - 设计目标:提升大型项目的构建效率和模块化管理能力
2. 核心语法结构
module_type { # 模块类型标识
name: "module_name", # 唯一模块名(强制)
srcs: ["file1.cpp", ...], # 源文件列表
deps: ["dep_module1", ...], # 依赖模块列表
// 其他属性...
}
3. 常见模块类型
模块类型 | 用途 | 关键属性 |
---|---|---|
cc_binary |
C/C++ 可执行文件 | cflags , ldflags |
cc_library |
C/C++ 库(动态/静态) | shared_libs , static_libs |
java_library |
Java 库 | libs , sdk_version |
android_app |
APK 应用 | certificate , privileged |
android_test |
Android 测试模块 | test_suites , test_config |
prebuilt_etc |
预置配置文件 | src , sub_dir |
4. 核心属性详解
属性 | 描述 | 示例 |
---|---|---|
name |
唯一模块标识(必填) | name: "libaudio_utils" |
srcs |
源文件列表(支持通配符) | srcs: ["src/*.cpp"] |
deps |
跨语言通用依赖 | deps: ["liblog"] |
shared_libs |
动态链接库依赖 | shared_libs: ["libutils"] |
static_libs |
静态链接库依赖 | static_libs: ["libbase"] |
cflags |
C/C++ 编译选项 | cflags: ["-Wall", "-O2"] |
sdk_version |
指定 Android SDK 版本 | sdk_version: "current" |
vendor |
标记为 Vendor 分区模块 | vendor: true |
product_specific |
标记为 Product 分区模块 | product_specific: true |
5. 完整示例解析
cc_library {
name: "libexample",
srcs: [
"example.cpp",
"helper.cpp"
],
cflags: ["-Wall"], # 编译告警
shared_libs: ["liblog"], # 动态依赖
static_libs: ["libutils"], # 静态依赖
vendor: true, # 输出到 /vendor
}
- 输出文件:
/vendor/lib[64]/libexample.so
- 依赖关系:链接
liblog.so
(动态) +libutils.a
(静态)
6. 高级功能
条件编译 - 按平台差异化配置
cc_binary { name: "my_binary", srcs: ["main.cpp"], target: { android_arm: { cflags: ["-DARM_OPT"] }, android_x86: { cflags: ["-DX86_AVX"] } } }
变量复用 - 减少重复配置
common_flags = ["-Wall", "-Werror"] cc_binary { name: "app1", cflags: common_flags, }
模块继承 - 共享基础配置
cc_defaults { name: "base_config", cflags: ["-O3"], shared_libs: ["libbase"], } cc_library { name: "liboptimized", defaults: ["base_config"], # 继承配置 srcs: ["optimized.cpp"], }
7. 工作总结
- 命名唯一性:全局确保
name
不冲突 - 路径处理:优先用
glob(["**/*.cpp"])
替代硬编码路径 - 依赖管理:
- 动态库 →
shared_libs
- 静态库 →
static_libs
- 跨语言 →
deps
- 动态库 →
- 分区控制:
- 系统核心 → 默认路径
- Vendor 模块 →
vendor: true
- Product 模块 →
product_specific: true
- 构建优化:
- 避免在 Android.bp 中添加复杂逻辑
- 用
cc_defaults
实现配置复用