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

如何在buildSrc的Kotlin DSL插件中访问Android变体?

在buildSrc中访问Android应用/库变体的Kotlin DSL实现

1. 配置buildSrc的依赖

首先在buildSrc/build.gradle.kts中添加Android Gradle插件(AGP)的API依赖,确保插件代码能访问Android相关的扩展和变体:

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

dependencies {
    implementation("com.android.tools.build:gradle-api:7.4.2") // 替换为你项目使用的AGP版本
    implementation(gradleApi())
}

2. 创建自定义Gradle插件类

在buildSrc/src/main/kotlin下创建插件类(而非直接使用.build.kts文件),通过实现Plugin<Project>接口编写逻辑:

针对Android应用模块的插件

import com.android.build.api.variant.ApplicationVariant
import com.android.build.gradle.api.ApplicationExtension
import org.gradle.api.Plugin
import org.gradle.api.Project

class ModuleGradlePlugin : Plugin<Project> {
    override fun apply(project: Project) {
        // 确保Android应用插件已加载后再执行逻辑
        project.plugins.withId("com.android.application") {
            val androidExtension = project.extensions.getByType(ApplicationExtension::class.java)
            
            // 遍历所有应用变体(使用all监听延迟创建的变体)
            androidExtension.applicationVariants.all { variant: ApplicationVariant ->
                val variantName = variant.name.replaceFirstChar { 
                    if (it.isLowerCase()) it.titlecase() else it.toString() 
                }
                val testTaskName = "test${variantName}UnitTest"
                
                // 这里添加你的业务逻辑,比如关联任务、配置参数等
                println("匹配到测试任务:$testTaskName 对应变体:${variant.name}")
            }
        }
    }
}

兼容Android库模块的插件

如果需要支持库模块,只需替换为LibraryExtension和libraryVariants:

import com.android.build.api.variant.LibraryVariant
import com.android.build.gradle.api.LibraryExtension
import com.android.build.gradle.api.ApplicationExtension
import org.gradle.api.Plugin
import org.gradle.api.Project

class ModuleGradlePlugin : Plugin<Project> {
    override fun apply(project: Project) {
        // 处理应用模块
        project.plugins.withId("com.android.application") {
            val androidExtension = project.extensions.getByType(ApplicationExtension::class.java)
            androidExtension.applicationVariants.all { variant ->
                // 应用模块逻辑
            }
        }
        
        // 处理库模块
        project.plugins.withId("com.android.library") {
            val androidExtension = project.extensions.getByType(LibraryExtension::class.java)
            androidExtension.libraryVariants.all { variant: LibraryVariant ->
                val variantName = variant.name.replaceFirstChar { 
                    if (it.isLowerCase()) it.titlecase() else it.toString() 
                }
                println("库模块变体:$variantName")
            }
        }
    }
}

3. 注册自定义插件

在buildSrc/src/main/resources/META-INF/gradle-plugins下创建属性文件(文件名即为插件ID,比如com.yourteam.modulegradle.properties),内容为:

implementation-class=ModuleGradlePlugin

注意:路径和文件名必须严格遵循该结构,后续应用插件时会用到这个ID。

4. 在Android模块中应用插件

在目标模块的build.gradle.kts中引入自定义插件:

plugins {
    id("com.android.application") // 或 com.android.library
    id("com.yourteam.modulegradle") // 对应上面定义的插件ID
}

关键注意事项

  • 必须用plugins.withId("com.android.application")包裹逻辑,确保Android插件加载完成后再访问扩展,避免出现找不到Android扩展的错误。
  • 使用all而非forEach遍历变体:Gradle的变体是延迟创建的,all会监听变体创建事件,确保所有变体都能被处理。
  • AGP版本要与项目中使用的版本保持一致,避免兼容性问题。

内容的提问来源于stack exchange,提问作者DJ-DOO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:25:12