Google Play Testing app crash - java.lang.NoSuchFieldError: No field Key of type Lkotlinx/coroutines/CoroutineExceptionHandler

1.3k views Asked by At

The application works stably on tested emulators in the studio and real devices. When uploading to the Internal Testing section in Google Play, the device consistently crashes:

Google Pixel 6 1080x2400 Android 12 (SDK 31) 8,192 MB arm64-v8a.

Google Play Console stacktrace

Exception java.lang.NoSuchFieldError: No field Key of type Lkotlinx/coroutines/CoroutineExceptionHandler$Key; in class Lkotlinx/coroutines/CoroutineExceptionHandler; or its superclasses (declaration of 'kotlinx.coroutines.CoroutineExceptionHandler' appears in /data/app/~~KWhmPpaU6JtpmIAZBH3isw==/androidx.test.tools.crawler-P3SH8J3nls-tHnM5nwslZg==/base.apk)
  at ua.at.tsvetkov.weather.ui.outfits.quick.QuickSelectionViewModel.<init> (QuickSelectionViewModel.kt:235)
  at ua.at.tsvetkov.weather.DaggerAppWeather_HiltComponents_SingletonC$ViewModelCImpl$SwitchingProvider.get (DaggerAppWeather_HiltComponents_SingletonC.java:644)
  at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$2.createViewModel (HiltViewModelFactory.java:133)
  at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory$2.create (HiltViewModelFactory.java:104)
  at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create (HiltViewModelFactory.java:171)
  at androidx.lifecycle.ViewModelProvider.get (ViewModelProvider.kt:184)
  at androidx.lifecycle.ViewModelProvider.get (ViewModelProvider.kt:150)
  at androidx.lifecycle.ViewModelLazy.getValue (ViewModelLazy.kt:53)
  at androidx.lifecycle.ViewModelLazy.getValue (ViewModelLazy.kt:35)
  at ua.at.tsvetkov.weather.ui.outfits.quick.QuickSelectionFragment.getViewModel (QuickSelectionFragment.kt:55)
  at ua.at.tsvetkov.weather.ui.outfits.quick.QuickSelectionFragment.onCreateView (QuickSelectionFragment.kt:62)
  at androidx.fragment.app.Fragment.performCreateView (Fragment.java:3114)
  at androidx.fragment.app.FragmentStateManager.createView (FragmentStateManager.java:557)
  at androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:272)
  at androidx.fragment.app.FragmentStore.moveToExpectedState (FragmentStore.java:114)
  at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1455)
  at androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:3034)
  at androidx.fragment.app.FragmentManager.dispatchViewCreated (FragmentManager.java:2945)
  at androidx.fragment.app.Fragment.performViewCreated (Fragment.java:3148)
  at androidx.fragment.app.FragmentStateManager.ensureInflatedView (FragmentStateManager.java:410)
  at androidx.fragment.app.FragmentStateManager.moveToExpectedState (FragmentStateManager.java:271)
  at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView (FragmentLayoutInflaterFactory.java:142)
  at androidx.fragment.app.FragmentController.onCreateView (FragmentController.java:136)
  at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView (FragmentActivity.java:247)
  at androidx.fragment.app.FragmentActivity.onCreateView (FragmentActivity.java:226)
  at android.view.LayoutInflater.tryCreateView (LayoutInflater.java:1073)
  at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:1001)
  at android.view.LayoutInflater.createViewFromTag (LayoutInflater.java:965)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1127)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1088)
  at android.view.LayoutInflater.parseInclude (LayoutInflater.java:1267)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1123)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1088)
  at android.view.LayoutInflater.parseInclude (LayoutInflater.java:1267)
  at android.view.LayoutInflater.rInflate (LayoutInflater.java:1123)
  at android.view.LayoutInflater.rInflateChildren (LayoutInflater.java:1088)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:686)
  at android.view.LayoutInflater.inflate (LayoutInflater.java:538)
  at ua.at.tsvetkov.weather.databinding.ActivityMainBinding.inflate (ActivityMainBinding.java:53)
  at ua.at.tsvetkov.weather.databinding.ActivityMainBinding.inflate (ActivityMainBinding.java:47)
  at ua.at.tsvetkov.weather.ui.main.MainActivity.onCreate (MainActivity.kt:95)
  at android.app.Activity.performCreate (Activity.java:8050)
  at android.app.Activity.performCreate (Activity.java:8030)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1329)
  at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate (MonitoringInstrumentation.java:2)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3608)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3792)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:103)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2210)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loopOnce (Looper.java:201)
  at android.os.Looper.loop (Looper.java:288)
  at android.app.ActivityThread.main (ActivityThread.java:7839)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:548)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1003)

