如何在检测到Android Gradle插件时自动执行Gradle任务配置?
解决方案
核心思路是利用Gradle的插件应用回调机制,仅当Android插件被应用到子项目时才执行相关配置,避免主构建脚本直接依赖未加载的Android类。
具体实现代码
在主build.gradle.kts中添加以下配置:
subprojects { // 处理Android Library模块 pluginManager.withPlugin("com.android.library") { val androidExt = extensions.getByType(com.android.build.gradle.LibraryExtension::class) val androidPlugin = plugins.getPlugin(com.android.build.gradle.LibraryPlugin::class.java) tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).configureEach { libraries.from({ AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt) }) } } // 处理Android Application模块(如果项目包含此类模块) pluginManager.withPlugin("com.android.application") { val androidExt = extensions.getByType(com.android.build.gradle.AppExtension::class) val androidPlugin = plugins.getPlugin(com.android.build.gradle.AppPlugin::class.java) tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).configureEach { libraries.from({ AndroidGradleWrapper.getRuntimeJars(androidPlugin, androidExt) }) } } }
关键说明
pluginManager.withPlugin("插件ID"):仅当指定插件被应用到当前子项目时,才执行内部逻辑。此时Android相关类已被Gradle加载,不会出现解析错误。subprojects块:确保配置自动应用到所有子项目,无需手动在每个子项目的构建脚本中重复配置。- 区分
com.android.library和com.android.application:覆盖项目中不同类型的Android模块,保证所有Android目标都能触发配置。
额外注意事项
如果AndroidGradleWrapper是自定义工具类,需确保它能被主构建脚本访问:
- 推荐将其放在项目的
buildSrc目录下,Gradle会自动将buildSrc的代码加入构建脚本类路径。 - 若无法使用
buildSrc,可通过主脚本的buildscript块引入包含该类的依赖。
内容的提问来源于stack exchange,提问作者dave mankoff
相关产品推荐
相关产品推荐

