移动/游戏
Android 多模块 Gradle 构建逻辑重复时:用…
适用于 Android 项目需要在多个模块间复用并统一 Gradle 构建逻辑、插件和依赖版本的场景。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Android 多模块 Gradle 构特定
解决思路
- 不要在各模块的 `build.gradle.kts` 间复制粘贴代码;把 Compose setup、Kotlin options、Hilt 等公共构建逻辑集中到可复用的 Convention Plugin 中。
- 在项目中创建 `build-logic` 目录,并把它作为复合构建(composite build)纳入 `settings.gradle.kts`,使构建逻辑可被主构建使用。
- 按如下结构组织文件:根目录下包含 `build-logic/convention/src/main/kotlin/`、`build-logic/convention/build.gradle.kts`、`build-logic/build.gradle.kts`、`build-logic/settings.gradle.kts`、`gradle/libs.versions.toml`、`app/build.gradle.kts` 和根 `settings.gradle.kts`。
- 配置根 `settings.gradle.kts` 的 `pluginManagement`:加入 `includeBuild("build-logic")`,并配置 `google()`、`mavenCentral()`、`gradlePluginPortal()` 仓库。
- 配置根 `settings.gradle.kts` 的 `dependencyResolutionManagement`:设置 `repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)`,并配置 `google()`、`mavenCentral()` 仓库。
- 在 `gradle/libs.versions.toml` 中用 Version Catalog 同时管理库和插件:在 `[versions]` 中定义 `androidGradlePlugin = "8.2.0"`、`kotlin = "1.9.20"` 等版本。
- 在 `gradle/libs.versions.toml` 的 `[libraries]` 中定义依赖;在 `[plugins]` 中定义 `android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }`、`android-library`、`kotlin-android` 以及自定义插件如 `nowinandroid-android-application = { id = "nowinandroid.android.application", version = "unspecified" }`。
- 在 `build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt` 创建 Convention Plugin 类,实现 `Plugin<Project>` 并重写 `apply(target: Project)`。
- 在 Convention Plugin 的 `apply` 中用 `with(target)`,并在 `with(pluginManager)` 中应用 `com.android.application`、`org.jetbrains.kotlin.android` 等通用插件。
- 在 Convention Plugin 中用 `extensions.configure<ApplicationExtension>` 配置 Android 公共选项,例如 `defaultConfig.targetSdk = 34`,并可在此集中配置 Compose setup、Kotlin options、Hilt 等。
- 在 `build-logic/convention/build.gradle.kts` 的 `gradlePlugin { plugins { ... } }` 中注册插件,例如 `register("androidApplication")`,设置 `id = "nowinandroid.android.application"`、`implementationClass = "AndroidApplicationConventionPlugin"`。
- 在各模块的 `build.gradle.kts`(如 `app/build.gradle.kts`)中用 `plugins { alias(libs.plugins.nowinandroid.android.application) }` 应用自定义插件,从而清理模块级构建文件。
适用边界 · 注意事项
- 单模块或极小型 Android 项目:引入 `build-logic` 和 Convention Plugin 的维护成本可能高于收益。
- Gradle 版本过旧、未使用 Kotlin DSL 或 Version Catalog 的项目:需要先升级或迁移,否则无法直接套用。
- 只需要一次性或临时构建配置的项目:集中化、插件注册和复合构建会带来额外复杂度。