Kotlin DSL的build.gradle.kts如何将android{}块放入项目扩展并整合依赖
Kotlin DSL整合Android配置与公共依赖到自定义扩展的实现方案
前置准备
首先需要在项目的buildSrc模块中添加AGP和Kotlin插件依赖,才能访问Android相关配置类型,buildSrc/build.gradle.kts配置如下:
plugins { `kotlin-dsl` } repositories { google() mavenCentral() } dependencies { // 版本替换为你项目实际使用的AGP版本 implementation("com.android.tools.build:gradle:7.4.2") // 版本替换为你项目实际使用的Kotlin版本 implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0") }
方案1:补全你当前的扩展函数写法
直接封装为Project的顶层扩展函数,调用方式简单,适合快速统一配置,在buildSrc/src/main/kotlin/ProjectExt.kt中编写如下代码:
import com.android.build.gradle.BaseAppModuleExtension import org.gradle.api.Project import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies fun Project.androidUIDep(customAndroidConfig: BaseAppModuleExtension.() -> Unit = {}) { // 应用基础插件 apply(plugin = "com.android.application") apply(plugin = "kotlin-android") // 配置android块,内置公共配置+支持子模块自定义配置 configure<BaseAppModuleExtension> { // 公共全局配置,所有调用该方法的模块都会生效 compileSdk = 33 defaultConfig { minSdk = 21 targetSdk = 33 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } // 执行子模块传入的自定义Android配置 customAndroidConfig() } // 统一添加公共依赖 dependencies { "implementation"(project(":domain")) // 可添加其他全局公共依赖,比如核心库、Kotlin标准库等 "implementation"("androidx.core:core-ktx:1.9.0") } }
子模块调用方式
在子模块的build.gradle.kts中直接调用即可,无需再重复声明基础插件和公共配置:
plugins { // 仅声明当前模块独有的插件即可 id("kotlin-kapt") } androidUIDep { // 编写当前模块独有的Android配置 defaultConfig { applicationId = "com.xxx.myapplication" versionCode = 1 versionName = "1.0" } buildTypes { release { isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } } // 添加当前模块独有的依赖 dependencies { "implementation"("com.google.android.material:material:1.8.0") }
方案2:自定义myextension扩展块
如果需要实现你要求的project.myextension包裹式扩展块形式,可按如下方式实现:
第一步:定义扩展配置类
在buildSrc/src/main/kotlin/MyProjectExtension.kt中编写:
import com.android.build.gradle.BaseAppModuleExtension import org.gradle.api.Project import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies class MyProjectExtension(private val project: Project) { // 暴露Android配置入口 fun android(config: BaseAppModuleExtension.() -> Unit) { project.configure<BaseAppModuleExtension>(config) } // 暴露依赖配置入口 fun dependencies(config: org.gradle.api.artifacts.dsl.DependencyHandler.() -> Unit) { project.dependencies(config) } // 内部初始化方法,统一应用插件和公共配置 internal fun init() { project.apply(plugin = "com.android.application") project.apply(plugin = "kotlin-android") // 公共Android配置 project.configure<BaseAppModuleExtension> { compileSdk = 33 defaultConfig { minSdk = 21 targetSdk = 33 } } // 公共依赖 project.dependencies { "implementation"(project(":domain")) } } } // 注册扩展,对外暴露myextension入口 fun Project.myextension(config: MyProjectExtension.() -> Unit) { val extension = extensions.create("myextension", MyProjectExtension::class.java, this) extension.init() extension.config() }
子模块调用方式
plugins { id("kotlin-kapt") } myextension { android { defaultConfig { applicationId = "com.xxx.myapplication" versionCode = 1 versionName = "1.0" } } dependencies { "implementation"("com.google.android.material:material:1.8.0") } }
注意事项
- 如果是给Android Library模块使用,把代码中的
BaseAppModuleExtension替换为LibraryExtension即可 - AGP版本要和项目实际版本保持一致,否则会出现类型不匹配的报错
- 如果需要类型安全的依赖声明,可搭配Version Catalog使用,替换掉字符串形式的
"implementation"
内容的提问来源于stack exchange,提问作者hedew28310
相关产品推荐
相关产品推荐

