将compileSdk从34升级到35后运行时找不到List.reversed()方法
问题原因与解决方案
核心原因
你遇到的NoSuchMethodError,是因为编译时reversed()被解析成了Java 21新增的java.util.List.reversed()原生方法,而非Kotlin标准库的扩展方法。
当targetSdkVersion升级到35(对应Android 15),Android Gradle Plugin默认允许使用API 35对应的Java 21新API,但你的App运行在API 34及以下的设备时,系统内置的Java库并没有这个原生方法,因此抛出找不到方法的错误。
虽然IDE显示该方法属于kotlin.collections,但编译阶段的方法解析优先级,导致实际生成的代码调用了Java原生的reversed()。
解决方法
方法一:显式指定调用Kotlin扩展方法
直接通过全限定名调用Kotlin的reversed()扩展方法,强制编译器选择Kotlin实现:
return kotlin.collections.reversed(dataToIncrease).toMutableList()
方法二:手动实现逆序逻辑(兼容更稳妥)
如果担心方法解析问题,也可以手动实现列表逆序,彻底避免依赖版本相关的方法:
fun MutableList<Byte>.increaseDataLengthBy(numberToIncrease: Int): MutableList<Byte> { val dataToIncrease = this if (dataToIncrease.size > 1) { dataToIncrease.reverse() } repeat(numberToIncrease) { dataToIncrease.add(0) } // 手动逆序 val reversedList = mutableListOf<Byte>() for (i in dataToIncrease.size - 1 downTo 0) { reversedList.add(dataToIncrease[i]) } return reversedList }
方法三:调整编译配置(限制Java API版本)
在模块的build.gradle.kts(或build.gradle)中,添加配置强制使用兼容低版本的Java API,避免编译时引入高版本方法:
android { compileOptions { coreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") }
启用核心库脱糖(Desugaring)后,AGP会将高版本Java API转换为低版本兼容的实现,确保运行时不会出现方法缺失。
内容的提问来源于stack exchange,提问作者Kibi
相关产品推荐
相关产品推荐

