Как включить мультиплексирование с помощью новой библиотеки поддержки Android Multidex

143

Я хочу использовать новую библиотеку поддержки Multidex, чтобы преодолеть ограничение на количество методов для одного из моих приложений.

В Android Lollipop Google представила библиотеку поддержки multidex, которая упрощает multidex.

Какие шаги необходимы для использования этой библиотеки и создания моего приложения с поддержкой multidex?

Януш
источник
multidex поддерживает стороннюю библиотеку для вашего приложения
Кешав Гера

Ответы:

301

Редактировать:

Android 5.0 (уровень API 21) и выше использует ART, который поддерживает мультиплексирование. Поэтому, если вам minSdkVersion21 или больше, библиотека поддержки 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 {

}

Для получения дополнительной информации это хорошее руководство.

Чад Бингэм
источник
2
Если вы используете новые инструменты для сборки, это определенно лучший вариант.
Януш
1
@ 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'
Chad Bingham
3
Как насчет того, чтобы мы не использовали класс приложения? Достаточно ли добавления android:name="android.support.multidex.MultiDexApplication"в applicationтег AndroidManifest.xml?
Бадди
1
компилировать com.android.support:multidex:1.0.1 в 23 не нужно
Навид Ахмад,
3
@NaveedAhmad, согласно документации для разработчиков Google: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy 03
44

Чтобы запустить мультидексинг, необходимо выполнить следующие шаги:

Добавьте в проект android-support-multidex.jar. Банку можно найти в папке Android SDK / 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 создать мультидексированный 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'
      }
   }
}

Более подробную информацию можно найти в блоге Алекса Липова .

Януш
источник
9
как я могу использовать это без градиента?
lacas
3
@Janusz можно ли использовать опцию multidex без градиента?
Devrim
1
Я не думаю, что это возможно без градиента.
Janusz
5
Что такое исправление Eclipse Ant, а не gradle?
PortFilder
Мой проект не создает файл Gradle, я создал его и выполнил ваши шаги, но у меня он не работает
BaDo
17

ПРОСТО, чтобы включить мультидекс нужно ...

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>
Smoothumut
источник
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);
    }
}
Мохаммад Реза
источник
7

build.gradle

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

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
Исаак Осипович Дунаевский
источник
5

Вот актуальный подход по состоянию на октябрь 2020 года для Android X. Это взято из документации Android « Включить multidex для приложений с более чем 64 КБ методов ».

Для minSdk> = 21

Вам не нужно ничего делать. Все эти устройства используют виртуальную машину Android RunTime (ART), которая изначально поддерживает 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>
Джеймсон
источник
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. Измените grade.properties

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

Это будет работать!. Спасибо.

sonnv1368
источник
Я получаю сообщение «Не могу найти символ для MultiDex». Кто-нибудь раньше сталкивался с этой проблемой?
Aung Myint Thein
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>
Малик Абу Кауд,
android: largeHeap = "true" android: allowBackup = "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'
        }
    }
}
Мойзес Апаза Q
источник
1

С androidx классические библиотеки поддержки больше не работают.

Простое решение - использовать следующий код

В вашем build.gradleфайле

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

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

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

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

Если ваше приложение ориентировано на API 21 или выше, multidex включен по умолчанию.

Теперь, если вы хотите избавиться от многих проблем, с которыми вы сталкиваетесь при поддержке multidex, сначала попробуйте использовать сжатие кода путем установки minifyEnabled true.

майанк1513
источник
0

Если вы хотите включить multi-dex в свой проект, просто перейдите в gradle.builder

и добавьте это в свою зависимость

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

тогда вам нужно добавить

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

// Enabling multidex support.
multiDexEnabled true}

Затем откройте класс и расширьте его до Application. Если ваше приложение использует расширяет класс 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> 
Павел
источник
1
Что есть gradle.builder?
Chad Bingham,
ваш файл gradle, который находится в вашем проекте студии Android
Павел
0

Все ответы выше потрясающие

Также добавьте это, иначе ваше приложение вылетит, как мое, без какой-либо причины

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Абхишек Матур
источник
-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);
    }
}
lat_long
источник