Как да активирате мултидексиране с новата библиотека за поддръжка на Android Multidex

Искам да използвам новата библиотека за поддръжка на Multidex, за да наруша ограничението на метода за едно от моите приложения.

С Android Lollipop Google представи библиотека за поддръжка на multidex, която улеснява мултидексирането.

Какви стъпки са необходими, за да използвам тази библиотека и да създам приложението си с поддръжка на multidex?


person Janusz    schedule 28.10.2014    source източник
comment
multidex поддържа библиотека на трета страна към вашето приложение   -  person Keshav Gera    schedule 20.12.2018


Отговори (14)


Редактиране:

Android 5.0 (API ниво 21) и по-високи използват ART, който поддържа мултидексиране. Следователно, ако вашият minSdkVersion е 21 или по-висок, библиотеката за поддръжка на multidex не е необходима.


Променете своя 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'
}

Ако изпълнявате модулни тестове, ще искате да включите това във вашия Application клас:

public class YouApplication extends Application {

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

}

Или просто накарайте вашия application клас да се разшири MultiDexApplication

public class Application extends MultiDexApplication {

}

За повече информация това е добро ръководство.

person Chad Bingham    schedule 04.12.2014
comment
Ако все още използвате новите инструменти за компилации, това определено е правилният начин. - person Janusz; 04.12.2014
comment
И така, какво ще стане, ако използвам същия метод, описан по-долу тук от Janusz и всичко работи добре, а след това актуализирах до android studio 1.0 (и така gradle 1.0) и не мога да го накарам да работи по никакъв начин. Нито този описан от теб, който също изглежда като официален за google.. Все още не успявам да изпълня командата --multi-dex. Някой да има същия проблем? - person Marino; 09.12.2014
comment
@jem88 Актуализирахте ли своя gradle до 1.0?? Трябва да сте на 2.2.+ (Погледнете във вашия gradle-wrapper.properties) Ключовите точки: 1 вашата buildToolsVersion трябва да е 21.1.1 или по-нова. 2 добавете multiDexEnabled true към вашата defaultConfig на вашия build.gradle (забележете, че няма =) 3 добавете 'com.android.support:multidex:1.0.0' - person Chad Bingham; 09.12.2014
comment
@Binghammer Съжалявам за грешката, имам предвид gradle 2.2.1. Имам това, използвам инструменти за изграждане 21.1.1, имам multiDexEnabled true в конфигурацията по подразбиране и имам multidex:1.0.0. И всички останали неща са точно по същия начин, който имах преди актуализацията, когато работеше добре. Занимавам се с това от няколко часа, не мога да го разбера! - person Marino; 09.12.2014
comment
Какво ще кажете, ако не използваме клас на приложение? Достатъчно ли е добавянето на маркер android:name="android.support.multidex.MultiDexApplication" към application в AndroidManifest.xml? - person Buddy; 03.09.2015
comment
Не е ли необходимо да го добавите и към секцията за освобождаване? - person Zapnologica; 05.11.2015
comment
@Zapanologica Ако е във вашия 'defaultConfig', трябва да сте добре. - person Chad Bingham; 05.11.2015
comment
Ето как поправи срива на Multi-Dex в приложението ми, благодаря много, моля, вижте връзката developer.android.com/tools/building/multidex.html - person Anuj; 11.01.2016
comment
компилирането 'com.android.support:multidex:1.0.1' не е необходимо в 23 - person Naveed Ahmad; 13.05.2016
comment
перфектен отговор!. работи за мен, след като включи multidex активиран true, компилира multidex зависимост и добави инсталационен multidex код в моя клас Application. реши големия ми проблем. Благодаря @Chad Bingham - person Harrish Android; 06.07.2016
comment
@NaveedAhmad, според документите за разработчици на Google: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'. - person Sakiboy; 03.03.2017
comment
въз основа на документацията се изисква компилиране на „com.android.support:multidex:1.0.1“, ако вашата minSdkVersion е зададена на 20. developer.android.com/studio/build/multidex.html - person Juan Mendez; 16.11.2017
comment
Изглежда, че библиотеката multidex е в хранилището на maven. Така че проверете дали е добавен и в конфигурацията на build.gradle. Като: repositories { ... mavenCentral() ... } and buildscript { repositories { mavenCentral() } ... } Помогна ми - person Sergio; 30.01.2018
comment
Мултидекс има нова версия 1.0.3 - person Vova Stelmashchuk; 16.03.2018
comment
За API ‹ 21 може да се наложи да разширите и MultiDexApplication вместо Application. - person ratsimihah; 18.05.2018
comment
@ratsimihah Няма изискване за разширяване на този клас. Това е просто помощник. - person Chad Bingham; 18.05.2018
comment
За да бъде ясно, за minSdkVersion 21+ не само библиотеката за поддръжка на multidex, но и всяка конфигурация на multidex, като multiDexEnabled true, не е необходима. - person Tatsuya Fujisaki; 21.07.2020

