support - proguard android
NoClassDefFoundError por debajo de SDK 21 (3)
Acabo de experimentar un error incómodo en mi aplicación.
En mi Nexus 5/7, con Android 5.0.1 / 5.0.2, todo funciona bien. Sin embargo, si intento ejecutar exactamente el mismo código 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 support.v7 como jar, pero no hace ninguna diferencia. Pero como funciona en dispositivos Lollipop, esto no tendría sentido de todos modos.
¿Podría ser que hay algún problema relacionado con el cambio Dalvik / Art? O quizás 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 estar por debajo del límite del método de 65k. Después de eso, la aplicación se ejecutó en 4.4.4 y 4.3 dispositivos. Todo lo que hice para habilitar el soporte multidex fue configurar
multiDexEnabled true
en la sección defaultConfig y añadiendo
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?
Hay tres formas en que esto va a funcionar.
- Como @FireZenk señaló, puede declarar esta clase como la aplicación en su AndroidManifest.xml .
<application android:name="android.support.multidex.MultiDexApplication">
Y, de hecho, con la versión 0.14.0 del plugin android grado y la versión 21.1.0 de las herramientas de compilación cuando se especifica multiDexEnabled true en defaultConfig, ProductFlavor o BuildTypethen, automáticamente incluye la dependencia de com.android.support:multidex:1.0.0. Puede verificarlo con la tarea de AndroidDependencie o ejecutar ./gradlew -q comando android: dependencies (android: es mi módulo de android). Así que no hay necesidad de agregar explícitamente el
compile ''com.android.support:multidex:1.0.0''
Si ha ampliado la clase de aplicación en su aplicación:
- Defina que su aplicación extiende la clase MultiDexApplication, como:
public class MyApplication extends MultiDexApplication {
...
}
o como @ user2700475 publicado
- 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 poner todo esto junto.
Resolví el problema agregando 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 a 5.
Si no tiene / usa la clase de Aplicación, puede poner esto:
android:name="android.support.multidex.MultiDexApplication"
En su etiqueta en AndroidManifest.xml
Si ya ha implementado una clase de Aplicación, las respuestas de @ user2700475 + @sirvon son su mejor opción.
Obviamente, también es necesario agregar la dependencia de Gradle:
compile ''com.android.support:multidex:1.0.0''
Más información sobre el problema de los métodos de 65k: https://developer.android.com/tools/building/multidex.html