You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子模块开启buildFeatures.compose=true时自动添加Gradle依赖?

实现子模块开启Compose时自动注入依赖的方案

这问题我太熟悉了!刚好之前帮团队重构多模块项目时解决过一模一样的痛点——把重复的Compose依赖配置从各个子模块里抽出来,实现「一键开启Compose自动加依赖」的效果。下面给你两种实用方案,按需选择:

方案一:根项目构建脚本快速实现(适合中小项目)

你可以在根目录的构建脚本中通过subprojects块监听所有子模块的配置,当检测到模块开启了buildFeatures.compose = true时,自动注入Compose依赖和必要的配置。

Groovy版(根目录build.gradle)

subprojects {
    afterEvaluate { project ->
        // 只处理Android模块(应用或库)
        if (project.hasProperty('android')) {
            def android = project.android
            // 检查是否开启了Compose
            if (android.buildFeatures.compose) {
                // 统一管理版本号,建议放到根项目的ext里或者Version Catalog
                def composeVersion = "1.5.3"
                def kotlinCompilerExtensionVersion = "1.5.3"

                dependencies {
                    // 核心Compose依赖
                    implementation "androidx.compose.ui:ui:$composeVersion"
                    implementation "androidx.compose.material3:material3:$composeVersion"
                    implementation "androidx.compose.ui:ui-tooling-preview:$composeVersion"
                    debugImplementation "androidx.compose.ui:ui-tooling:$composeVersion"
                    // 可选:添加常用的Compose扩展依赖,比如ViewModel集成
                    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2"
                }

                // 必须设置Kotlin编译器扩展版本,否则编译报错
                android.composeOptions.kotlinCompilerExtensionVersion = kotlinCompilerExtensionVersion
            }
        }
    }
}

Kotlin DSL版(根目录build.gradle.kts)

subprojects {
    afterEvaluate {
        // 找到Android模块的扩展配置
        extensions.findByType<com.android.build.gradle.BaseExtension>()?.apply {
            if (buildFeatures.compose) {
                val composeVersion = "1.5.3"
                val kotlinCompilerExtensionVersion = "1.5.3"

                dependencies {
                    implementation("androidx.compose.ui:ui:$composeVersion")
                    implementation("androidx.compose.material3:material3:$composeVersion")
                    implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion")
                    debugImplementation("androidx.compose.ui:ui-tooling:$composeVersion")
                    implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2")
                }

                composeOptions.kotlinCompilerExtensionVersion = kotlinCompilerExtensionVersion
            }
        }
    }
}

方案二:Gradle约定插件(适合复杂多模块场景,更规范)

如果你的项目模块较多、配置复杂,推荐用Gradle约定插件来封装Compose配置,这种方式更符合Gradle的最佳实践,也便于维护和扩展。

步骤1:创建构建逻辑模块(build-logic)

在项目根目录下创建build-logic目录,用来存放约定插件。

步骤2:编写Compose约定插件

在build-logic/convention/src/main/kotlin/com/yourcompany/ComposeConventionPlugin.kt中编写插件代码:

import com.android.build.gradle.BaseExtension
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.kotlin.dsl.dependencies

class ComposeConventionPlugin : Plugin<Project> {
    override fun apply(target: Project) {
        with(target) {
            // 只对Android应用和库模块生效
            plugins.withId("com.android.application") {
                configureAndroidExtension()
            }
            plugins.withId("com.android.library") {
                configureAndroidExtension()
            }
        }
    }

    private fun Project.configureAndroidExtension() {
        extensions.findByType<BaseExtension>()?.apply {
            afterEvaluate {
                if (buildFeatures.compose) {
                    // 推荐用Version Catalog统一管理版本(见下文补充)
                    val composeVersion = "1.5.3"
                    val kotlinCompilerExtensionVersion = "1.5.3"

                    dependencies {
                        implementation("androidx.compose.ui:ui:$composeVersion")
                        implementation("androidx.compose.material3:material3:$composeVersion")
                        implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion")
                        debugImplementation("androidx.compose.ui:ui-tooling:$composeVersion")
                        implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2")
                    }

                    composeOptions.kotlinCompilerExtensionVersion = kotlinCompilerExtensionVersion
                }
            }
        }
    }
}

步骤3:配置插件并应用到项目

按照Gradle约定插件的配置规范,在build-logic的构建脚本中配置插件发布,然后在根项目的settings.gradle.kts中引入build-logic,最后子模块只需开启Compose即可自动获取依赖。

额外优化:用Version Catalog统一管理版本

不管用哪种方案,都推荐用Gradle的Version Catalog(libs.versions.toml)来统一管理所有依赖版本,避免版本分散:

在根目录gradle/libs.versions.toml中添加:

[versions]
compose = "1.5.3"
kotlinCompilerExtension = "1.5.3"
lifecycleViewModelCompose = "2.6.2"

[libraries]
compose-ui = { group = "androidx.compose.ui", name = "ui", version.ref = "compose" }
compose-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "compose" }
compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview", version.ref = "compose" }
compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling", version.ref = "compose" }
lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewModelCompose" }

之后依赖可以写成implementation(libs.compose.ui)(Kotlin DSL)或implementation libs.compose.ui(Groovy),更清晰且便于统一升级。

注意事项

  • afterEvaluate的作用:确保子模块的Android配置已经被解析完成,再检查buildFeatures.compose的值,避免读取到默认的false。
  • 必须设置kotlinCompilerExtensionVersion:这个版本需要和Compose版本匹配,否则会出现编译错误。
  • 按需添加依赖:可以根据项目需求调整自动注入的依赖列表,比如不需要Material3的话换成Material,或者添加Compose Navigation等扩展依赖。

内容的提问来源于stack exchange,提问作者Viacheslav Smityukh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:50:16