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 bash ejecutar exactamente el mismo código en un dispositivo con una versión anterior (probado 4.4.4 y 4.3) me aparece 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. 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 support.v7 como jar, pero no hace diferencia. Pero dado que funciona en dispositivos Lollipop, esto no tendría sentido de todos modos.

¿Podría ser que hay algún problema con respecto al cambio de Dalvik / Art? 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: Intenté eliminar algunas dependencias para obtener el límite del método 65k. Después de eso, la aplicación se ejecutó en dispositivos 4.4.4 y 4.3. Todo lo que hice para habilitar la compatibilidad multidex era establecer

 multiDexEnabled true 

en la sección defaultConfig y agregando

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

a continuación en la sección de dependencias de mi build.gradle.

¿Alguna idea de por qué esto causa estos problemas en las versiones anteriores de Android?

Resolví el problema al agregar 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 anteriores 5.

Hay tres formas en que esto va a funcionar.

  1. Como @FireZenk señaló, puede declarar esta clase como la aplicación en su AndroidManifest.xml .
  

Y en realidad con el complemento de grado de Android versión 0.14.0 y las herramientas de comstackción versión 21.1.0 cuando especifica el valor true de multiDexEnabled en DefaultConfig, ProductFlavor o BuildTypeentonces incluye automáticamente la dependencia de com.android.support:multidex:1.0.0. Puede verificarlo con la tarea androidDependencie o ejecutar ./gradlew -q android: comando de dependencias (android: es mi módulo android). Por lo tanto, no es necesario agregar explícitamente

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

Si tiene una clase de aplicación extendida 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 anule 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. Solo quiero unir todo esto.

Si no tiene / usa 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 su mejor opción.

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

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

Más información sobre el problema de los métodos 65k: https://developer.android.com/tools/building/multidex.html