Як увімкнути мультидексінг за допомогою нової бібліотеки підтримки Android Multidex


142

Я хочу використовувати нову бібліотеку підтримки Multidex, щоб порушити ліміт методів для одного з моїх додатків.

Завдяки Android Lollipop Google представив бібліотеку підтримки мультидекса, яка полегшує мультидекс.

Які кроки необхідні для використання цієї бібліотеки та створення мого додатка з підтримкою multidex?


мультидекс підтримка сторонньої бібліотеки до вашої програми
Кешав Гера

Відповіді:


293

Редагувати:

Android 5.0 (рівень 21) та новіших версій використовує АРТ, що підтримує мультидексінг. Тому, якщо ваш minSdkVersion21 або більше, бібліотека підтримки мультидекса не потрібна.


Змініть свої 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 {

}

Для отримання додаткової інформації це хороший посібник.


2
Якщо ви використовуєте інструменти для створення нових збірок, то це безумовно шлях.
Януш

1
@ jem88 Ви оновили градус до 1,0 ?? Ви повинні бути на 2.2. + (Погляньте на своє gradle-wrapper.properties) Ключові моменти: 1 ваш buildToolsVersion повинен бути 21.1.1 або вище. 2 додайте multiDexEnabled trueдо своєї замовчувальної конфігурації свого build.gradle (зауважте, що немає =) 3 додайте'com.android.support:multidex:1.0.0'
Чад Бінгем

3
Як щодо того, якщо ми не використовуємо клас додатків? Є чи додавання android:name="android.support.multidex.MultiDexApplication"до applicationтегу в AndroidManifest.xmlдосить?
Бадді

1
компілювати 'com.android.support:multidex:1.0.1' не потрібно в 23
Naveed Ahmad

3
@NaveedAhmad, згідно з документацією для розробників Google: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Сакібой

44

Наступні кроки необхідні для запуску мульти-дексінгу:

Додайте до свого проекту 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);
}

Я використовував підхід переосмислення, тому що це не псується з ієрархією класів вашого класу додатків.

Тепер ваш додаток готовий використовувати мультидекс. Наступним кроком є ​​переконання gradle у створенні мультидексированного apk. Команда інструментів збирання працює над тим, щоб зробити це простіше, але на даний момент вам потрібно додати наступне до андроїдної частини ваших додатків 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'
      }
   }
}

Більше інформації можна знайти в блозі Алекса Ліпова .


9
як я можу це використати без градулей?
lacas

3
@Janusz чи можна використовувати опцію multidex без gradle?
Деврим

1
Я не думаю, що це неможливо без градул.
Януш

5
Що таке виправлення мурашника Eclipse, а не граді?
портфоліобудівник

Мій проект не створював файл gradle, я створив його та дотримувався ваших кроків, але він не працює для мене
BaDo

16

ПРОСТО, щоб увімкнути мультидекс, вам потрібно ...

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>

1
Це не ввімкне мультидексінг. Ви все ще не вистачаєте класу додатків.
Чад Бінгем

1
Дякую за коментар, Це працювало для моєї справи. Ось посилання, на яке я отримав посилання від developer.android.com/tools/building/multidex.html
smoothumut

1
Так, ваше право. Схоже, вам не потрібно мати його у вашому класі додатків, якщо ви не виконуєте тести.
Чад Бінгем

Я цього не розумію .. У моєму маніфесті додатків уже є тег імен. Я не думаю, що я заміню його на android:name="android.support.multidex.MultiDexApplication Будь ласка,
керуйте

1
@mboy: Ні, MainActivity та клас додатків різні. Дізнайтеся більше про клас додатків тут: rominirani.com/android-application-class
akshay7692

9

У свій build.gradle додайте цю залежність:

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

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

multiDexEnabled true

Замість того, щоб розширювати свій клас додатків із Application, продовжте його з MultiDexApplication ; подібно до :

public class AppConfig extends MultiDexApplication {

тепер вам добре піти! І якщо вам це потрібно, все MultiDexApplicationє

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


3

Крок 1: Змініть build.grade

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

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

Крок 2: Налаштування на клас програми

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

Крок 3: Змінення класних властивостей

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

Це спрацює !. Дякую.


Я отримую "Не вдається знайти символ для MultiDex". Хтось раніше стикався з цією проблемою?
Aung Myint Thein

3

Ось сучасний підхід станом на травень 2020 року з Android X.

Для minSdk> = 21

Вам нічого не потрібно робити. Усі ці пристрої використовують VM Android RunTime (ART), який підтримує мультидекс.

Для minSdk<21

У вашому модулі -рівні build.gradleпереконайтеся, що такі конфігурації заповнені:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

Потім ваші 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>

1

Додати в AndroidManifest.xml:

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

АБО

MultiDex.install(this);

у методі attachBaseContext вашого користувацького додатка

або ваша спеціальна програма розширить програму MultiDexApplication

додати multiDexEnabled = true у свій build.gradle

defaultConfig {
    multiDexEnabled true
}

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

@Harsha не рекомендує використовувати це, але спробуйте додати LargeHeap до файлу маніфесту <application android: largeHeap = "true"> </application>
Malik Abu Qaoud

android: largeHeap = "справжній" android: enableBackup = "true" додаються обидва
Харша

додайте це у файл gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Малік Абу Кауд

1

Спершу слід спробувати 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'
        }
    }
}

0

Якщо ви хочете включити мультидекс у своєму проекті, просто перейдіть на gradle.builder

і додайте це у свою залежність

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

тоді вам доведеться додати

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

// Enabling multidex support.
multiDexEnabled true}

Потім відкрийте клас та відкрийте його на додаток. Якщо ваш додаток використовує розширений клас програми, ви можете перекрити метод oncrete () та зателефонувати

   MultiDex.install(this) 

щоб увімкнути мультидекс.

і нарешті додайте у свій маніфест

 <?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
Що таке gradle.builder?
Чад Бінгем

файл Gradle, який знаходиться у вашому проекті студії Android
pavel

0

Усі відповіді вище є приголомшливими

Крім того, додайте це, інакше ваш додаток буде втрачатися як мій без будь-яких причин

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

0

За допомогою 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 або вище, мультидекс увімкнено за замовчуванням.

Тепер, якщо ви хочете позбутися багатьох питань, з якими стикаєтесь, намагаючись підтримати мультидекс, спершу спробуйте зменшити код, встановивши minifyEnabled true.


-2

просто додавання цього фрагменту в 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****
     }
}

-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.