MultiDex – Dépasser la limite des 65536 méthodes

multidex_long

Le saviez vous, le nombre de méthodes est limité à 65536 sous android ? Lorsque nous travaillons sur un gros projet incluant plusieurs librairies, cette limite est facilement atteinte, voyons ensemble comment la dépasser !

En effet lorsque nous imprtons de grosses librairies, tels que les Google Play Services, nous dépassons facilement les 65536 méthodes, ce qui empêche la compilation de notre projet, et affiche ce message d’erreur :

trouble writing output: Too many method references: 70820; max is 65536.
You may try using --multi-dex option.

Mais ce n’est pas très claire et on ne sait pas où placer leur –multi-dex

Explication

En Java, lorsque notre compilateur transforme notre code, il créé des fichiers .class, qui sont lisibles et exécutables par la machine virtuelle. Les fichiers .class sont ensuite joins dans une même archive (.jar et .war) et peuvent se faire référence entre elles. Lors de l’éxécution d’un .jar, cet exécutable peux charger d’autres fichiers .jar placés dans le même repertoire si il a besoin d’utiliser leurs fonctionnalités.

Sous Android le processus est un peu différent, par soucis d’optimisation mémoire, le compilateur rassemble tous les .class et place tout leur contenu dans un seul et même fichier .dex, qui possède toutes les références nécessaires en interne et encapsule toutes les libraires utilisées, contrairement à Java. C’est justement ce fichier .dex qui est limité en nombre de méthodes embarquées.

Solution

La solution est simple, nous devons passer notre application en MultiDex Application, ce qui se fait en plusieurs étapes :

 

build.gradle

Gradle possède une option nommée multiDexEnabled qui une fois activée, permet d’autoriser la compilation MultiDex d’une application

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...

        // Ajouter le support du multidex
        multiDexEnabled true
    }
    ...
}

Cette option est accessible à Android Lolipop, mais est aussi fournie dans une librairie de support afin d’être utilisable par les versions antérieures :

dependencies {
  //importer la librairie de support multidex
  compile 'com.android.support:multidex:1.0.0'
}

 

AndroidManifest.xml

Il faut ensuite que notre Application (objet principal d’une application Android, créé par défaut, qui va orchestrer nos Activity) soit une MultiDexApplication, pour se faire, deux options s’offrent à vous :

1. Utiliser une MultiDexApplication

Si vous n’avez pas d’objet Application dans votre code, ajoutez les lignes suivantes dans votre AndroidManifest.xml

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

2. Etendre MultiDexApplication

Si vous possédez déja un objet Application il suffit de le faire étendre MultiDexApplication comme ceci :

public class MonApplication extends MultiDexApplication{
    ...

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

    ...
}

Et voila ! vous pouvez enfin dépasser la limite, à vous de jouer !

Lien officiel de la documentation Android : MultiDex Application

Un commentaire sur “MultiDex – Dépasser la limite des 65536 méthodes

  1. Voilà donc un bon article, bien passionnant. J’ai beaucoup aimé et n’hésiterai pas à le recommander, c’est pas mal du tout ! Elsa Mondriet

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *