Android根项目自定义Gradle插件配置报错,如何正确实现?
问题场景
我的示例Android应用根项目的build.gradle配置如下:
plugins { id 'com.android.application' version '7.2.2' apply false id 'com.android.library' version '7.2.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.10' apply false }
我尝试将这段配置转为自定义Gradle插件,编写了如下代码:
class CustomGradlePlugin : Plugin<Project> { override fun apply(target: Project) { target.plugins.withId("com.android.application") { it.extraProperties.set("version", "7.2.2") it.apply(false) } target.plugins.withId("com.android.library") { it.extraProperties.set("version", "7.2.2") it.apply(false) } target.plugins.withId("org.jetbrains.kotlin.android") { it.extraProperties.set("version", "1.7.10") it.apply(false) } } }
应用该插件时,Gradle抛出错误:
> Failed to apply plugin > Configuration with name 'api' not found.
调整org.jetbrains.kotlin.android插件的应用顺序后仍报错,请问如何正确创建该自定义Gradle插件?
错误原因与解决方案
你的代码逻辑完全错误——plugins.withId()是用来监听已应用的插件,而非声明插件并设置版本。当前写法是等待插件被应用后修改属性,和原配置“在根项目预声明插件版本但不立即应用,供子项目按需使用”的意图完全相悖。
报错的核心原因是:错误逻辑导致Kotlin Android插件在未依赖Android插件的情况下被触发应用,而Kotlin Android插件需要Android插件提供的api等配置,因此抛出异常。
以下是两种正确的实现方式:
方式一:通过pluginManager声明
class CustomGradlePlugin : Plugin<Project> { override fun apply(target: Project) { // 声明Android应用插件,指定版本且不立即应用 target.pluginManager.apply("com.android.application") { it.version("7.2.2") it.apply(false) } // 声明Android库插件,指定版本且不立即应用 target.pluginManager.apply("com.android.library") { it.version("7.2.2") it.apply(false) } // 声明Kotlin Android插件,指定版本且不立即应用 target.pluginManager.apply("org.jetbrains.kotlin.android") { it.version("1.7.10") it.apply(false) } } }
方式二:使用plugins DSL直接声明
class CustomGradlePlugin : Plugin<Project> { override fun apply(target: Project) { target.plugins.apply { id("com.android.application") version "7.2.2" apply false id("com.android.library") version "7.2.2" apply false id("org.jetbrains.kotlin.android") version "1.7.10" apply false } } }
两种写法都等价于原build.gradle的配置逻辑,可实现根项目集中管理插件版本的需求。
内容的提问来源于stack exchange,提问作者SRKS
相关产品推荐
相关产品推荐

