Come abilitare il multidex con la nuova libreria di supporto Android Multidex


142

Voglio utilizzare la nuova libreria di supporto Multidex per rompere il limite di metodo per una delle mie app.

Con Android Lollipop Google ha introdotto una libreria di supporto multidex che semplifica il multidex.

Quali passaggi sono necessari per utilizzare questa libreria e per creare la mia app con il supporto multidex?


Multidex supporta la libreria di terze parti per la tua applicazione
Keshav Gera,

Risposte:


293

Modificare:

Android 5.0 (livello API 21) e versioni successive utilizza ART che supporta il multidex. Pertanto, se hai minSdkVersion21 anni o più, la libreria di supporto multidex non è necessaria.


Modifica il tuo 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'
}

Se stai eseguendo test unitari, vorrai includerlo nella tua Applicationclasse:

public class YouApplication extends Application {

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

}

O semplicemente applicationestendi la tua lezioneMultiDexApplication

public class Application extends MultiDexApplication {

}

Per maggiori informazioni, questa è una buona guida.


2
Se stai usando i nuovi strumenti di build, questa è sicuramente la strada da percorrere.
Janusz,

1
@ jem88 Hai aggiornato il tuo voto a 1.0 ?? Dovresti essere su 2.2. + (Dai un'occhiata a gradle-wrapper.properties) I punti chiave: 1 buildToolsVersion deve essere 21.1.1 o superiore. 2 aggiungi multiDexEnabled trueal tuo predefinito Configurazione del tuo build.gradle (nota che non c'è a =) 3 aggiungi il'com.android.support:multidex:1.0.0'
Chad Bingham

3
Che ne dici se non usiamo la classe di applicazione? L'aggiunta android:name="android.support.multidex.MultiDexApplication"al applicationtag è AndroidManifest.xmlsufficiente?
Buddy,

1
compilare 'com.android.support:multidex:1.0.1' non è necessario in 23
Naveed Ahmad

3
@NaveedAhmad, secondo la documentazione Google Developer: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy

44

Per avviare il multi-dex sono necessari i seguenti passaggi:

Aggiungi android-support-multidex.jar al tuo progetto. Il barattolo può essere trovato nella cartella SDK di Android / sdk / extra / android / support / multidex / library / libs

Ora puoi lasciare che la classe delle tue applicazioni estenda MultiDexApplication

public class MyApplication extends MultiDexApplication

oppure sostituisci attachBaseContext in questo modo:

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

Ho usato l'approccio override perché non interferisce con la gerarchia di classi della tua classe di applicazione.

Ora la tua app è pronta per l'uso del multi-dex. Il prossimo passo è convincere Gradle a costruire un apk multistrato. Il team degli strumenti di compilazione sta lavorando per semplificarlo, ma per il momento è necessario aggiungere quanto segue alla parte Android delle app build.gradle

   dexOptions {
      preDexLibraries = false
   }

E quanto segue alla parte generale delle tue app build.gradle

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

Maggiori informazioni sono disponibili sul blog di Alex Lipovs .


9
come posso usare questo senza gradle?
lacas,

3
@Janusz è possibile utilizzare l'opzione Multidex senza gradle?
Devrim,

1
Non penso che ciò sia possibile senza voto.
Janusz,

5
Cos'è la correzione di Eclipse Ant, non il grado?
portfoliobuilder

Il mio progetto non crea file gradle, ne ho creato uno e ho seguito i tuoi passaggi, ma non funziona per me
BaDo

16

SEMPLICEMENTE, per abilitare il multidex, devi ...

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'
}

inoltre è necessario modificare il file manifest. Nel tuo manifest aggiungi la classe MultiDexApplication dalla libreria di supporto multidex all'elemento dell'applicazione in questo modo

<?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>

1
Questo non abiliterà il multi-dex. Manca ancora la classe dell'applicazione.
Chad Bingham,

1
Grazie per il commento, ha funzionato per il mio caso. Ecco il link che ho ricevuto dal riferimento developer.android.com/tools/building/multidex.html
smoothumut

