So aktivieren Sie Multidexing mit der neuen Android Multidex-Unterstützungsbibliothek


142

Ich möchte die neue Multidex-Unterstützungsbibliothek verwenden, um das Methodenlimit für eine meiner Apps zu überschreiten.

Mit Android Lollipop hat Google eine Multidex-Unterstützungsbibliothek eingeführt, die das Multidexen einfach macht.

Welche Schritte sind erforderlich, um diese Bibliothek zu verwenden und meine App mit Multidex-Unterstützung zu erstellen?


Multidex unterstützt Drittanbieter-Bibliothek für Ihre Anwendung
— Keshav Gera

Antworten:


293

Bearbeiten:

Android 5.0 (API Level 21) und höher verwendet ART, das Multidexing unterstützt. Wenn Sie minSdkVersion21 Jahre oder älter sind, wird die Multidex-Unterstützungsbibliothek daher nicht benötigt.


Ändern Sie Ihre 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'
}

Wenn Sie Komponententests ausführen, sollten Sie dies in Ihre ApplicationKlasse aufnehmen:

public class YouApplication extends Application {

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

}

Oder machen Sie einfach Ihre application KlasseMultiDexApplication

public class Application extends MultiDexApplication {

}

Für weitere Informationen ist dies eine gute Anleitung.


2
Wenn Sie die neuen Builds-Tools verwenden, ist dies definitiv der richtige Weg.
— Janusz

1
@ jem88 Du hast dein gradle auf 1.0 aktualisiert ?? Sie sollten auf 2.2 sein. + (Sehen Sie sich Ihre an gradle-wrapper.properties) Die wichtigsten Punkte: 1 Ihre buildToolsVersion muss 21.1.1 oder höher sein. 2 Add multiDexEnabled truezu Ihrem DefaultConfig Ihrer build.gradle (Hinweis Es ist kein =) 3 hinzufügen'com.android.support:multidex:1.0.0'
— Chad Bingham

3
Wie wäre es, wenn wir keine Anwendungsklasse verwenden? Ist das Hinzufügen android:name="android.support.multidex.MultiDexApplication"zum applicationTag AndroidManifest.xmlausreichend?
— Buddy

1
Kompilieren Sie 'com.android.support:multidex:1.0.1' wird in 23 nicht benötigt
— Naveed Ahmad

3
@NaveedAhmad, laut den Google-Entwicklerdokumenten : ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
— Sakiboy

44

Die folgenden Schritte sind erforderlich, um Multi-Dexing zu starten:

Fügen Sie Ihrem Projekt android-support-multidex.jar hinzu. Das JAR befindet sich in Ihrem Android SDK-Ordner / sdk / extras / android / support / multidex / library / libs

Jetzt können Sie entweder Ihre Anwendungsklasse für Apps MultiDexApplication erweitern lassen

public class MyApplication extends MultiDexApplication

oder Sie überschreiben attachBaseContext wie folgt:

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

Ich habe den Override-Ansatz verwendet, da dies die Klassenhierarchie Ihrer Anwendungsklasse nicht beeinträchtigt.

Jetzt kann Ihre App Multi Dex verwenden. Der nächste Schritt besteht darin, gradle davon zu überzeugen, eine Multi-Dexed-Apk zu bauen. Das Build-Tools-Team arbeitet daran, dies zu vereinfachen. Im Moment müssen Sie jedoch Folgendes zum Android-Teil Ihrer Apps build.gradle hinzufügen

   dexOptions {
      preDexLibraries = false
   }

Und das Folgende zum allgemeinen Teil Ihrer Apps build.gradle

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

Weitere Informationen finden Sie auf Alex Lipovs Blog .


9
Wie kann ich das ohne Gradle verwenden?
— Lacas

3
@ Janusz ist es möglich, Multidex-Option ohne Gradle zu verwenden?
— Devrim

1
Ich denke nicht, dass dies ohne Gradle möglich ist.
— Janusz

5
Was ist der Eclipse Ant Fix, nicht Gradle?
— Portfoliobuilder

Mein Projekt erstellt keine Gradle-Datei, ich habe eine erstellt und bin Ihren Schritten gefolgt, aber es funktioniert nicht für mich
— BaDo

16

EINFACH, um Multidex zu aktivieren, müssen Sie ...

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

Außerdem müssen Sie Ihre Manifestdatei ändern. Fügen Sie in Ihrem Manifest die MultiDexApplication-Klasse aus der Multidex-Unterstützungsbibliothek wie folgt zum Anwendungselement hinzu