All libraries were updated to the newest. I tried both the empty proguard-rules.pro file and different options. This latest:

# Kotlinx
-keep interface kotlinx.coroutines.CoroutineExceptionHandler { *; }
-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory

-keep class kotlinx.coroutines.** { *; }
-keepclassmembers class kotlinx.coroutines.* {
    <fields>;
    <init>();
    <methods>;
}
-keep class dagger.hilt.** { *; }
-keepclassmembers class dagger.hilt.* {
    <fields>;
    <init>();
    <methods>;
}

-dontwarn com.google.errorprone.annotations.**
-keepnames @dagger.hilt.android.lifecycle.HiltViewModel class * extends androidx.lifecycle.ViewModel

-keep class kotlinx.coroutines.internal.MainDispatcherFactory { *; }
-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler { *; }
-keep class kotlinx.coroutines.CoroutineExceptionHandler { *; }
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory { *; }
-keep class kotlin.Result { *; }
-keepclassmembernames class kotlinx.** {
    volatile <fields>;
}

build.gradle.kts

@file:Suppress("UnstableApiUsage")

import java.io.FileInputStream
import java.io.InputStreamReader
import java.util.Properties

plugins {
    id("com.android.application")
    id("kotlin-android")
    id("kotlin-parcelize")
    id("kotlin-kapt")
    id("com.google.dagger.hilt.android")
    id("com.google.gms.google-services")
    id("androidx.navigation.safeargs.kotlin")
    id("com.google.devtools.ksp")
    id("com.google.firebase.crashlytics")
    id("androidx.room") version "2.6.1"
}

val skipCommitsCount = 0 // add to verCode if need to align commits count
val verCode = providers.exec {
    commandLine("git", "rev-list", "--count", "HEAD")
}.standardOutput.asText.get().trim().toInt()
val gitSha = providers.exec {
    commandLine("git", "rev-parse", "--short", "HEAD")
}.standardOutput.asText.get().trim()

val verMajor = 1
val verMinor = 0
val verPatch = 0
val verName = "${verMajor}.${verMinor}.${verPatch}.${verCode}"

val getWeatherApiKey = {
    val properties = Properties()
    properties.load(project.rootProject.file("local.properties").reader())
    properties.getProperty("weather_api_key", "")
}

fun getLocalProperty(key: String, file: String = "local.properties"): Any {
    val properties = Properties()
    val localProperties = File(file)
    if (localProperties.isFile) {
        InputStreamReader(FileInputStream(localProperties), Charsets.UTF_8).use { reader ->
            properties.load(reader)
        }
    } else error("File from not found")

    return properties.getProperty(key)
}

