Що таке Android MultiDex?


111

Існує багато публікацій про MultiDex. Іноді у мене виникають помилки, в тому числі multiDexEnabled trueв defaultConfigрозділі мого build.gradle.

Але, в чому саме полягає ця особливість? Які сценарії його використання?

Відповіді:


166

Цитування документації :

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

Отже, особливість така: вона дозволяє складати ваш складний додаток. Сценарії його використання - це коли ваша програма не може компілюватись із-за досягнення межі 64K DEX. Це відображається як помилка збірки, наприклад:

Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

2
Будь-яка ідея, якою великою буде ця кодова база (LOC, або груба кількість екранів)? Чи вдасться ви досягти цієї межі у простому додатку на 5-6 екранів чи це насправді набагато далі (тобто: 10-20 екранів), що ви, швидше за все, потрапите на нього
березня,

20
@Marchy: Зазвичай це пов'язано з додаванням занадто багато бібліотек. Проекту без бібліотеки важко досягти цієї межі.
CommonsWare

3
У мене є невелике додаток, яке використовує близько 5 бібліотек підтримки Google, а також Fabric.io та 2 або 3 інших сторонніх бібліотек, і мені потрібно використовувати мультидекс.
c.dunlap

1
Чи є недоліки включення мультидекса? чому б не допустити, щоб це було правдою як за замовчуванням?
Рафаель Ліма

1
@RafaelLima: Існують проблеми із безпекою щодо квазі-резервного підключення мультидекса для пристроїв до Android 5.0. IIRC, він також може спричинити деякі проблеми з вашим додатком, якщо ви намагаєтесь використовувати класи, які є ще не завантаженим файлом DEX.
CommonsWare

43

Це так просто, як це

Один файл .dex може мати 65536 методів (посилань), тому якщо кількість посилань перевищує 65 536, ви переходите до мультидекса.

Більше пояснення!

Програма для андроїд компілюється у файл .dex, який, у свою чергу, перетворюється на один файл .apk.
DVM (Dalvik Virtual Machine) використовує файл / файли .dex для виконання байт-кодів.

Через що кількість посилань перевищує 65 536 лімітів?
Методи, написані вами + методи Android Framework + методи сторонніх бібліотек (наприклад, Volley, Retrofit, Facebook SDK тощо).
Я прочитав "десь"
App Compat 24.2.1 містить 16,5 тис. Методів
Google Play Services GCM 9.6.1 містить методи 16,7k.
Отже, якщо ви створили просту програму Hello world, яка має App Compat 24.2.1, ви вже 1/4 спосіб перетнути межу методів єдиного dex


7

Що таке MultiDex в Android?

Dex розшифровується як Dalvik Executable, який використовує процесор віртуальної машини Google (Dalvik) для обробки програм Android. Android був побудований з невеликими і простими програмами на увазі, і обмеження в одному одному Dalvik Executable закріпили дах кодових посилань 65 656 методів. Через цю проблему та спосіб, яким машина 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, у фрагментах коду, де це створює проблеми для більшості не розробників ..

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.