Необходими са следните стъпки, за да започнете мулти дексинг:

Добавете android-support-multidex.jar към вашия проект. Бурканът може да бъде намерен във вашата папка SDK за Android /sdk/extras/android/support/multidex/library/libs

Сега вие или позволявате на класа на приложение на вашите приложения да разширява MultiDexApplication

public class MyApplication extends MultiDexApplication

или заменяте attachBaseContext по този начин:

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

Използвах подхода за отмяна, защото това не се забърква с йерархията на класовете на вашия клас на приложение.

Сега вашето приложение е готово да използва multi dex. Следващата стъпка е да убедите gradle да изгради мулти dexed apk. Екипът на инструментите за изграждане работи върху улесняването на това, но за момента трябва да добавите следното към android частта на вашите приложения build.gradle

   dexOptions {
      preDexLibraries = false
   }

И следното към общата част на вашите приложения build.gradle

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

Повече информация можете да намерите в блога на Алекс Липов.

person Janusz    schedule 29.10.2014
comment
как мога да използвам това без gradle? - person lacas; 06.11.2014
comment
@Janusz възможно ли е да се използва опция multidex без gradle? - person Devrim; 20.11.2014
comment
Не мисля, че това е възможно без gradle. - person Janusz; 20.11.2014
comment
Какво представлява корекцията на Eclipse Ant, а не gradle? - person portfoliobuilder; 13.01.2015
comment
Моят проект не създава gradle файл, създадох такъв и следвах вашите стъпки, но не работи за мен - person BaDo; 16.01.2015
comment
Толкова се радваме, че отидохме на gradle, използвайки ant, това щеше да е кошмар. - person JPM; 18.07.2015
comment
Също така се опитвам да създам проекта си с поддръжка на moulted, но докато изпълнявам приложението, то се срива, казвайки ClassNotFound Exception за моя клас на приложение. Освен това се създава само classes.ex файл, въпреки че посочих splitdexfile. Моля, помогнете - person Raji A C; 27.08.2015
comment
Имах всичко останало, но това го поправи за мен на устройства с KitKat: dexOptions { preDexLibraries = false } - person dazza5000; 26.12.2016

ПРОСТО, за да активирате multidex, трябва да ...

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

също трябва да промените файла на манифеста. Във вашия манифест добавете класа MultiDexApplication от библиотеката за поддръжка на multidex към елемента на приложението по този начин

<?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>
person smoothumut    schedule 30.07.2015
comment
Това няма да активира мулти дексиране. Все още ви липсва класът на приложението. - person Chad Bingham; 04.08.2015
comment
Благодаря за коментара, това проработи в моя случай. Ето връзката, за която получих справка от developer.android.com/tools/building/multidex. html - person smoothumut; 06.08.2015
comment
Да, право си. Изглежда, че не е необходимо да го имате във вашия клас на приложение, освен ако не изпълнявате тестове. - person Chad Bingham; 07.08.2015
comment
Не разбирам това.. Моят манифест на приложението вече има етикет с име. Не мисля, че ще го заменя с android:name="android.support.multidex.MultiDexApplication Моля, насочете ме.. - person mboy; 01.03.2016
comment
@mboy: В този случай трябва да замените attachBaseContext(Context base) във вашия клас на приложение. Вижте отговора на Януш. - person akshay7692; 15.03.2016
comment
@akshay7692 Имам само един клас на дейност (MainActivity), а други са фрагменти, извикани чрез натискане на някакъв бутон от MainActivity.. Не съм сигурен какво е класът на приложението.. Класът на приложението е същият като моя клас MainActivty? Моля, поправете ме, ако греша.. - person mboy; 16.03.2016
comment
@mboy : Не, MainActivity и класът на приложението са различни. Научете повече за класа на приложението тук: rominirani.com/android-application-class - person akshay7692; 17.03.2016
comment
Сега разбирам.. Благодаря ви много! - person mboy; 18.03.2016
comment
Мисля, че поставянето на package="com.example.android.multidex.myapplication"> вероятно е подвеждащо b/c създава впечатлението, че myapplication class трябва да бъде включен в името на пакета. Трябва да е само коренът на пакета до, но без класа. - person EntangledLoops; 29.03.2016
comment
android:name=android.support.multidex.MultiDexApplication ... тази част ми спасява живота - person Jamil; 25.01.2017

