迁移至Gradle 8.1.1后构建失败:CommonExtension泛型参数异常
问题解答
1. 错误信息的含义
这条错误说明你代码中使用的CommonExtension接口需要5个泛型类型参数,但你只传入了4个。在AGP的新版本中,CommonExtension接口的定义新增了一个泛型参数AndroidResourcesT(对应AndroidResources类型),而你之前的代码是基于旧版本4个参数的接口编写的,类型不匹配导致构建失败。
2. 版本变更原因
从Gradle 8.0.2升级到8.1.1时,对应的AGP(Android Gradle Plugin)版本会同步升级(Gradle 8.1.x对应AGP 8.1.x)。在AGP 8.1的更新中,CommonExtension接口进行了扩展,新增了第5个泛型参数AndroidResourcesT,用于更精细地控制Android资源相关的配置。旧版本的CommonExtension只有4个泛型参数,因此你的代码在升级后出现了类型不匹配的问题。
解决建议
修改两个函数中CommonExtension的泛型参数,把4个通配符改成5个:
修改后的configureAndroidCompose函数
internal fun Project.configureAndroidCompose( commonExtension: CommonExtension<*, *, *, *, *> ) { val libs = extensions.getByType<VersionCatalogsExtension>().named("libs") commonExtension.apply { buildFeatures { compose = true viewBinding = true } composeOptions { kotlinCompilerExtensionVersion = libs.findVersion("androidx-compose").get().toString() } kotlinOptions { freeCompilerArgs = freeCompilerArgs } } }
修改后的configureFlavors函数
fun Project.configureFlavors( commonExtension: CommonExtension<*, *, *, *, *> ) { commonExtension.apply { flavorDimensions += FlavorDimension.environment.name productFlavors { Flavor.values().forEach { create(it.name) { dimension = it.dimension.name buildConfigField("String", "host", it.host) } } } testOptions { unitTests.isReturnDefaultValues = true unitTests.isIncludeAndroidResources = true unitTests.all { it.useJUnitPlatform() } } } }
如果你的函数只针对应用模块或库模块,也可以直接使用更具体的类型,比如应用模块用AndroidApplicationExtension,库模块用AndroidLibraryExtension,这样可以避免泛型通配符的问题,代码可读性也更好。
内容的提问来源于stack exchange,提问作者Daksh Semwal
相关产品推荐
相关产品推荐

