Android Kotlin: java.lang.NoClassDefFoundError: Resolución fallida de: <KotlinObject>

Cada segundo recorrido de nuestra aplicación android, tenemos un accidente que dice

java.lang.NoClassDefFoundError: Failed resolution of: Lin/blahapp/xxx/BlahUtil 

BlahUtil es un objeto kotlin con anotaciones @JvmStatic. Llamo a estos métodos estáticos del resto de la aplicación android (Todo en java).

Utilizamos multidex 1.0.1.

Estoy en android studio 2.1.2, usando JDK 7.

Configuraciones relevantes de gradle:

 compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 16 targetSdkVersion 23 } dexOptions { incremental true dexInProcess true javaMaxHeapSize "10g" preDexLibraries true } buildscript { ext.kotlin_version = '1.0.3' dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'kotlin-android' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" } 

Rastro:

 at in.blahapp.xxx.OurActivity at android.app.Activity.performCreate(Activity.java:6251) at ndroid.app.Instrumentation.callActivityOnCreate at android.app.ActivityThread.performLaunchActivity at android.app.ActivityThread.handleLaunchActivity at android.app.ActivityThread.-wrap11 at android.app.ActivityThread$H.handleMessage at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.ClassNotFoundException: Didn't find class "in.blahapp.xxx.BlahUtil" on path: DexPathList[[dex file .... 

Salida logcat

Debe desactivar la función 'Instant Run'. Android Studio -> Preferencias -> Creación, ejecución, implementación -> Ejecución instantánea. Apaga todo.

java.lang.ClassNotFoundException es una divertida excepción para depurar. Notablemente porque puede ocurrir de cualquier número de razones. En este caso, debido a la cada otro comportamiento de lanzamiento, lo más probable es que ocurra debido a ser incapaz de inicializar la clase. Si tiene recursos que carga de forma estática que son singleton en la naturaleza, abrir archivos o cualquier recurso "exclusivo" en la creación de clase en la JVM, cuando se va a inicializar la segunda vez, ya que la clase ya está cargada en la JVM , Independientemente de si ha reiniciado o no la aplicación. Cuando se produce la segunda instancia de carga de la clase, se produce un choque con la existente y ambas instancias se eliminan de la JVM, lo que hace que la tercera ejecución se ejecute correctamente.

Tl; dr Yo tendría que ver su código para ser positivo, pero es más probable (especialmente con anotaciones @JvmStatic ), que está fallando en la segunda carga estática de la clase. Cuando falla, todas las instancias se eliminan de la JVM y el proceso se repite.

La única solución que he encontrado es establecer android.compileOptions.incremental = false

Vea este número para más detalles.

  • Android Studio 3.0 Los cambios de Kotlin no se reflejan en la compilación
  • StackOverflowError utilizando Singleton en Kotlin
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.