更新到 Kotlin 1.4 后,Android Gradle 构建失败 dexBuilderDebug 任务

Posted

技术标签:

【中文标题】更新到 Kotlin 1.4 后,Android Gradle 构建失败 dexBuilderDebug 任务【英文标题】:Android Gradle build fails dexBuilderDebug task, after updating to Kotlin 1.4 【发布时间】:2020-12-10 00:21:36 【问题描述】:

我尝试将我的 android 项目更新为 Kotlin 1.4.0,因为它现在正式稳定,但更新后我遇到了问题。我不会在这里发布整个堆栈,因为它很长,但它的顶部看起来像这样:

...
> Task :app:transformClassesWithFirebasePerformancePluginForDebug
java.lang.ClassNotFoundException: javax.mail.internet.MimeBodyPart
> Task :app:mergeDebugJavaResource
> Task :app:dexBuilderDebug FAILED
org.gradle.workers.WorkerExecutionException: There was a failure while executing work items
...

在堆栈中寻找原因,我发现了这个:

...
Caused by: org.gradle.tooling.BuildException: Failed to process: 
/bitrise/src/app/build/intermediates/transforms/FirebasePerformancePlugin/debug/0, 
/bitrise/src/app/build/intermediates/transforms/FirebasePerformancePlugin/debug/1,
/bitrise/src/app/build/intermediates/transforms/FirebasePerformancePlugin/debug/2
...

这使我得出结论,即无法正确构建 Firebase 性能库。我正在使用 Firebase 性能版本 19.0.8 和 gradle 类路径插件版本 1.3.1。我有一段时间没有更改它,恢复到早期版本并不能解决问题。在堆栈上注册的最后一个错误是这样的:

Caused by: com.android.builder.dexing.DexArchiveBuilderException: Error while dexing.
    at com.android.builder.dexing.D8DexArchiveBuilder.getExceptionToRethrow(D8DexArchiveBuilder.java:151)
    at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:118)
    at com.android.build.gradle.internal.dexing.DexWorkActionKt.process(DexWorkAction.kt:194)
    ... 33 more
Caused by: java.lang.IllegalStateException: Unexpected non-class file: META-INF/versions/9/kotlin/reflect/jvm/internal/impl/serialization/deserialization/builtins/BuiltInsResourceLoader.class

我已经确定,删除 Firebase 性能库并恢复到 Kotlin 1.3.71 可以解决问题,但我想保留它们以供项目的未来使用,因此我正在寻找其他解决方案。

我的build.gradle 文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
apply plugin: 'androidx.navigation.safeargs.kotlin'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'
apply plugin: 'com.google.firebase.firebase-perf'
apply from: "dependencies.gradle"
apply from: "buildtypes.gradle"

android 
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig 
        applicationId "com.example.app"
        minSdkVersion 23
        targetSdkVersion 29
        versionCode 100
        versionName "1.0.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        archivesBaseName = "$applicationId-$versionName-$versionCode"
    

    compileOptions 
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    

    kotlinOptions 
        jvmTarget = JavaVersion.VERSION_1_8.toString()
    

    buildFeatures 
        dataBinding = true
    

