Comment activer le multidexing avec la nouvelle bibliothèque de support Android Multidex

142

Je souhaite utiliser la nouvelle bibliothèque de support Multidex pour briser la limite de méthode pour l'une de mes applications.

Avec Android Lollipop, Google a introduit une bibliothèque de support multidex qui facilite le multidex.

Quelles étapes sont nécessaires pour utiliser cette bibliothèque et pour créer mon application avec la prise en charge du multidex?

Janusz
la source
bibliothèque tierce de support multidex à votre application
Keshav Gera

Réponses:

293

Éditer:

Android 5.0 (niveau d'API 21) et supérieur utilise ART qui prend en charge le multidexing. Par conséquent, si vous avez minSdkVersion21 ans ou plus, la bibliothèque de prise en charge multidex n'est pas nécessaire.


Modifiez votre build.gradle:

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

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

Si vous exécutez des tests unitaires, vous souhaiterez l'inclure dans votre Applicationclasse:

public class YouApplication extends Application {

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

}

Ou faites simplement applicationprolonger votre classeMultiDexApplication

public class Application extends MultiDexApplication {

}

Pour plus d'informations, c'est un bon guide.

Chad Bingham
la source
2
Si vous utilisez encore les nouveaux outils de builds, c'est certainement la voie à suivre.
Janusz
1
@ jem88 Vous avez mis à jour votre gradle à 1.0 ?? Vous devriez être sur 2.2. + (Jetez un oeil dans votre gradle-wrapper.properties) Les points clés: 1 votre buildToolsVersion doit être 21.1.1 ou supérieur. 2 ajoutez multiDexEnabled trueà votre defaultConfig de votre build.gradle (notez qu'il n'y a pas a =) 3 ajoutez le'com.android.support:multidex:1.0.0'
Chad Bingham
3
Et si nous n'utilisons pas de classe d'application? L'ajout android:name="android.support.multidex.MultiDexApplication"au applicationtag est-il AndroidManifest.xmlsuffisant?
Buddy
1
compile 'com.android.support:multidex:1.0.1' n'est pas nécessaire dans 23
Naveed Ahmad
3
@NaveedAhmad, selon le développeur de Google Documents: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy
44

Les étapes suivantes sont nécessaires pour démarrer le multi dexing:

Ajoutez android-support-multidex.jar à votre projet. Le fichier jar se trouve dans votre dossier Android SDK / sdk / extras / android / support / multidex / library / libs

Maintenant, vous laissez la classe d'application de vos applications étendre MultiDexApplication

public class MyApplication extends MultiDexApplication

ou vous remplacez attachBaseContext comme ceci:

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

J'ai utilisé l'approche de remplacement car cela ne gêne pas la hiérarchie de classes de votre classe d'application.

Votre application est maintenant prête à utiliser multi dex. La prochaine étape consiste à convaincre gradle de créer un apk multi dexed. L'équipe des outils de build s'efforce de rendre cela plus facile, mais pour le moment, vous devez ajouter ce qui suit à la partie Android de vos applications build.gradle

   dexOptions {
      preDexLibraries = false
   }

Et ce qui suit à la partie générale de vos applications build.gradle

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

Plus d'informations peuvent être trouvées sur le blog d'Alex Lipovs .

Janusz
la source
9
comment puis-je utiliser cela sans gradle?
lacas
3
@Janusz est-il possible d'utiliser l'option multidex sans gradle?
Devrim
1
Je ne pense pas que cela soit possible sans gradle.
Janusz
5
Qu'est-ce que le correctif Eclipse Ant, pas gradle?
portfoliobuilder
Mon projet ne crée pas de fichier gradle, j'en ai créé un et j'ai suivi vos étapes, mais cela ne fonctionne pas pour moi
BaDo
16

SIMPLEMENT, pour activer le multidex, vous devez ...

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

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

    // Enabling multidex support.
    multiDexEnabled true
}
...
}

dependencies {
implementation 'com.android.support:multidex:1.0.0'
}

vous devez également modifier votre fichier manifeste. Dans votre manifeste, ajoutez la classe MultiDexApplication de la bibliothèque de prise en charge multidex à l'élément d'application comme ceci

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.multidex.myapplication">
   <application
       ...
       android:name="android.support.multidex.MultiDexApplication">
       ...
   </application>
</manifest>
smoothumut
la source
1
Cela n'activera pas le multi dexing. Il vous manque toujours la classe d'application.
Chad Bingham
1
Merci pour le commentaire, cela a fonctionné pour mon cas. Voici le lien que j'ai obtenu de developer.android.com/tools/building/multidex.html
smoothumut
1
Ouais, tu as raison. Il semble que vous n'avez pas besoin de l'avoir dans votre classe d'application, sauf si vous exécutez des tests.
Chad Bingham
Je ne comprends pas. Mon manifeste d'application a déjà une étiquette de nom. Je ne pense pas que je vais le remplacer par android:name="android.support.multidex.MultiDexApplication Please guide me ..
mboy
1
@mboy: Non, MainActivity et la classe d'application sont différentes. En savoir plus sur la classe d'application ici: rominirani.com/android-application-class
akshay7692
9

