Android.bp 文件详解

Android.bp是Android构建系统Soong的核心配置文件,用于定义模块的构建规则。它替代了传统的Android.mk文件,提供了更简洁、更强大的构建配置方式。

基本结构

1. 包声明

1
2
3
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
  • 定义模块的许可证信息
  • 指定默认的许可证类型

2. 模块定义

1
2
3
4
5
android_app {
name: "ModuleName",
srcs: ["src/**/*.java"],
// 其他配置...
}

主要模块类型

android_app - Android应用程序

1
2
3
4
5
6
7
8
android_app {
name: "MyApp",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
manifest: "AndroidManifest.xml",
certificate: "platform",
platform_apis: true,
}

android_library - Android库

1
2
3
4
5
6
android_library {
name: "MyLibrary",
srcs: ["src/**/*.java"],
static_libs: ["other_library"],
libs: ["shared_library"],
}

java_library - Java库

1
2
3
4
5
java_library {
name: "MyJavaLib",
srcs: ["src/**/*.java"],
libs: ["android"],
}

filegroup - 文件组

1
2
3
4
5
filegroup {
name: "MyFiles",
srcs: ["src/**/*.java"],
visibility: ["//visibility:private"],
}

关键属性详解

1. 源代码配置

  • srcs: 源文件路径,支持通配符
  • exclude_srcs: 排除的源文件
  • resource_dirs: 资源目录
  • manifest: AndroidManifest.xml文件路径

2. 依赖配置

  • static_libs: 静态库依赖
  • libs: 共享库依赖
  • uses_libs: 运行时库依赖
  • optional_uses_libs: 可选的运行时库

3. 编译配置

  • javacflags: Java编译标志
  • kotlincflags: Kotlin编译标志
  • plugins: 编译插件
  • optimize: 优化配置

4. 权限和证书

  • certificate: 签名证书
  • privileged: 特权应用
  • platform_apis: 使用平台API

SystemUI Android.bp 分析

SystemUI的Android.bp文件展示了复杂模块的配置方式:

1. 多模块结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 核心库
android_library {
name: "SystemUI-core",
srcs: ["src/**/*.kt", "src/**/*.java"],
static_libs: ["SystemUI-res", "WindowManager-Shell"],
// ...
}

// 主应用
android_app {
name: "SystemUI",
static_libs: ["SystemUI-core"],
certificate: "platform",
privileged: true,
}

2. 条件编译

1
2
3
4
5
6
product_variables: {
debuggable: {
srcs: [":DebugJavaFiles"],
exclude_srcs: [":ReleaseJavaFiles"],
},
}

3. 测试配置

1
2
3
4
5
android_robolectric_test {
name: "SystemUiRoboTests",
srcs: [":SystemUI-tests-utils"],
static_libs: ["RoboTestLibraries"],
}

高级特性

1. 可见性控制

1
2
3
visibility: ["//visibility:public"],
visibility: ["//visibility:private"],
visibility: ["//visibility:subpackages"],

2. 条件配置

1
2
3
4
5
6
soong_config_module_type {
name: "systemui_optimized_java_defaults",
module_type: "java_defaults",
config_namespace: "ANDROID",
bool_variables: ["SYSTEMUI_OPTIMIZE_JAVA"],
}

3. 文件组管理

1
2
3
4
5
filegroup {
name: "ReleaseJavaFiles",
srcs: ["src-release/**/*.kt"],
visibility: ["//visibility:private"],
}

开发建议

1. 模块化设计

  • 将复杂项目分解为多个模块
  • 使用filegroup管理文件集合
  • 合理配置模块间的依赖关系

2. 条件编译

  • 使用product_variables处理不同构建变体
  • 利用soong_config处理配置选项
  • 合理使用exclude_srcs排除文件

3. 测试集成

  • 配置单元测试和集成测试
  • 使用android_robolectric_test进行测试
  • 合理管理测试依赖

4. 性能优化

  • 使用optimize配置进行代码优化
  • 合理配置static_libs和libs
  • 注意编译标志的影响

Android.bp文件是Android构建系统的核心,理解其语法和配置方式对于Android系统开发至关重要。建议从简单模块开始,逐步掌握复杂配置的使用方法。