以及完整的依赖列表:

    coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:$versions.coreDesugaring"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
    implementation "androidx.core:core:$versions.core"
    implementation "androidx.core:core-ktx:$versions.core"
    implementation "androidx.appcompat:appcompat:$versions.appCompat"
    implementation "androidx.browser:browser:$versions.browser"
    implementation "androidx.constraintlayout:constraintlayout:$versions.constraintLayout"
    implementation "androidx.legacy:legacy-support-v4:$versions.legacy"

    // UI
    implementation "com.google.android.material:material:$versions.material"
    implementation "com.appyvet:materialrangebar:$versions.materialRangeBar"
    implementation "com.wdullaer:materialdatetimepicker:$versions.datetimepicker"

    // Lifecycle
    implementation "androidx.lifecycle:lifecycle-extensions:$versions.lifecycle"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$versions.lifecycle"

    // Navigation component
    implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"

    // Coroutines
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$versions.coroutines"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$versions.coroutines"

    // Koin
    implementation "org.koin:koin-android:$versions.koin"
    implementation "org.koin:koin-androidx-ext:$versions.koin"
    implementation "org.koin:koin-androidx-scope:$versions.koin"
    implementation "org.koin:koin-androidx-viewmodel:$versions.koin"

    // Work Manager
    implementation "androidx.work:work-runtime:$versions.work"
    implementation "androidx.work:work-runtime-ktx:$versions.work"

    // Flipper
    debugImplementation "com.facebook.soloader:soloader:$versions.soloader"
    debugImplementation "com.facebook.flipper:flipper-network-plugin:$versions.flipper"
    debugImplementation "com.kgurgul.flipper:flipper-realm-android:$versions.flipperRealm"
    debugImplementation "com.facebook.flipper:flipper:$versions.flipper"
    releaseImplementation "com.facebook.flipper:flipper-noop:$versions.flipper"

    // Location & Maps
    implementation "com.google.android.gms:play-services-maps:$versions.playLocation"
    implementation "com.google.android.gms:play-services-location:$versions.playLocation"
    implementation "com.google.maps.android:android-maps-utils:$versions.mapUtils"

    // Logging
    implementation "com.jakewharton.timber:timber:$versions.timber"
    implementation "org.slf4j:slf4j-api:$versions.slf4j"
    implementation "com.github.tony19:logback-android:$versions.logback"

    // Databases
    implementation "com.github.sevar83:android-spatialite:$versions.spatialite"

    // Archives
    implementation "org.zeroturnaround:zt-zip:$versions.ztZip"

    // Dialogs
    implementation "com.afollestad.material-dialogs:core:$versions.materialDialogs"
    implementation "com.afollestad.material-dialogs:datetime:$versions.materialDialogs"
    implementation "com.afollestad.material-dialogs:lifecycle:$versions.materialDialogs"

    // Permissions
    implementation "com.karumi:dexter:$versions.dexter"
    implementation("dev.doubledot.doki:library:$versions.doki") 
        transitive = true
    

    // JSON
    implementation "com.squareup.moshi:moshi:$versions.moshi"
    implementation "com.squareup.moshi:moshi-kotlin:$versions.moshi"

    // Firebase
    implementation "com.google.firebase:firebase-analytics:$firebase_versions.analytics"
    implementation "com.google.firebase:firebase-crashlytics:$firebase_versions.crashlytics"
    implementation "com.google.firebase:firebase-perf:$firebase_versions.performance"

    // Payments
    implementation "com.android.billingclient:billing:$versions.billing"
    implementation "com.android.billingclient:billing-ktx:$versions.billing"

    // Testing
    testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    testImplementation "junit:junit:$test_version.junit"
    testImplementation "androidx.test:core:$test_version.androidTest"
    testImplementation "androidx.test:runner:$test_version.androidTest"

为什么这个构建失败了?是 Kotlin 的 1.4.0 错误,还是依赖有问题?是否可以在不恢复到以前的 Kotlin 版本的情况下解决此问题?

【问题讨论】:

如果你使用1.3.72那么呢? 我不知道为什么这被否决了,所以我赞成你:我们也遇到了 1.4 的问题,永远停留在 1.3 上是行不通的。对于您的情况,请尝试执行 ./gradlew clean - 我们会在解决后发布我们的修复程序 使用1.3.72 时一切正常。我已经完成了干净的重建,但似乎没有任何帮助。 这里是问题:github.com/firebase/firebase-android-sdk/issues/1888 我们也看到了这个问题,停留在 1.3 并不是真正的解决方案,您有任何更新吗? 【参考方案1】:

这似乎是一个 AGP 问题,将在版本 4.1.0 中解决。更多细节在这里 - https://issuetracker.google.com/issues/165535092

作为一种解决方法,建议应用 4.1.0-rc02 更新

classpath 'com.android.tools.build:gradle:4.1.0-rc02'

【讨论】:

我用这个更改了导入,但出现错误;此版本的 IntelliJ IDEA(或 Android Studio)的 Android Support 插件无法打开此项目,请使用 4.1 或更高版本重试。 是的,你也应该碰一下 Android Studio @CaferMertCeyhan。在写答案的那一刻,它是 Android Studio 4.1 RC 2。目前是 AS 4.1(发布渠道)【参考方案2】:

不是最好的解决方案,但至少对我来说,它有效: 如果您使用 Gradle 包装器从命令行构建:

./gradlew clean assembleDebug -Pdisable-performance-plugin

如果您从 Android Studio 运行项目:

然后您就可以使用 Kotlin 1.4 运行您的项目,直到他们解决问题为止。

作为副作用,构建时间似乎得到了改善。

【讨论】:

以上是关于更新到 Kotlin 1.4 后,Android Gradle 构建失败 dexBuilderDebug 任务的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04) -- 更新版

更新 gradle 插件后,Android Studio 不会在 kotlin 类中显示错误

android studio怎么用kotlin

Android studio 4.0 新更新版本说 Kotlin 与这个新版本不兼容

Android Studio不更新到最新版使用Kotlin

将 Android API 从 27 降级到 21 (KOTLIN) 后出错