1
Sì, hai ragione. Sembra che non sia necessario averlo nella classe dell'applicazione a meno che non si eseguano test.
Chad Bingham,

Non capisco questo ... Il mio manifest dell'applicazione ha già un nome tag. Non credo che lo sostituirò con android:name="android.support.multidex.MultiDexApplication Per favore
guidami

1
@mboy: No, MainActivity e la classe di applicazione sono diverse. Scopri di
akshay7692

9

Nel tuo build.gradle aggiungi questa dipendenza:

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

di nuovo nel tuo file build.gradle aggiungi questa riga al blocco defaultConfig :

multiDexEnabled true

Invece di estendere la classe di applicazione da Application estenderlo da MultiDexApplication ; piace :

public class AppConfig extends MultiDexApplication {

ora sei a posto! E nel caso in cui ne abbiate bisogno, tutto MultiDexApplicationè

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

6

build.gradle

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

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"

3

Passaggio 1: modifica build.grade

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

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

Passaggio 2: impostazione sulla classe applicazione

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

Passaggio 3: modificare grade.properties

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

Funzionerà!. Grazie.


Ricevo "Impossibile trovare il simbolo per MultiDex". Qualcuno ha affrontato questo problema prima?
Aung Myint Thein,

2

Ecco un approccio aggiornato a partire da maggio 2020, con Android X.

Per minSdk> = 21

Non devi fare nulla. Tutti questi dispositivi utilizzano Android RunTime (ART) VM, che supporta il multidex in modo nativo.

Per minSdk<21

Nel tuo livello di modulobuild.gradle , assicurati che siano popolate le seguenti configurazioni:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Quindi, è src/main/AndroidManifest.xmlnecessario dichiarare MultiDexApplicationcome application:name:

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

1

Aggiungi ad AndroidManifest.xml:

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

O

MultiDex.install(this);

nel metodo attachBaseContext della tua applicazione personalizzata

oppure l'applicazione personalizzata estende MultiDexApplication

aggiungi multiDexEnabled = true in build.gradle

defaultConfig {
    multiDexEnabled true
}

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

@Harsha non è consigliabile utilizzarlo, ma prova ad aggiungere largeHeap al tuo file manifest <applicazione android: largeHeap = "true"> </application>
Malik Abu Qaoud,

android: largeHeap = "true" android: allowBackup = "true" sono stati aggiunti entrambi
Harsha

aggiungi questo al file gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud

1

Per prima cosa dovresti provare con Proguard (pulisce tutto il codice inutilizzato)

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'
        }
    }
}

0

Se vuoi abilitare multi-dex nel tuo progetto, vai su gradle.builder

e aggiungilo nella tua dipendenza

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

allora devi aggiungere

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

// Enabling multidex support.
multiDexEnabled true}

Quindi apri una classe ed estendila all'applicazione Se la tua app utilizza estende la classe Applicazione, puoi ignorare il metodo oncrete () e chiamare

   MultiDex.install(this) 

per abilitare multidex.

e infine aggiungi nel tuo manifest

 <?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> 

1
Che cosa è gradle.builder?
Chad Bingham,

il tuo file gradle che si trova nel tuo progetto Android Studio
Pavel

0

Tutte le risposte sopra sono fantastiche

Aggiungi anche questo altrimenti la tua app andrà in crash come la mia senza alcun motivo

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

0

Con androidx, le classiche librerie di supporto non funzionano più.

La soluzione semplice è utilizzare il seguente codice

Nel tuo build.gradlefile

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

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

E nel tuo manifest basta aggiungere l'attributo name al tag dell'applicazione

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

Se l'applicazione è indirizzata all'API 21 o superiore, multidex è abilitato per impostazione predefinita.

Ora, se vuoi sbarazzarti di molti dei problemi che devi affrontare cercando di supportare il multidex, prova prima a usare il restringimento del codice impostando minifyEnabled true.


-2

anche solo aggiungendo questo frammento in build.gradle funziona bene

android {
   compileSdkVersion 22
   buildToolsVersion "23.0.0"

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

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

-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.