You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Ktor至3.2.0后遭遇DEX版本兼容报错:SimpleName含空格不被允许

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 11:03:05