使用 BOM 对齐版本
BOM (Bill of Materials) 是一种特殊的依赖,用于集中管理一组相关库的版本,确保版本兼容性。
BOM 概念
什么是 BOM
BOM 是一个特殊的 Maven 工件,定义了一组库的推荐版本。
作用:
- 统一相关库版本
- 确保版本兼容
- 简化依赖声明
BOM vs Version Catalog
| 特性 | BOM | Version Catalog |
|---|---|---|
| 范围 | 库版本 | 库+插件版本 |
| 发布 | Maven 仓库 | 项目本地 |
| 共享 | 跨项目 | 单项目 |
| 适用场景 | 第三方库 | 项目内部 |
使用 BOM
基本语法
kotlin
dependencies {
// 导入 BOM
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
// 无需指定版本
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.material3:material3")
}platform 函数:
- 导入 BOM 定义
- 不添加任何依赖
- 仅提供版本约束
enforcedPlatform
kotlin
dependencies {
// 强制使用 BOM 版本
implementation(enforcedPlatform("androidx.compose:compose-bom:2024.12.01"))
implementation("androidx.compose.ui:ui")
}区别:
platform:推荐版本,可被覆盖enforcedPlatform:强制版本,不可覆盖
Android 常用 BOM
Compose BOM
kotlin
dependencies {
val composeBom = platform("androidx.compose:compose-bom:2024.12.01")
implementation(composeBom)
androidTestImplementation(composeBom)
// Compose UI
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
// Testing
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
}优势:
- 所有 Compose 库版本一致
- 自动兼容
- 无需手动管理
Firebase BOM
kotlin
dependencies {
implementation(platform("com.google.firebase:firebase-bom:32.7.0"))
// 无需指定版本
implementation("com.google.firebase:firebase-analytics")
implementation("com.google.firebase:firebase-firestore")
implementation("com.google.firebase:firebase-auth")
}Kotlin BOM
kotlin
dependencies {
implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.9.22"))
implementation("org.jetbrains.kotlin:kotlin-stdlib")
implementation("org.jetbrains.kotlin:kotlin-reflect")
}OkHttp BOM
kotlin
dependencies {
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.12.0"))
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")
}覆盖 BOM 版本
显式指定版本
kotlin
dependencies {
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
// 使用 BOM 版本
implementation("androidx.compose.ui:ui")
// 覆盖 BOM 版本
implementation("androidx.compose.material3:material3:1.2.0")
}注意:可能导致版本不兼容
使用 strictly
kotlin
dependencies {
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
implementation("androidx.compose.ui:ui") {
version {
strictly("1.6.0")
}
}
}创建自定义 BOM
Java Platform 插件
kotlin
// platform/build.gradle.kts
plugins {
`java-platform`
}
dependencies {
constraints {
api("androidx.core:core-ktx:1.15.0")
api("androidx.appcompat:appcompat:1.7.0")
api("com.squareup.retrofit2:retrofit:2.11.0")
api("com.squareup.okhttp3:okhttp:4.12.0")
}
}使用自定义 BOM
kotlin
dependencies {
implementation(platform(project(":platform")))
implementation("androidx.core:core-ktx")
implementation("com.squareup.retrofit2:retrofit")
}发布 BOM
kotlin
// platform/build.gradle.kts
plugins {
`java-platform`
`maven-publish`
}
publishing {
publications {
create<MavenPublication>("maven") {
from(components["javaPlatform"])
groupId = "com.example"
artifactId = "platform"
version = "1.0.0"
}
}
}BOM 最佳实践
全局共享 BOM 定义
在 Version Catalog 中定义:
toml
# gradle/libs.versions.toml
[versions]
compose-bom = "2024.12.01"
firebase-bom = "32.7.0"
[libraries]
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase-bom" }
compose-ui = { group = "androidx.compose.ui", name = "ui" }
compose-material3 = { group = "androidx.compose.material3", name = "material3" }使用:
kotlin
dependencies {
implementation(platform(libs.compose.bom))
implementation(libs.compose.ui)
implementation(libs.compose.material3)
}测试配置共享 BOM
kotlin
dependencies {
val composeBom = platform(libs.compose.bom)
implementation(composeBom)
androidTestImplementation(composeBom)
implementation(libs.compose.ui)
androidTestImplementation(libs.compose.ui.test.junit4)
}BOM 版本策略
稳定版 BOM:
kotlin
dependencies {
// 使用稳定版
implementation(platform("androidx.compose:compose-bom:2024.12.01"))
}测试版 BOM:
kotlin
dependencies {
// 使用最新功能
debugImplementation(platform("androidx.compose:compose-bom:2025.01.00-alpha01"))
// 生产使用稳定版
releaseImplementation(platform("androidx.compose:compose-bom:2024.12.01"))
}实战案例
案例1:Compose 项目
kotlin
dependencies {
val composeBom = platform(libs.compose.bom)
implementation(composeBom)
androidTestImplementation(composeBom)
// UI
implementation(libs.compose.ui)
implementation(libs.compose.ui.graphics)
implementation(libs.compose.ui.tooling.preview)
implementation(libs.compose.material3)
implementation(libs.compose.material.icons.extended)
// Integration
implementation(libs.androidx.activity.compose)
implementation(libs.androidx.lifecycle.viewmodel.compose)
implementation(libs.androidx.navigation.compose)
// Testing
androidTestImplementation(libs.compose.ui.test.junit4)
debugImplementation(libs.compose.ui.tooling)
debugImplementation(libs.compose.ui.test.manifest)
}案例2:Firebase 项目
kotlin
dependencies {
implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
implementation(libs.firebase.firestore)
implementation(libs.firebase.auth)
implementation(libs.firebase.messaging)
}案例3:多模块项目
根项目:
kotlin
// build.gradle.kts (project)
subprojects {
configurations.all {
dependencies {
add("implementation", platform("androidx.compose:compose-bom:2024.12.01"))
}
}
}子模块:
kotlin
// feature/build.gradle.kts
dependencies {
// 自动使用根项目定义的 BOM
implementation(libs.compose.ui)
implementation(libs.compose.material3)
}调试 BOM
查看 BOM 内容
bash
# 下载 BOM 并查看
curl https://maven.google.com/androidx/compose/compose-bom/2024.12.01/compose-bom-2024.12.01.pom查看生效版本
bash
./gradlew :app:dependencies --configuration implementation输出:
implementation
+--- androidx.compose:compose-bom:2024.12.01
| +--- androidx.compose.ui:ui:1.7.5 (c)
| \--- androidx.compose.material3:material3:1.3.1 (c)
+--- androidx.compose.ui:ui -> 1.7.5
\--- androidx.compose.material3:material3 -> 1.3.1BOM 与其他机制对比
| 机制 | 用途 | 灵活性 | 适用场景 |
|---|---|---|---|
| BOM | 版本对齐 | 中 | 第三方库 |
| Version Catalog | 版本管理 | 高 | 项目内部 |
| Constraints | 版本约束 | 高 | 精细控制 |
| Force | 强制版本 | 低 | 最后手段 |
推荐组合:
- Version Catalog 管理 BOM 版本
- BOM 管理库版本
- Constraints 处理特殊情况
最佳实践
优先使用官方 BOM:
- Compose BOM
- Firebase BOM
- Kotlin BOM
Version Catalog 集成:
- 在
libs.versions.toml中定义 BOM - 统一管理 BOM 版本
避免覆盖 BOM 版本:
- 信任 BOM 版本选择
- 除非有明确原因
测试配置共享:
- implementation 和 androidTestImplementation 使用相同 BOM
- 确保测试环境一致
定期更新 BOM:
- 关注官方发布
- 测试新版本
- 及时升级
文档化 BOM 选择:
kotlin
dependencies {
// 使用 Compose BOM 2024.12.01
// 包含 Compose UI 1.7.5 和 Material3 1.3.1
implementation(platform(libs.compose.bom))
}