web-dev-qa-db-fra.com

NoClassDefFoundError sous le SDK 21

Je viens de rencontrer un bug gênant dans mon application.

Sur mon Nexus 5/7, exécutant Android 5.0.1/5.0.2, tout fonctionne très bien. Cependant, si j'essaie d'exécuter exactement le même code sur un appareil avec une version antérieure (testé 4.4 .4 et 4.3) J'obtiens l'erreur suivante:

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

J'ai déjà essayé d'ajouter la bibliothèque support.v7 comme pot, mais cela ne fait aucune différence. Mais comme cela fonctionne sur les appareils Lollipop, cela n'aurait aucun sens de toute façon.

Se pourrait-il qu'il y ait un problème concernant le changement Dalvik/Art? Ou peut-être le fait que j'ai dû utiliser com.Android.support:multidex:1.0.0 car c'est une application assez grande.

pdate: J'ai essayé de supprimer certaines dépendances pour passer sous la limite de la méthode 65k. Après cela, l'application a fonctionné sur les appareils 4.4.4 et 4.3. Tout ce que j'ai fait pour activer la prise en charge multidex était de définir

multiDexEnabled true

dans la section defaultConfig et en ajoutant

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

ci-dessous dans la section des dépendances de mon build.gradle.

Une idée pourquoi cela provoque ces problèmes sur les anciennes versions Android?

23
user2700475

J'ai résolu le problème en l'ajoutant à ma classe d'application.

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

Semble être nécessaire pour les versions Android antérieures 5.

43
user2700475

Il y a trois façons de procéder.

  1. Comme l'a noté @FireZenk, vous pouvez déclarer cette classe comme application dans votre AndroidManifest.xml.
<application Android:name="Android.support.multidex.MultiDexApplication">

Et en fait avec le Android plugin de version version 0.14.0 et outils de construction version 21.1.0 lorsque vous spécifiez le multiDexEnabled true dans defaultConfig, ProductFlavor ou BuildTypethen, il inclut automatiquement la dépendance au com.Android .support: multidex: 1.0.0. Vous pouvez vérifier cela avec la tâche androidDependencie ou vous exécutez ./gradlew -q Android: commande de dépendances (Android: is my Android module). pas besoin d'ajouter explicitement le

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

Si vous avez étendu la classe Application dans votre application:

  1. Définissez que votre application étend la classe MultiDexApplication, comme:
public class MyApplication extends MultiDexApplication {
    ...
}

ou comme @ user2700475 posté

  1. Demandez à votre application de remplacer attachBaseContext:
public class MyApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);}
}

Avec l'aide des réponses précédentes, je parviens à trouver la solution à ce problème. Je veux juste mettre tout cela ensemble.

12
RenatoIvancic

Si vous n'avez pas/utilisez la classe Application, vous pouvez mettre ceci:

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

Dans votre balise sur AndroidManifest.xml

Si vous avez déjà implémenté une classe Application, les réponses @ user2700475 + @sirvon sont votre meilleur choix.

Évidemment, vous devez également ajouter la dépendance Gradle:

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

Plus d'informations sur le problème des méthodes 65k: https://developer.Android.com/tools/building/multidex.html

5
FireZenk