Jak włączyć multidexing za pomocą nowej biblioteki obsługi Android Multidex


142

Chcę użyć nowej biblioteki obsługi Multidex, aby przełamać limit metod dla jednej z moich aplikacji.

Wraz z Androidem Lollipop Google wprowadził bibliotekę obsługi wieluidex, która ułatwia multidex.

Jakie kroki są potrzebne do korzystania z tej biblioteki i tworzenia aplikacji z obsługą wieluidex?


Multidex obsługuje zewnętrzną bibliotekę do Twojej aplikacji
Keshav Gera

Odpowiedzi:


293

Edytować:

Android 5.0 (poziom API 21) i nowszy używa ART, który obsługuje multidexing. Dlatego jeśli masz minSdkVersion21 lat lub więcej, biblioteka obsługi multidex nie jest potrzebna.


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

Jeśli przeprowadzasz testy jednostkowe, będziesz chciał uwzględnić to w swojej Applicationklasie:

public class YouApplication extends Application {

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

}

Lub po prostu applicationprzedłuż swoją klasęMultiDexApplication

public class Application extends MultiDexApplication {

}

Aby uzyskać więcej informacji, to jest dobry przewodnik.


2
Jeśli korzystasz z nowych narzędzi do budowania, jest to zdecydowanie droga.
Janusz

1
@ jem88 Zaktualizowałeś gradle do wersji 1.0? Powinieneś być na 2.2. + (Spójrz na swoje gradle-wrapper.properties) Kluczowe punkty: 1 Twój buildToolsVersion musi być 21.1.1 lub wyższy. 2 dodaj multiDexEnabled truedo domyślnej konfiguracji swojego build.gradle (zauważ, że nie ma =) 3 dodaj'com.android.support:multidex:1.0.0'
Chad Bingham,

3
A jeśli nie używamy klasy aplikacji? Czy dodanie android:name="android.support.multidex.MultiDexApplication"do applicationtagu jest AndroidManifest.xmlwystarczające?
Buddy

1
kompilacja „com.android.support:multidex:1.0.1” nie jest potrzebna w 23
Naveed Ahmad

3
@NaveedAhmad, według Dokumenty pomocną producent: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy

44

Aby rozpocząć multi dexing, potrzebne są następujące kroki:

Dodaj android-support-multidex.jar do swojego projektu. Jar można znaleźć w folderze Android SDK / sdk / extras / android / support / multidex / library / libs

Teraz możesz pozwolić, aby klasa aplikacji aplikacji rozszerzała MultiDexApplication

public class MyApplication extends MultiDexApplication

lub nadpisujesz attachBaseContext w ten sposób:

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

Użyłem metody nadpisywania, ponieważ nie ma to wpływu na hierarchię klas Twojej klasy aplikacji.

Teraz Twoja aplikacja jest gotowa do użycia multi-dex. Następnym krokiem jest przekonanie Gradle do zbudowania multi-dexed apk. Zespół narzędzi do kompilacji pracuje nad ułatwieniem tego, ale na razie musisz dodać następujące elementy do części aplikacji dla systemu Android build.gradle

   dexOptions {
      preDexLibraries = false
   }

A oto ogólna część twoich aplikacji build.gradle

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

Więcej informacji można znaleźć na blogu Alexa Lipova .


9
jak mogę tego używać bez gradle?
lacas

3
@Janusz czy można używać opcji multidex bez gradle?
Devrim

1
Nie sądzę, żeby to było możliwe bez gradle.
Janusz

5
Co to jest poprawka Eclipse Ant, a nie gradle?
portfoliobuilder

Mój projekt nie tworzy pliku gradle, stworzyłem go i podążyłem za twoimi krokami, ale nie działa dla mnie
BaDo

16

PO PROSTU, aby włączyć multidex, musisz ...

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

musisz także zmienić swój plik manifestu. W swoim manifeście dodaj klasę MultiDexApplication z biblioteki obsługi multidex do elementu aplikacji, takiego jak ten

<?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
To nie umożliwi multi-dexing. Nadal brakuje Ci klasy aplikacji.
Chad Bingham

1
Dzięki za komentarz, to zadziałało w moim przypadku. Oto link, do którego mam odniesienie z developer.android.com/tools/building/multidex.html
smoothumut