Във вашия build.gradle добавете тази зависимост:

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

отново във вашия файл build.gradle добавете този ред към блока defaultConfig:

multiDexEnabled true

Вместо да разширявате класа на вашето приложение от Приложение, разширете го от MultiDexApplication; като :

public class AppConfig extends MultiDexApplication {

сега сте готови! И в случай, че имате нужда от него, всичко, което MultiDexApplication прави, е

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

build.gradle

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

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
person Isaak Osipovich Dunayevsky    schedule 08.07.2019

Ето един актуален подход към октомври 2020 г. с Android X. Това идва от документацията на Android, Активирайте multidex за приложения с над 64K метода.

За minSdk ›= 21

Не е необходимо да правите нищо. Всички тези устройства използват Android RunTime (ART) VM, който поддържа multidex първоначално.

За minSdk ‹ 21

Във вашия модул-ниво build.gradle се уверете, че следните конфигурации са попълнени:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Трябва да инсталирате изрична поддръжка на multidex. Документацията включва три метода за това и трябва да изберете един.

Например във вашия src/main/AndroidManifest.xml можете да декларирате MultiDexApplication като application:name:

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

Стъпка 1: Променете build.grade

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

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

Стъпка 2: Настройка на класа Application

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

Стъпка 3: Променете grade.properties

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

Ще работи!. Благодаря.

person sonnv1368    schedule 20.07.2016
comment
Получавам символ Не мога да намеря за MultiDex. Някой да се е сблъсквал с този проблем преди? - person Aung Myint Thein; 30.07.2019

Добавете към AndroidManifest.xml:

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

OR

MultiDex.install(this);

в метода attachBaseContext на вашето персонализирано приложение

или вашето персонализирано приложение разширява MultiDexApplication

добавете multiDexEnabled = true във вашия build.gradle

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.android.support:multidex:1.0.0'
    }
}
person Malik Abu Qaoud    schedule 08.02.2017
comment
@Harsha не се препоръчва да използвате това, но опитайте да добавите largeHeap към вашия манифестен файл ‹application android:largeHeap=true›‹/application› - person Malik Abu Qaoud; 26.03.2017
comment
android:largeHeap=true android:allowBackup=true Добавих и двете - person Harsha; 27.03.2017
comment
добавете това към файла gradle ››››››››› dexOptions { javaMaxHeapSize 4g } - person Malik Abu Qaoud; 27.03.2017

Първо трябва да опитате с Proguard (Това изчиства целия неизползван код)

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'
        }
    }
}
person Moises Apaza Q    schedule 28.04.2017
comment
Значи не са необходими MultiDexApplication и androidx:multidex? Защо други отговори осигуряват още две стъпки? - person Mahdi-Malv; 31.12.2020

С androidx класическите библиотеки за поддръжка вече не работят.

Просто решение е да използвате следния код

Във вашия build.gradle файл

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

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

И във вашия манифест просто добавете атрибут name към маркера на приложението

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

Ако вашето приложение е насочено към API 21 или по-висок, multidex е активиран по подразбиране.

Сега, ако искате да се отървете от много от проблемите, с които се сблъсквате, опитвайки се да поддържате multidex - първо опитайте да използвате свиване на кода, като зададете minifyEnabled true.

person mayank1513    schedule 24.07.2020

Ако искате да активирате multi-dex във вашия проект, просто отидете на gradle.builder

и добавете това във вашата зависимост

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

тогава трябва да добавите

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

// Enabling multidex support.
multiDexEnabled true}

След това отворете клас и го разширете до Application Ако вашето приложение използва extends класа Application, можете да замените метода oncrete() и да извикате

   MultiDex.install(this) 

за да активирате multidex.

и накрая добавете във вашия манифест

 <?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> 
person pavel    schedule 30.04.2016
comment
Какво е gradle.builder? - person Chad Bingham; 22.06.2016
comment
вашия gradle файл, който се намира във вашия проект за Android Studio - person pavel; 23.06.2016

Всички отговори по-горе са страхотни

Добавете и това, в противен случай приложението ви ще се срине като моето без причина

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
person Abhishek Mathur    schedule 03.07.2020

просто добавянето на този изрязан в 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****
     }
}
person Chirag Thummar    schedule 24.02.2017

Multi_Dex.java

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