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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:37:57