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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:27:02