android {
    namespace = "ua.at.tsvetkov.weather"
    compileSdk = 34

    defaultConfig {
        applicationId = "ua.at.tsvetkov.weather"
        minSdk = 26
        targetSdk = 34
        versionCode = verCode
        versionName = verName
        buildConfigField("String", "GIT_SHA", "\"${gitSha}\"")
        buildConfigField("String", "WEATHER_API_KEY", "\"${getLocalProperty("weather_api_key")}\"")
        buildConfigField("String", "WEATHER_API_HOST", "\"https://api.weatherapi.com/v1/\"")
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        javaCompileOptions {
            annotationProcessorOptions {
                argument("room.schemaLocation", "$projectDir/schemas")
            }
        }
        kapt {
            arguments {
                arg("room.schemaLocation", "$projectDir/schemas")
            }
        }
        resourceConfigurations.addAll(listOf("en", "ru", "uk"))
    }

    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            isDebuggable = false
            isShrinkResources = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        viewBinding = true
        dataBinding = true
        buildConfig = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.2.0"
    }
    packaging {
        resources {
            pickFirsts += "META-INF/LICENSE"
            pickFirsts += "META-INF/INDEX.LIST"
            pickFirsts += "META-INF/DEPENDENCIES"
            pickFirsts += "META-INF/*.properties"
            pickFirsts += "META-INF/AL2.0"
            pickFirsts += "META-INF/LGPL2.1"
            pickFirsts += "git.properties"
        }
    }
}

kapt {
    correctErrorTypes = true // Allow references to generated code
}

room {
    schemaDirectory(path = "$projectDir/schemas")
}

hilt {
    enableAggregatingTask = true
}

dependencies {

    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
    implementation(files("libs/tao-core-1.5.0.aar"))
    implementation(files("libs/tao-log-2.1.0.aar"))

    implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.5.0")
    implementation("com.google.firebase:firebase-crashlytics:18.6.2")
    implementation("com.google.firebase:firebase-analytics:21.5.1")

    val navVersion = "2.7.7"
    val liveVersion = "2.7.0"
    implementation("androidx.core:core-ktx:1.12.0")
    implementation("androidx.activity:activity-ktx:1.8.2")
    implementation("androidx.fragment:fragment-ktx:1.6.2")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:$liveVersion")
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$liveVersion")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:$liveVersion")
    implementation("androidx.lifecycle:lifecycle-livedata-core-ktx:$liveVersion")
    implementation("androidx.navigation:navigation-fragment-ktx:$navVersion")
    implementation("androidx.navigation:navigation-ui-ktx:$navVersion")
    implementation("androidx.legacy:legacy-support-v4:1.0.0")
    implementation("androidx.core:core-splashscreen:1.0.1")
    implementation("androidx.annotation:annotation:1.7.1")
    implementation("androidx.databinding:databinding-runtime:8.2.2")
    implementation("androidx.preference:preference-ktx:1.2.1")
    implementation("androidx.cardview:cardview:1.0.0")
    implementation("androidx.recyclerview:recyclerview:1.3.2")
    implementation("androidx.recyclerview:recyclerview-selection:1.1.0")
    implementation("androidx.drawerlayout:drawerlayout:1.2.0")

    // Google
    implementation("com.google.android.material:material:1.11.0")
    implementation("com.google.android.gms:play-services-auth:21.0.0")
    implementation("com.google.android.gms:play-services-location:21.1.0")
    implementation("com.google.android.play:app-update-ktx:2.1.0")
