如何在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
相关产品推荐
相关产品推荐

