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?

Janusz
quelle
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.

Chad Bingham
quelle
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 .

Janusz
quelle
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>
Smoothumut
quelle
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);
    }
}
MohammadReza
quelle
5

build.gradle

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

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
Isaak Osipovich Dunayevsky
quelle
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.

sonnv1368
quelle
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>
Jameson
quelle
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'
    }
}
Malik Abu Qaoud
quelle
@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'
        }
    }
}
Moises Apaza Q.
quelle
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> 
pavel
quelle
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
}
Abhishek Mathur
quelle
-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****
     }
}
Chirag Thummar
quelle
-5

Multi_Dex.java

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