Что такое Android MultiDex?

О MultiDex много постов. Иногда я сталкивался с устранением ошибок, включая multiDexEnabled true в разделе defaultConfig моего build.gradle.

Но что именно это за функция? Каковы сценарии его использования?


person Roberto Tellez Ibarra    schedule 07.11.2015    source источник


Ответы (6)


Цитата из документации:

Файлы приложения Android (APK) содержат исполняемые файлы байт-кода в виде файлов Dalvik Executable (DEX), которые содержат скомпилированный код, используемый для запуска вашего приложения. Спецификация исполняемого файла Dalvik ограничивает общее количество методов, на которые можно ссылаться в одном файле DEX, до 65 536, включая методы платформы Android, методы библиотеки и методы в вашем собственном коде. Чтобы преодолеть этот предел, необходимо настроить процесс сборки приложения для создания более одного файла DEX, известного как конфигурация multidex.

Итак, особенность такова: она позволяет компилировать ваше сложное приложение. Сценарии для его использования - это когда ваше приложение не может быть скомпилировано из-за превышения лимита ссылок на метод DEX в 64 КБ. Это выглядит как ошибка сборки, например:

Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
person CommonsWare    schedule 07.11.2015
comment
Есть идеи, насколько большой это будет кодовая база (LOC или приблизительное количество экранов)? Собираетесь ли вы достичь этого предела в простом приложении для 5-6 экранов или это действительно намного дальше (например, 10-20 экранов), которое вы, вероятно, достигнете - person Marchy; 15.09.2016
comment
@Marchy: Обычно это происходит из-за добавления слишком большого количества библиотек. Проекту без библиотеки сложно достичь этого предела. - person CommonsWare; 15.09.2016
comment
У меня есть небольшое приложение, которое использует около 5 библиотек поддержки Google, а также Fabric.io и 2 или 3 других сторонних библиотеки, и мне приходится использовать multi-dex. - person c.dunlap; 20.04.2017
comment
есть ли недостатки включения multidex? почему бы не позволить этому по умолчанию? - person Rafael Lima; 18.06.2019
comment
@RafaelLima: Есть проблемы с безопасностью квази-бэкпорта multidex для устройств до Android 5.0. IIRC, это также может вызвать некоторые проблемы с вашим приложением, если вы пытаетесь использовать классы, которые находятся в еще не загруженном файле DEX. - person CommonsWare; 18.06.2019
comment
@Marchy для справки, приложение Instagram - single-dex - person Saikat Dey; 28.05.2021

Это так просто

В одном файле .dex может быть 65 536 методов (ссылок), поэтому, если количество ссылок превышает 65 536, вы выбираете multidex.

Больше объяснений!

Приложение Android компилируется в файл .dex, который, в свою очередь, архивируется в один файл .apk.
DVM (виртуальная машина Dalvik) использует файл / файлы .dex для выполнения байт-кодов.

Почему количество ссылок превышает 65 536 ограничений?
Написанные вами методы + методы Android Framework + методы сторонних библиотек (например, Volley, Retrofit, Facebook SDK и т. д.).
Я где-то читал
App Compat 24.2.1 содержит 16,5k методов
Google Play Services GCM 9.6.1 содержит 16,7k методов
Итак, если вы создали простое приложение Hello world с App Compat 24.2.1, вы уже 1/4 способа пересекли предел методов single dex

person Rohit Singh    schedule 24.10.2017

Что такое MultiDex в Android?

Dex означает исполняемый файл Dalvik, который процессор виртуальных машин Google (Dalvik) использует для обработки приложений Android. Android был создан с учетом небольших и простых приложений, и ограничения на один-единственный исполняемый файл Dalvik взяли крышу над ссылками на код в 65 536 методах. Из-за этой проблемы и того, как машина Dalvik обрабатывает выполнение кода, были некоторые проблемы с компиляцией и вызовом до интеграции Monkey Patch или MultiDex. Интеграция MultiDex в Android Studio позволяет разработчикам Android компилировать и выполнять кодовую базу с помощью более 65 536 методов!

person Farhana Naaz Ansari    schedule 09.03.2018

Официальный сайт разработчика Android.

If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.
person Masum    schedule 14.07.2020
comment
Спасибо за ответ. Это вопрос 2015 года, с тех пор многое изменилось. - person Roberto Tellez Ibarra; 15.07.2020

Когда ваше приложение и библиотеки, на которые оно ссылается, превышают 65 536 методов, возникает ошибка сборки, указывающая на то, что ваше приложение достигло предела архитектуры сборки Android

Как включить MultiDex в вашем проекте

Bulid.gradle

 defaultConfig {
    applicationId "******"
    minSdkVersion 21
    targetSdkVersion 30
    versionCode 8
    versionName "05.15.21.8"
    multiDexEnabled true

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}


    dependencies {
    implementation 'com.android.support:multidex:1.0.3'
}

наследовать MultiDexApplication

    public class App extends MultiDexApplication {

    private static App instance;

    @Override
    public void onCreate() {
        MultiDex.install(this);
        super.onCreate();
        instance = this;
    }

    public static App getInstance ()
    {
        return instance;
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }

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

В вашем манифесте

     <application
     android:name=".App"
 </application>

Спасибо

person Kumar Santanu    schedule 21.04.2021

Это также позволяет Google (и другим) применять DRM, скажем ... widevine, в фрагментах кода, где это вызывает проблемы у большинства не-разработчиков.

person anony    schedule 16.01.2020