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

Cada segundo ciclo de nuestra aplicación de Android, obtenemos un locking que dice

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

BlahUtil es un object kotlin con annotations @JvmStatic en él. Llamo a estos methods estáticos del rest de la aplicación de Android (Todo en Java).

Usamos multidex 1.0.1.

Estoy en android studio 2.1.2, usando JDK 7.

Configuraciones gradle relevantes:

 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 de logcat

Debe desactivar 'Ejecución instantánea'. Android Studio -> Preferences -> Build, Execution, Deployment -> Instant Run. Apaga todo.

java.lang.ClassNotFoundException es una divertida exception a la debugging. Notablemente porque puede ocurrir por varias razones. En este caso, debido al comportamiento de cada otro lanzamiento, es muy probable que ocurra debido a que no se puede inicializar la class. Si tiene resources que carga estáticamente que son de naturaleza única, abre files o cualquier recurso "exclusivo" en la creación de class en la JVM, cuando va a inicializarlo la segunda vez, ya que la class ya está cargada en la JVM , independientemente de si reinició la aplicación o no. Cuando se produce la segunda instancia de carga de la class, choca con la existente y ambas instancias se eliminan de la JVM, lo que hace que la tercera ejecución se ejecute correctamente.

tl; dr Tendría que ver que tu código sea positivo, pero es más probable (especialmente con @JvmStatic annotations de @JvmStatic ) que estés fallando en la segunda carga estática de la class. Cuando falla, todas las instancias se eliminan de la JVM y el process se repite.

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

Ver este problema para más detalles.

  • Kotlinx inyecta vista desde el layout incorrecto
  • OnClick y TextView en Android Studio 3
  • registerReceiver () muestra error por método sobrecargado
  • La propiedad en la interfaz no puede tener un campo de respaldo
  • ¿Qué significa la advertencia «Usar properties de los packages de variante de compilation»?
  • ¿Por qué la configuration de OnClickListener funciona una vez?
  • Obteniendo exception de retrofit El tipo de retorno de método no debe include una variable de tipo o comodín en kotlin
  • Compara una vista de text con una string en Kotlin
  • ¿Cuál es la forma correcta de declarar el tipo de variable en Android con Kotlin?
  • Botones de acceso del layout inflados programáticamente dentro de otro layout
  • Prueba unitaria de la function de extensión de Kotlin en las classs de Android SDK