多模块项目转Gradle Kotlin DSL时Android块未被识别
Kotlin DSL抽离Android配置时的"Unresolved reference: android"问题解决
问题背景
将Android项目转为多模块结构时,把com.android.application之外的插件、Android配置块、通用依赖移到根目录的base-build.gradle.kts,通过apply(from)引入到app模块后,同步出现两个问题:
base-build.gradle.kts中的android块提示Unresolved reference: android- 出现
Cannot access class 'org.gradle.api.Action'警告
但相同逻辑用Groovy DSL配置可正常运行。
核心原因
Kotlin DSL是类型安全的,普通apply(from)加载的脚本无法获得Android Gradle插件的DSL类型支持;同时Gradle版本与AGP版本不匹配也会引发Action类访问警告。
解决方案
方案一:使用预编译脚本插件(推荐)
预编译脚本插件会被Gradle编译,能获得完整的Kotlin DSL类型提示与支持,是Kotlin DSL抽离通用配置的标准方式。
创建预编译插件目录
在项目根目录新建buildSrc/src/main/kotlin路径(若不存在),Gradle会自动识别该目录下的预编译脚本。编写预编译插件脚本
在上述目录下创建base.android.application.gradle.kts,内容如下:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id("kotlin-parcelize") id("com.google.devtools.ksp") id("com.google.dagger.hilt.android") } android { compileSdk = 34 defaultConfig { minSdk = 26 targetSdk = 34 versionCode = 1 versionName = "1.0" // 补充你的其他默认配置 } // 可添加buildTypes、compileOptions等通用Android配置 } // 在这里定义通用依赖(可选) dependencies { // 示例:implementation("androidx.core:core-ktx:1.12.0") }
- 修改app模块配置
删除app模块build.gradle.kts中的apply(from),直接应用预编译插件:
plugins { id("base.android.application") } // 在这里添加app模块专属的配置和依赖 dependencies { implementation(project(":core")) // 其他模块或第三方依赖 }
- 清理旧文件
删除根目录下的base-build.gradle.kts,同步项目即可。
方案二:修改现有脚本的类型引用(临时兼容)
如果不想重构为预编译插件,可通过显式指定Android扩展类型解决引用问题:
修改base-build.gradle.kts内容:
apply(plugin = "org.jetbrains.kotlin.android") apply(plugin = "kotlin-parcelize") apply(plugin = "com.google.devtools.ksp") apply(plugin = "com.google.dagger.hilt.android") // 显式获取Application类型的Android扩展,解决Unresolved reference问题 configure<com.android.build.gradle.internal.dsl.ApplicationExtension> { compileSdk = 34 defaultConfig { minSdk = 26 targetSdk = 34 versionCode = 1 versionName = "1.0" // 你的其他配置 } // 其他Android配置 } // 依赖块可正常编写 dependencies { // 通用依赖 }
解决"Cannot access class 'org.gradle.api.Action'"警告
检查gradle/wrapper/gradle-wrapper.properties中的Gradle版本,AGP 8.3.2需要搭配Gradle 8.4及以上版本,修改distributionUrl:
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip
额外注意事项
- 确保项目级
build.gradle.kts中,plugins块的插件版本与buildscript里的classpath版本完全一致 - 多模块项目中,若有library模块,可同理创建
base.android.library.gradle.kts预编译插件
内容的提问来源于stack exchange,提问作者Guri
相关产品推荐
相关产品推荐

