Почему добавление только multiDexEnabled работает нормально - PullRequest
0 голосов
/ 16 февраля 2020

Недавно я боролся с мультидексингом в android, и этот вопрос мне приходит в голову:

Чтобы включить мультидекс в android проекте

Если вы только и только добавляете это строка:

// gradle build config
multiDexEnabled true

Приложение будет компилироваться и нормально работать.
Но реальное решение заключается в следующем:

  • Добавить multiDexEnabled true
  • Добавить библиотеку поддержки androidx.multidex
  • Переопределить Application class.

Почему добавление только multiDexEnabled true работает и проект успешно выполняется? А как насчет двух других оставшихся шагов

Я что-то не рассматриваю?

Кстати, мой minSdkVersion равен 15

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Включить мультидекс для приложений с более чем 64К-методами Вот ссылка самой Google .

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

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

Более старые версии системы сборки сообщают о другой ошибке, что является признаком одной и той же проблемы:

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

Оба эти условия ошибки отображают общее число: 65536. Это число представляет общее число ссылок, которые могут быть вызваны кодом в одном файле байт-кода Dalvik Executable (DEX) , На этой странице объясняется, как обойти это ограничение, включив конфигурацию приложения, известную как multidex, которая позволяет вашему приложению создавать и читать несколько файлов DEX.

Об ограничении ссылки в 64 КБ

Android Файлы приложения (APK) содержат исполняемые файлы байт-кода в виде файлов Dalvik Executable (DEX), которые содержат скомпилированный код, используемый для запуска вашего приложения. Спецификация исполняемого файла Dalvik ограничивает общее количество методов, на которые можно ссылаться в одном DEX-файле, до 65 536, включая Android каркасных методов, библиотечных методов и методов в вашем собственном коде. В контексте информатики термин Кило К обозначает 1024 (или 2 ^ 10). Поскольку 65 536 равно 64 X 1024, этот предел называется «опорным пределом 64 КБ».

Поддержка мультидекса до Android 5.0

Версии платформа до Android 5.0 (уровень API 21) использует среду выполнения Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним файлом байт-кода classes.dex для каждого APK. Чтобы обойти это ограничение, вы можете добавить в ваш проект поддержку мультидекс-библиотеки:

dependencies {
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}

Если вы не используете AndroidX, вместо этого добавьте следующую зависимость библиотеки поддержки:

implementation 'com.android.support:multidex:1.0.3'
  1. Измените файл уровня модуля build.gradle , чтобы включить multidex и добавить библиотеку multidex в качестве зависимости, как показано здесь:
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

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

В зависимости от того, переопределяете ли вы класс Application, выполните одно из следующих действий:

Если вы не переопределите класс Application, отредактируйте файл манифеста, указав android: name в пометить следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

Если вы переопределите класс Application, измените его на расширение MultiDexApplication (если возможно) следующим образом:

public class MyApplication extends MultiDexApplication { ... }

Или, если вы переопределяете класс Application, но не можете изменить базовый класс, вы можете вместо этого переопределить метод attachBaseContext () и вызвать MultiDex.install (this), чтобы включить multidex

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}
0 голосов
/ 16 февраля 2020

Это происходит, когда ваше приложение превысило ограничение размера методов / dex (64 КБ).
Поскольку ваш minSdk равен 15, вы должны добавить MultiDex вручную, что не требуется для Api 21 +.


Для поддержки MultiDex в Pre-21
dependencies { implementation 'com.android.support:multidex:1.0.3' }* выполните следующее. 1007 *


Расширение класса вашего приложения MultiDexApplication

public class Application extends MultiDexApplication {}


Или же вы можете использовать Proguard для удаления неиспользуемых классов и методов, если вы не хотите использовать MultiDex вообще ..

...