Cet article a pour objectif de vous éclairer un peu plus sur le problème du MultiDex sur Android.

Vous êtes confronté au problème de MultiDex lorsque vous compilez votre APK et que vous obtenez l’erreur suivante :
“Too many field references: 68309; max is 65536.”

Quelques explications

Un APK contient des fichiers DEX (Dalvik Executable / .dex). Ces fichiers contiennent du bytecode, le language interprété par la machine virtuelle d’Android.
Les fichiers DEX ont un nombre un nombre maximum de 65 536 méthodes.
La machine virtuelle d’Android est historiquement Dalvik puis à partir de Android 5.0 (Marshmallow) elle est remplacé par ART (Android Runtime).
Dalvik lit directement les fichiers DEX tandis que ART les compilent en un seul fichier .oat.

Par défaut un APK est limité à un seul fichier DEX par application. Si votre application contient plus de 65 536 méthodes alors plusieurs fichiers DEX sont nécessaires et vous devez configurer le MultiDex.

De nos jours, nous rencontrons cette erreur fréquemment à cause du grand nombre de biliothèques que nous utilisons dans nos projets Android.

Cependant corriger le problème de MultiDex induit quelques effets de bord, le principal est que l’application est plus lente sur les versions antérieures à Android 5.0.
C’est pour cela que qu’Android recommande de faire le ménage dans les bibliothèques et d’utiliser ProGuard avant de configurer le MultiDex.

Mettre en place le MultiDex

Si votre application contient plus de 65 536 méthodes alors une configuration est nécessaire. Il faut ajouter multiDexEnabled à votre fichier app/build.gradle :

android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}

C’est tout ce que vous aurez à faire si votre app est destinée à des versions supérieures ou égale à Android 5.0.

En revanche si votre app est destinée à des versions antérieures à Android 5.0 alors il faut faire 2 choses :
1/ Ajouter la bibliothèque de support de MultiDex
2/ Utiliser la classe MultiDexApplication

1/ Ajouter la bibliothèque de support du MultiDex dans app/build.gradle

dependencies {
compile 'com.android.support:multidex:1.0.3'
}

2/ Utiliser la classe MultiDexApplication

Si vous n’avez pas redéfini la classe Application pour votre app, il vous suffira d’utiliser la classe MultiDexApplication dans le fichier Manifest de votre projet :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp">
<application android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>

Si au contraire vous avez déjà redéfini la classe Application dans le Manifest, vous pouvez hériter de la classe ainsi :

public class MyApplication extends MultiDexApplication { ... }

Et si votre classe Application hérite déjà d’une autre classe, dans ce cas vous devez redéfinir la méthode attachBaseContext() :

public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}

Conclusion

Malgré ces effets indésirables, je vous conseille d’installer le MultiDex, cela vous évitera de surveiller votre nombre de méthode à chaque fois que vous installer une nouvelle bibliothèque et vous n’aurez plus besoin d’y penser.
Les versions d’Android qui utilisent Dalvik et qui connaissent des problèmes de ralentissement représente aujourd’hui environ 10% de l’activité sur Google Play Store, ce n’est à mon sens plus assez suffisant pour sans soucier.

Les grandes entreprises comme par exemple Uber, Facebook, Twitter etc… ont adopté une autre stratégie. Elles déploient une application dite “lite” qui sont plus légères en fonctionnalités et dont la principale utilité est de mieux fonctionner sur les anciens appareils.

Sources :

https://developer.android.com/studio/build/multidex

https://stackoverflow.com/a/38023900

Spread the love