NoClassDefFoundError debajo de SDK 21

Acabo de experimentar un error incómodo en mi aplicación.

En mi Nexus 5/7, ejecutando android 5.0.1 / 5.0.2, todo funciona bien. Sin embargo, si intento ejecutar el mismo código exacto en un dispositivo con una versión anterior (probado 4.4.4 y 4.3) obtengo el siguiente error:

03-13 13:49:41.140 21714-21714/? E/dalvikvm﹕ Could not find class 'com.default.package.application.model.Appcomponent', referenced from method com.default.package.application.controller.DatabaseHandler.getScreenComponents 03-13 13:49:41.140 21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$1', referenced from method android.support.v7.app.ActionBarActivityDelegate.<init> 03-13 13:49:41.140 21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegateHC', referenced from method android.support.v7.app.ActionBarActivityDelegate.createDelegate 03-13 13:49:41.140 21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegateBase', referenced from method android.support.v7.app.ActionBarActivityDelegate.createDelegate 03-13 13:49:41.150 21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method android.support.v7.app.ActionBarActivityDelegate.getDrawerToggleDelegate 03-13 13:49:41.150 21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.internal.view.SupportMenuInflater', referenced from method android.support.v7.app.ActionBarActivityDelegate.getMenuInflater 03-13 13:49:41.150 21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method android.support.v7.app.ActionBarActivityDelegate.getV7DrawerToggleDelegate 03-13 13:49:41.150 21714-21714/? E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.default.package, PID: 21714 java.lang.NoClassDefFoundError: android.support.v7.app.ActionBarActivityDelegateHC 

Ya he intentado agregar la biblioteca de support.v7 como jar, pero no hace ninguna diferencia. Pero ya que funciona en dispositivos Lollipop esto no tendría sentido de todos modos.

¿Podría ser que hay alguna cuestión relativa al Dalvik / cambio de arte? O tal vez el hecho de que tuve que usar com.android.support:multidex:1.0.0 ya que es una aplicación bastante grande.

Actualización: He intentado eliminar algunas dependencias para obtener bajo el límite de método de 65k. Después de eso, la aplicación se ejecutó en los dispositivos 4.4.4 y 4.3. Todo lo que hice para habilitar el soporte multidex fue establecer

 multiDexEnabled true 

En la sección defaultConfig y agregando

 compile 'com.android.support:multidex:1.0.0' 

Abajo en la sección de dependencias de mi build.gradle.

¿Alguna idea de por qué esto causa estos problemas en las versiones android más antiguas?

3 Solutions collect form web for “NoClassDefFoundError debajo de SDK 21”

Resolví el problema añadiendo esto a mi clase de aplicación.

 @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } 

Parece ser necesario para las versiones de Android antes de 5.

Hay tres formas en que esto va a funcionar.

  1. Como @FireZenk señaló que puede declarar esta clase como la aplicación en su AndroidManifest.xml .
 <application android:name="android.support.multidex.MultiDexApplication"> 

Y en realidad con la versión de plugin de nivel androide 0.14.0 y herramientas de compilación versión 21.1.0 cuando se especifica el multiDexEnabled true en el defaultConfig, ProductFlavor, o BuildTypethen automáticamente incluye la dependencia de la com.android.support:multidex:1.0.0. Puedes comprobarlo con la tarea androidDependencie o ejecutar ./gradlew -q android: comando dependencias (android: es mi módulo android). Así que no hay necesidad de agregar explícitamente el

 compile 'com.android.support:multidex:1.0.0' 

Si ha extendido la clase de aplicación en su aplicación:

  1. Defina que su aplicación extiende la clase MultiDexApplication, como:
 public class MyApplication extends MultiDexApplication { ... } 

O como @ user2700475 publicado

  1. Haga que su aplicación reemplace attachBaseContext:
 public class MyApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this);} } 

Con la ayuda de respuestas anteriores logro encontrar la solución a este problema. Sólo quiero juntar todo esto.

Si no tiene / utiliza la clase de aplicación, puede poner esto:

 android:name="android.support.multidex.MultiDexApplication" 

En tu etiqueta en AndroidManifest.xml

Si ya ha implementado una clase de aplicación, las respuestas @ user2700475 + @sirvon son la mejor opción.

También obviamente, usted necesita agregar la dependencia de Gradle:

 compile 'com.android.support:multidex:1.0.0' 

Más información sobre el problema 65k methods: https://developer.android.com/tools/building/multidex.html

  • Android - Google Maps API v2 - NoClassDefFoundError
  • Twitter Fabric + MultiDex causa NoClassDefFoundError
  • La aplicación se bloquea al hacer una nueva intención. No Error Clase Def Encontrado
  • Desplazamiento Actualizar diseño en Android Fragment
  • NoClassDefFoundError: android.app.ANRManagerProxy
  • java.lang.NoClassDefFoundError en Android con GoogleAccountCredential.newChooseAccountIntent ()
  • Añadiendo el tiempo de Joda
  • NoClassDefFoundError al intentar ejecutar pruebas unitarias en Android Studio
  • Problemas de inicialización de la clase cargando java.util.logging.LogManager en Android Dalvik VM
  • Gson NoClassDefFoundError después de que las herramientas ADT y SDK se actualicen a v17
  • Mejor registrador de Android para iniciar sesión en el archivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.