Skip to content

使用 BOM 对齐版本

源:Gradle 官方文档 - Platforms

BOM (Bill of Materials) 是一种特殊的依赖,用于集中管理一组相关库的版本,确保版本兼容性。

BOM 概念

什么是 BOM

BOM 是一个特殊的 Maven 工件,定义了一组库的推荐版本。

作用

  • 统一相关库版本
  • 确保版本兼容
  • 简化依赖声明

BOM vs Version Catalog

特性BOMVersion 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.1

BOM 与其他机制对比

机制用途灵活性适用场景
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))
}