Что такое Android MultiDex?

111

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

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

Роберто Теллез Ибарра
источник

Ответы:

166

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

Файлы приложения 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
CommonsWare
источник
2
Есть идеи, насколько большой это будет кодовая база (LOC или приблизительное количество экранов)? Собираетесь ли вы достичь этого предела в простом приложении для 5-6 экранов, или это действительно намного дальше (например, 10-20 экранов), которое вы, вероятно, достигнете
марта
20
@Marchy: Обычно это происходит из-за добавления слишком большого количества библиотек. Проекту без библиотеки сложно достичь этого предела.
CommonsWare
3
У меня есть небольшое приложение, которое использует около 5 библиотек поддержки Google, а также Fabric.io и 2 или 3 других сторонних библиотеки, и мне приходится использовать multi-dex.
c.dunlap
1
есть ли недостатки включения multidex? почему бы не позволить этому по умолчанию?
Рафаэль Лима
1
@RafaelLima: Есть проблемы с безопасностью квази-бэкпорта multidex для устройств до Android 5.0. IIRC, это также может вызвать некоторые проблемы с вашим приложением, если вы пытаетесь использовать классы, которые находятся в еще не загруженном DEX-файле.
CommonsWare
43

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

В одном файле .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,5 тыс. Методов.
Google Play Services GCM 9.6.1 содержит 16,7 тыс. Методов.
Итак, если вы создали простое приложение Hello world с App Compat 24.2.1, вы уже 1/4 способ пересечь предел методов single dex

Рохит Сингх
источник
7

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

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

Фархана
источник
1

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

If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.
Масум
источник
1
Спасибо за ответ. Это вопрос 2015 года, с тех пор многое изменилось.
Роберто Теллез Ибарра,
-2

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

анония
источник