//    implementation("com.google.android.gms:play-services-ads:22.6.0")

    // Firebase
    val firebaseVersion = "8.0.2"
    implementation(platform("com.google.firebase:firebase-bom:32.7.2"))
    implementation("com.google.firebase:firebase-analytics-ktx:21.5.1")
    // FirebaseUI for Firebase Realtime Database
    implementation("com.firebaseui:firebase-ui-database:$firebaseVersion")
    // FirebaseUI for Cloud Fire store
    implementation("com.firebaseui:firebase-ui-firestore:$firebaseVersion")
    // FirebaseUI for Firebase Auth
    implementation("com.firebaseui:firebase-ui-auth:$firebaseVersion")
    // FirebaseUI for Cloud Storage
    implementation("com.firebaseui:firebase-ui-storage:$firebaseVersion")

    //Hilt
    val hiltVersion ="1.2.0"
    implementation("com.google.dagger:hilt-android:2.50")
    kapt("com.google.dagger:hilt-compiler:2.50")
    implementation("androidx.hilt:hilt-navigation-fragment:$hiltVersion")
    implementation("androidx.hilt:hilt-work:$hiltVersion")
    implementation("androidx.hilt:hilt-common:$hiltVersion")
    kapt("androidx.hilt:hilt-compiler:$hiltVersion")

    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0")

    val workVersion = "2.9.0"
    implementation("androidx.work:work-runtime-ktx:$workVersion")
    implementation("androidx.work:work-gcm:$workVersion")

    //Retrofit
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")

    // Room
    val roomVersion = "2.6.1"
    implementation("androidx.room:room-runtime:$roomVersion")
    annotationProcessor("androidx.room:room-compiler:$roomVersion")
    // To use Kotlin annotation processing tool (kapt)
    ksp("androidx.room:room-compiler:$roomVersion")
    // Kotlin Extensions and Coroutines support for Room
    implementation("androidx.room:room-ktx:$roomVersion")

    // Data
    implementation("de.siegmar:fastcsv:2.2.2") 
    implementation("androidx.datastore:datastore-preferences:1.0.0")

    // Glide
    implementation("com.github.bumptech.glide:glide:4.16.0")
    ksp("com.github.bumptech.glide:compiler:4.16.0")

    // Lottie
    val lottieVersion = "6.3.0"
    implementation("com.airbnb.android:lottie:$lottieVersion")

    // Circle ImageView
    implementation("com.mikhaellopez:circularimageview:4.3.1")

    //ml-kit selfie segmentation
    implementation("com.google.mlkit:segmentation-selfie:16.0.0-beta4")
    implementation("com.google.android.gms:play-services-mlkit-subject-segmentation:16.0.0-beta1")
    implementation("com.google.android.gms:play-services-base:18.3.0")

    val cameraxVersion = "1.3.1"
    implementation("androidx.camera:camera-core:${cameraxVersion}")
    implementation("androidx.camera:camera-camera2:${cameraxVersion}")
    implementation("androidx.camera:camera-lifecycle:${cameraxVersion}")
    implementation("androidx.camera:camera-video:${cameraxVersion}")
    implementation("androidx.camera:camera-view:${cameraxVersion}")
    implementation("androidx.camera:camera-extensions:${cameraxVersion}")

    // Blur
    implementation("jp.wasabeef:glide-transformations:4.3.0")
    implementation("jp.wasabeef:blurry:4.0.1")

    // LeakCanary
//    debugImplementation ("com.squareup.leakcanary:leakcanary-android:3.0-alpha-1")

    // Testing
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

Any suggestions on how to solve this?

03.14.24 Upd. The error appeared again without any changes on my part.

2

There are 2 answers

4
Always_a_learner On BEST ANSWER

This issue has been fixed by the Firebase team. Prelaunch report should run fine now. See the chat thread here : https://firebase-community.slack.com/archives/C1MTSQ5QT/p1708536667082259

0
LordTAO On

The issue was solved.

I'm not sure which answer is correct. I actually found two versions of coroutine libraries. I have 1.8.0 installed, but there is also version 1.5.0. Most likely there is an internal dependency somewhere. I made corrections - added forcing the required version in the root gradle file.

Now I can’t say which decision is correct since it coincided with a fix from the Firebase team. In any case, I am adding this possible solution.

build.gradle.kts

buildscript {
    dependencies {
        classpath("com.android.tools.build:gradle:8.2.2")
        classpath("com.google.gms:google-services:4.4.1")
        classpath("com.google.firebase:firebase-crashlytics-gradle:2.9.9")
    }
}

plugins {
    id("com.android.application") version "8.2.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.22" apply false
    id("com.google.dagger.hilt.android") version "2.48.1" apply false
    id("com.google.gms.google-services") version "4.4.0" apply false
    id("androidx.navigation.safeargs.kotlin") version "2.7.5" apply false
    id("com.google.devtools.ksp") version "1.9.22-1.0.16" apply false
}

val coroutinesVersion = "1.8.0" // check version in app gradle file!

configurations.all {
    resolutionStrategy {
        force("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
        force("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$coroutinesVersion")
        force("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion")
        force("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion")
    }
}