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?
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.
Il y a trois façons de procéder.
<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:
public class MyApplication extends MultiDexApplication {
...
}
ou comme @ user2700475 posté
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.
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