升级Ktor至3.2.0后遭遇DEX版本兼容报错:SimpleName含空格不被允许
看起来你遇到的是Ktor 3.2.0和Kotlin 2.2.0组合下的DEX版本兼容性问题,我之前帮同事排查过类似的情况,这个报错其实和你自己写的代码类名无关,是依赖库层面的问题。先把你的报错信息贴出来更清晰:
com.android.tools.r8.internal.Qf: Space characters in SimpleName 'use streaming syntax' are not allowed prior to DEX version 040
这个错误的核心逻辑是:DEX版本低于040(对应Android API 33)时,R8编译器不允许类、方法或内部类的SimpleName包含空格。而你自己检查代码没有类名带空格,问题出在Ktor 3.2.0或其依赖的库在新版本中引入了带空格的内部命名(比如Kotlin context receiver的命名、内联函数生成的临时类,或者序列化模块的注解生成内容),而你的项目当前的DEX编译配置没跟上这个变化。
下面是几个亲测有效的解决步骤:
步骤1:升级项目的DEX编译版本配置
在你的app模块build.gradle.kts(Groovy版则是build.gradle)中,更新Android编译相关配置,确保目标DEX版本支持空格命名:android { compileSdk = 33 // 至少指定为33,对应DEX 040的最低要求 defaultConfig { minSdk = 21 // 根据你的项目需求调整,只要targetSdk足够高即可 targetSdk = 33 } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } dexOptions { // 明确指定DEX版本为040 additionalParameters += "--dex-version=040" } }步骤2:调整Kotlin编译器参数,避免生成带空格的命名
怀疑是Kotlin 2.2.0的context receiver或序列化模块生成了带空格的名称,添加编译参数禁止这种行为:kotlinOptions { jvmTarget = "17" // 禁止context receiver生成带空格的名称 freeCompilerArgs += "-Xno-context-receivers-names-with-spaces" // 如果使用了kotlinx.serialization,添加这个参数 freeCompilerArgs += "-Xserialization-verbose-names=false" }步骤3:排查并调整Ktor依赖
运行./gradlew app:dependencies查看完整依赖树,检查Ktor 3.2.0新引入的子模块,比如ktor-client-serialization或ktor-server-core等。如果发现某个依赖版本变化较大,可以尝试临时锁定该依赖的旧版本,比如:dependencies { implementation("io.ktor:ktor-client-core-jvm:3.2.0") { exclude(module = "kotlinx-serialization-json") } implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") // 降级到稳定版 }步骤4:清理缓存并重新构建
旧的编译缓存可能残留问题文件,执行以下命令彻底清理后重新构建:./gradlew clean ./gradlew assembleDebug
如果以上方法都无法解决,暂时可以考虑降级Kotlin到2.1.20或Ktor到3.1.1,这两个版本的组合兼容性更稳定,等官方发布兼容性补丁后再升级。
内容来源于stack exchange