Dans votre build.gradle, ajoutez cette dépendance:

compile 'com.android.support:multidex:1.0.1'

à nouveau dans votre fichier build.gradle , ajoutez cette ligne au bloc defaultConfig :

multiDexEnabled true

Au lieu d'étendre votre classe d' application depuis Application, étendez-la depuis MultiDexApplication ; comme :

public class AppConfig extends MultiDexApplication {

maintenant vous êtes prêt à partir! Et au cas où vous en auriez besoin, tout MultiDexApplicationest fait

public class MultiDexApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
MohammadReza
la source
6

build.gradle

multiDexEnabled true
implementation 'androidx.multidex:multidex:2.0.1'

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
Isaak Osipovich Dunayevsky
la source
3

Étape 1: modifier build.grade

defaultConfig {
    ...
    // Enabling multidex support.
    multiDexEnabled true
}

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

Étape 2: configuration sur la classe Application

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
    }
}

Étape 3: Changer grade.properties

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

Ça va marcher!. Merci.

sonnv1368
la source
Je reçois "Impossible de trouver le symbole pour MultiDex". Quelqu'un a déjà rencontré ce problème?
Aung Myint Thein
3

Voici une approche à jour à partir de mai 2020, avec Android X.

Pour minSdk> = 21

Vous n'avez pas besoin de faire quoi que ce soit. Tous ces appareils utilisent la machine virtuelle Android RunTime (ART), qui prend en charge le multidex de manière native.

Pour minSdk<21

Dans votre module -level build.gradle, assurez-vous que les configurations suivantes sont remplies:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    implementation 'androidx.multidex:multidex:2.0.1'
}

Ensuite, vous devez src/main/AndroidManifest.xmldéclarer MultiDexApplicationcomme suit application:name:

<manifest package="com.your.package"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="androidx.multidex.MultiDexApplication" />
</manifest>
Jameson
la source
1

Ajouter à AndroidManifest.xml:

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

OU

MultiDex.install(this);

dans la méthode attachBaseContext de votre application personnalisée

ou votre application personnalisée étend MultiDexApplication

ajoutez multiDexEnabled = true dans votre build.gradle

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.android.support:multidex:1.0.0'
    }
}
Malik Abu Qaoud
la source
@Harsha, il n'est pas recommandé d'utiliser cela, mais essayez d'ajouter largeHeap à votre fichier manifeste <application android: largeHeap = "true"> </application>
Malik Abu Qaoud
android: largeHeap = "true" android: allowBackup = "true" Suis ajouté les deux
Harsha
ajoutez ceci au fichier gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud
1

Vous devez d'abord essayer avec Proguard (ce nettoyage de tout le code inutilisé)

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
Moises Apaza Q
la source
0

Si vous souhaitez activer le multi-dex dans votre projet, accédez simplement à gradle.builder

et ajoutez ceci dans votre dépendance

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

alors tu dois ajouter

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

// Enabling multidex support.
multiDexEnabled true}

Ensuite, ouvrez une classe et étendez-la à Application Si votre application utilise étend la classe Application, vous pouvez remplacer la méthode oncrete () et appeler

   MultiDex.install(this) 

pour activer multidex.

et enfin ajouter dans votre manifeste

 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
   ...
     android:name="android.support.multidex.MultiDexApplication">
   ...
   </application>
 </manifest> 
Pavel
la source
1
C'est quoi gradle.builder?
Chad Bingham
votre fichier gradle qui se trouve dans votre projet android studio
pavel
0

Toutes les réponses ci-dessus sont géniales

Ajoutez également ceci, sinon votre application plantera comme la mienne sans aucune raison

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Abhishek Mathur
la source
0

Avec androidx, les bibliothèques de support classiques ne fonctionnent plus.

Une solution simple consiste à utiliser le code suivant

Dans votre build.gradledossier

android{
  ...
  ...
  defaultConfig {
     ...
     ...
     multiDexEnabled true
  }
  ...
}

dependencies {
  ...
  ...
  implementation 'androidx.multidex:multidex:2.0.1'
}

Et dans votre manifeste, ajoutez simplement l'attribut de nom à la balise d'application

<manifest ...>
    <application
        android:name="androidx.multidex.MultiDexApplication"
     ...
     ...>
         ...
         ...
    </application>
</manifest>

Si votre application cible l'API 21 ou supérieure, le multidex est activé par défaut.

Maintenant, si vous voulez vous débarrasser de nombreux problèmes auxquels vous êtes confronté en essayant de prendre en charge le multidex, essayez d'abord d'utiliser la réduction du code en définissant minifyEnabled true.

mayank1513
la source
-2

le simple fait d'ajouter ce découpé dans le build.gradle fonctionne également très bien

android {
   compileSdkVersion 22
   buildToolsVersion "23.0.0"

     defaultConfig {
         minSdkVersion 14 //lower than 14 doesn't support multidex
         targetSdkVersion 22

         **// Enabling multidex support.
         **multiDexEnabled true****
     }
}
Chirag Thummar
la source
-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
lat_long
la source