О MultiDex много постов. Иногда я сталкивался с устранением ошибок, включая multiDexEnabled true
в разделе defaultConfig
моего build.gradle.
Но что именно это за функция? Каковы сценарии его использования?
О MultiDex много постов. Иногда я сталкивался с устранением ошибок, включая multiDexEnabled true
в разделе defaultConfig
моего build.gradle.
Но что именно это за функция? Каковы сценарии его использования?
Цитата из документации:
Файлы приложения 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
В одном файле .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
Dex означает исполняемый файл Dalvik, который процессор виртуальных машин Google (Dalvik) использует для обработки приложений Android. Android был создан с учетом небольших и простых приложений, и ограничения на один-единственный исполняемый файл Dalvik взяли крышу над ссылками на код в 65 536 методах. Из-за этой проблемы и того, как машина Dalvik обрабатывает выполнение кода, были некоторые проблемы с компиляцией и вызовом до интеграции Monkey Patch или MultiDex. Интеграция MultiDex в Android Studio позволяет разработчикам Android компилировать и выполнять кодовую базу с помощью более 65 536 методов!
Официальный сайт разработчика Android.
If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.
Когда ваше приложение и библиотеки, на которые оно ссылается, превышают 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>
Спасибо
Это также позволяет Google (и другим) применять DRM, скажем ... widevine, в фрагментах кода, где это вызывает проблемы у большинства не-разработчиков.