<?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
Dies aktiviert kein Multi-Dexing. Ihnen fehlt noch die Anwendungsklasse.
— Chad Bingham

1
Danke für den Kommentar, das hat bei meinem Fall funktioniert. Hier ist der Link, auf den ich von developer.android.com/tools/building/multidex.html
— Smoothumut

1
Ja, du hast recht. Es sieht so aus, als müssten Sie es nicht in Ihrer Anwendungsklasse haben, es sei denn, Sie führen Tests aus.
— Chad Bingham

Ich verstehe das nicht. Mein Anwendungsmanifest hat bereits ein Namensschild. Ich glaube nicht, dass ich es durch ersetzen werde. android:name="android.support.multidex.MultiDexApplication Bitte
— führe

1
@mboy: Nein, MainActivity und Anwendungsklasse sind unterschiedlich. Erfahren
— Sie

9

Fügen Sie in Ihrem build.gradle diese Abhängigkeit hinzu:

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

Fügen Sie diese Zeile erneut in Ihrer build.gradle- Datei zum defaultConfig- Block hinzu:

multiDexEnabled true

Anstatt Ihre Anwendungsklasse von Application zu erweitern, erweitern Sie sie von MultiDexApplication . mögen :

public class AppConfig extends MultiDexApplication {

Jetzt kannst du loslegen! Und falls Sie es brauchen, ist alles, was Sie tun MultiDexApplicationmüssen

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

5

build.gradle

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

AndroidManifest.xml

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

3

Schritt 1: Ändern Sie build.grade

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

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

Schritt 2: Festlegen der Anwendungsklasse

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

Schritt 3: Ändern Sie grade.properties

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

Es wird klappen!. Vielen Dank.


Ich erhalte die Meldung "Symbol für MultiDex kann nicht gefunden werden". Hat sich schon jemand mit diesem Problem konfrontiert?
— Aung Myint Thein

2

Hier ist ein aktueller Ansatz ab Mai 2020 mit Android X.

Zum minSdk > = 21

Sie müssen nichts tun. Alle diese Geräte verwenden die Android RunTime (ART) VM, die nativ Multidex unterstützt.

Zum minSdk <21

Stellen Sie in Ihrer Modulebenebuild.gradle sicher, dass die folgenden Konfigurationen ausgefüllt sind:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Dann Ihre src/main/AndroidManifest.xmlBedürfnisse zu erklären , MultiDexApplicationwie die application:name:

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

1

Zu AndroidManifest.xml hinzufügen:

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

ODER

MultiDex.install(this);

in der attachBaseContext-Methode Ihrer benutzerdefinierten Anwendung

oder Ihre benutzerdefinierte Anwendung erweitert MultiDexApplication

Fügen Sie multiDexEnabled = true in Ihr build.gradle ein

defaultConfig {
    multiDexEnabled true
}

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

@Harsha Es wird nicht empfohlen, dies zu verwenden, aber versuchen Sie, largeHeap zu Ihrer Manifestdatei hinzuzufügen <application android: largeHeap = "true"> </ application>
— Malik Abu Qaoud

android: largeHeap = "true" android: allowBackup = "true" werden beide hinzugefügt
— Harsha

füge dies der Gradle-Datei hinzu >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
— Malik Abu Qaoud

1

Zuerst sollten Sie es mit Proguard versuchen (Dies bereinigt den gesamten Code, der nicht verwendet wird).

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

Wenn Sie Multi-Dex in Ihrem Projekt aktivieren möchten, gehen Sie einfach zu gradle.builder

und fügen Sie dies in Ihre Abhängigkeit ein

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

dann musst du hinzufügen

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

// Enabling multidex support.
multiDexEnabled true}

Öffnen Sie dann eine Klasse und erweitern Sie sie zu Application. Wenn Ihre App die Application-Klasse erweitert, können Sie die oncrete () -Methode überschreiben und aufrufen

   MultiDex.install(this) 

Multidex aktivieren.

und schließlich in Ihr Manifest hinzufügen

 <?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
Was ist gradle.builder?
— Chad Bingham

Ihre Gradle-Datei, die sich in Ihrem Android-Studio-Projekt befindet
— pavel

0

Alle obigen Antworten sind fantastisch

Fügen Sie dies auch hinzu, da Ihre App sonst ohne Grund wie meine abstürzt

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

-2

Das Hinzufügen dieses Snips im build.gradle funktioniert ebenfalls einwandfrei

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);
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.