1
Tak, masz rację. Wygląda na to, że nie musisz go mieć w swojej klasie aplikacji, chyba że przeprowadzasz testy.
Chad Bingham

Nie rozumiem ... Mój manifest aplikacji ma już tag z nazwą. Nie sądzę, żebym go zastąpił android:name="android.support.multidex.MultiDexApplication
napisem

1
@mboy: Nie, MainActivity i klasa aplikacji są różne. Dowiedz się więcej o klasie aplikacji tutaj: rominirani.com/android-application-class
akshay7692

9

W pliku build.gradle dodaj tę zależność:

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

ponownie w pliku build.gradle pliku dodaj tę linię do bloku defaultConfig :

multiDexEnabled true

Zamiast rozszerzać klasę aplikacji z Application, rozszerz ją z MultiDexApplication ; lubić :

public class AppConfig extends MultiDexApplication {

teraz jesteś gotowy! A jeśli tego potrzebujesz, wszystko MultiDexApplicationjest

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

Krok 1: Zmień build.grade

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

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

Krok 2: ustawienie w klasie Application

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

Krok 3: Zmień grade.properties

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

To będzie działać!. Dzięki.


Otrzymuję komunikat „Nie można znaleźć symbolu dla MultiDex”. Czy ktoś wcześniej miał ten problem?
Aung Myint Thein

3

Oto aktualne podejście z maja 2020 r., Z Androidem X.

Dla minSdk> = 21

Nie musisz nic robić. Wszystkie te urządzenia używają maszyny wirtualnej Android RunTime (ART), która natywnie obsługuje multidex.

Dla minSdk <21

W swojej modułowej -level build.gradle, zapewniają, że następujące konfiguracje są wypełniane:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Następnie src/main/AndroidManifest.xmlmusisz zadeklarować MultiDexApplicationjako application:name:

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

1

Dodaj do AndroidManifest.xml:

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

LUB

MultiDex.install(this);

w metodzie attachBaseContext aplikacji niestandardowej

lub niestandardowa aplikacja rozszerza MultiDexApplication

dodaj multiDexEnabled = true w swoim build.gradle

defaultConfig {
    multiDexEnabled true
}

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

@Harsha nie zaleca się tego, ale spróbuj dodać largeHeap do swojego pliku manifestu <application android: largeHeap = "true"> </application>
Malik Abu Qaoud

android: largeHeap = "true" android: allowBackup = "true" dodałem oba
Harsha

dodaj to do pliku gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud

1

Najpierw powinieneś spróbować z Proguard (to wyczyść cały kod nieużywany)

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

Jeśli chcesz włączyć multi-dex w swoim projekcie, po prostu przejdź do gradle.builder

i dodaj to w swojej zależności

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

wtedy musisz dodać

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

// Enabling multidex support.
multiDexEnabled true}

Następnie otwórz klasę i rozszerz ją do Application Jeśli Twoja aplikacja używa rozszerzeń klasy Application, możesz zastąpić metodę oncrete () i wywołać

   MultiDex.install(this) 

aby włączyć multidex.

i na koniec dodaj do manifestu

 <?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
Co to jest gradle.builder?
Chad Bingham

Twój plik gradle, który znajduje się w Twoim projekcie Android Studio
pavel

0

Wszystkie powyższe odpowiedzi są niesamowite

Dodaj to również, w przeciwnym razie Twoja aplikacja ulegnie awarii bez żadnego powodu

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

0

W systemie Androidx klasyczne biblioteki wsparcia już nie działają.

Prostym rozwiązaniem jest użycie następującego kodu

W twoim build.gradlepliku

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

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

W swoim manifeście po prostu dodaj atrybut name do tagu aplikacji

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

Jeśli Twoja aplikacja jest przeznaczona dla interfejsu API 21 lub nowszego, funkcja multidex jest domyślnie włączona.

Teraz, jeśli chcesz pozbyć się wielu problemów, które napotykasz, próbując obsługiwać multidex - najpierw spróbuj użyć zmniejszania kodu przez ustawienie minifyEnabled true.


-2

samo dodanie tego fragmentu w pliku build.gradle również działa dobrze

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);
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.