Ошибка: невозможно разместить запрошенные классы в одном файле dex. Попробуйте предоставить список main-dex. # методы: 72477> 65536


310

Я хочу добавить слитные службы определения местоположения, но это показывает мне некоторую ошибку. Помоги мне.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.example.adil.bloodbankapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-auth:11.8.0'
    compile 'com.google.firebase:firebase-database:11.8.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'junit:junit:4.12'
    compile 'com.android.support:design:26.1.0'
    compile 'com.github.joielechong:countrycodepicker:2.1.5'
    compile 'com.jaredrummler:material-spinner:1.2.4'
    compile 'hanks.xyz:htextview-library:0.1.5'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.google.android.gms:play-services:11.8.0'
}


apply plugin: 'com.google.gms.google-services'

Ответы:


386

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

implementation 'com.android.support:multidex:1.0.3'

После этого добавьте defaultConfig gradle приложения:

multiDexEnabled true

Ваше приложение должно быть типа Multidex. Вы должны написать его в манифесте:

android:name=".MyApplication"

«MyApplication» должен быть либо классом Multidex, либо расширять его.


5
Так что MyApplication extends android.support.multidex.MultiDexApplication?
запрет геоинженерии

2
Я попробовал это решение, но в итоге столкнулся с новой проблемой: stackoverflow.com/questions/49518115/…
ban-geoengineering

22
Вот официальная страница документации для Android, на которой более подробно объясняется, почему это происходит и как сделать лучшую релиз-версию apk: developer.android.com/studio/build/multidex
Vrakfall

2
это не хороший способ решить проблему, лучше удалить неиспользуемый код и библиотеки, реорганизовать код вашего проекта
user25

5
отсутствие 80000 методов было бы хорошим решением, если бы в библиотеках googles не было 80000 методов (единственная причина, по которой они добавили multidex, заключалась в том, что их собственная библиотека сервисов, которую они хотели, чтобы все использовали, имела десятки тысяч методов).
Ласси Киннунен

195

Я исправил свою проблему с помощью решения ниже:

В файле сборки Gradle добавьте зависимость:

реализация 'com.android.support:multidex:1.0.3'

А затем в разделе «defaultConfig» добавьте:

multiDexEnabled true


8
Работал на меня. Подробные инструкции по настройке здесь: developer.android.com/studio/build/multidex#mdex-gradle
Алекс Бурдусел

Включение поддержки multidex не требуется в большинстве приложений. Вы должны рассмотреть возможность удаления неиспользуемых библиотек, см. Мой ответ ниже.
MG Developer

106

изменить ваше приложение или модуль build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 21 <----- *here
        targetSdkVersion 26
        multiDexEnabled true <------ *here
    }
    ...
}

Согласно официальной документации

Поддержка Multidex для Android 5.0 и выше

Android 5.0 (уровень API 21) и выше использует среду выполнения под названием ART, которая изначально поддерживает загрузку нескольких файлов DEX из файлов APK. ART выполняет предварительную компиляцию во время установки приложения, которая сканирует файлы classesN.dex и компилирует их в один файл .oat для выполнения устройством Android. Поэтому, если ваш minSdkVersion 21 или выше, вам не нужна библиотека поддержки multidex.

Для получения дополнительной информации о среде выполнения Android 5.0, прочитайте ART и Dalvik.

https://developer.android.com/studio/build/multidex


59

Что такое файлы dex: файлы приложения Android (APK) содержат исполняемые файлы байт-кода в виде файлов Dalvik Executable (DEX), которые содержат скомпилированный код, используемый для запуска вашего приложения.

Причина этого исключения: спецификация DEX ограничивает общее количество методов, на которые можно ссылаться в одном файле DEX, до 65 536 (ограничение ссылки 64 КБ), включая методы платформы Android, библиотечные методы и методы в вашем собственном коде.

Шаг 01. Добавьте следующую зависимость следующим образом

Для пользователей не Androidx,

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true  //ADD THIS LINE
}

Для пользователей Androidx,

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'
}
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  //ADD THIS LINE
    }

Шаг 02:

После добавления этих проектов Sync и перед запуском проекта убедитесь, что Построили проект перед запуском. в противном случае вы получите исключение.


53

Вы можете следить за этим .

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

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

Если ваш minSdkVersion установлен на 21 или выше, все, что вам нужно сделать, это установить для multiDexEnabled значение true в файле build.gradle уровня модуля, как показано здесь:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

34

когда вы используете зависимости, чтобы ваши методы увеличились! У Google есть решение для этого. это называется Multidex!

ПРИМЕЧАНИЕ: убедитесь, что min SDK превышает 14.

в вашем build.gradle:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}



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

ДЛЯ ИСПОЛЬЗОВАНИЯ Android®:

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

Для получения дополнительной информации перейдите по оригинальной ссылке:

https://developer.android.com/studio/build/multidex


Отличное решение! исправил мою проблему
Вайбхав Херугу

29

Привет проблема здесь удалить его

compile 'com.google.android.gms:play-services:11.8.0'

Зачем?

Примечание: не используйте комбинированную цель play-services. Это приносит десятки библиотек, вздутие живота вашего приложения. Вместо этого укажите только определенные API-интерфейсы сервисов Google Play, которые использует ваше приложение.

И используйте то, что вам нужно. https://developers.google.com/android/guides/setup

Как для службы определения местоположения

com.google.android.gms:play-services-location:11.8.0

Для облачных сообщений

com.google.android.gms:play-services-gcm:11.8.0

да, теперь я столкнулся с проблемой, моя кнопка запуска отключена.
Мухаммед Адил Саттар

27

Если вы строите DEBUG APK , просто добавьте:

debug {
            multiDexEnabled true
        }

внутри buildTypes

и если вы создаете RELEASE APK , добавьте multiDexEnabled trueв блок релиза как

release {
                ...
                multiDexEnabled true
                ...
        }

25

Для флаттер-проектов вы также можете решить эту проблему

откройте свой \ android \ app \ build.gradle

у вас должно быть следующее:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Если ваш minSdkVersion установлен на 21 или выше, все, что вам нужно сделать, это установить для multiDexEnabled значение true в defaultConfig. Как это

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true 

    }

}

если ваш minSdkVersion установлен в 20 или ниже, добавьте multiDexEnabled true в defaultConfig

И определить реализацию

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

В конце вы должны иметь:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  // added this
    }

}

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

Для получения дополнительной информации читайте это: https://developer.android.com/studio/build/multidex


1
hhahaha! Я счастлив, что это помогло вам!
Ричард

18

Просто сделайте следующее:

build.gradle

(module:app)


android {
            ....
      defaultConfig {
              multiDexEnabled true // enable mun
      }
}

И добавьте ниже зависимость в вашем build.gradleфайле уровня приложения

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

13
multiDexEnabled true

Пожалуйста, попробуйте добавить это в ваше приложение defaultConfig {}. Это поможет мне решить проблему


12

В файле сборки Gradle добавьте зависимость:

implementation 'com.android.support:multidex:1.0.2'

или

implementation 'com.android.support:multidex:1.0.3'

или

implementation 'com.android.support:multidex:2.0.0'

А затем в разделе «defaultConfig» добавьте:

multiDexEnabled true

Под targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Теперь, если вы столкнулись с этой ошибкой

Ошибка: не удалось разрешить: multidex-instrumentation Открыть файл

Вам нужно изменить свой gradle на 3.0.1

        classpath 'com.android.tools.build:gradle:3.0.1'

И поместите следующий код в файл gradle-wrapper.properties

distributionUrl = https: //services.gradle.org/distributions/gradle-4.1-all.zip

в заключение

добавить класс Applition в проект и представить его в AndroidManifest, который расширяется от MultiDexApplication

public class App extends MultiDexApplication {

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

}

Сначала запустите проект, чтобы создать ошибку, затем очистите проект

Наконец, перезапустите проект и наслаждайтесь им


У меня все еще есть «Не удалось разрешить: мультидекс-инструментарий»
Makalele

11

Если вы используете minifyEnabled с Proguard, вам, скорее всего, не нужно будет включать multi-dex. Я согласен с MG Developer, что вы должны стараться избегать multi-dex, если это возможно. Моим решением было включить multi-dex только для отладочных сборок. minifyEnabled решает проблему для релизных сборок

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        // getting error: Cannot fit requested classes in a single dex file.  # methods: 65537 > 65536
        // https://developer.android.com/studio/build/multidex
        // minifyEnabled true (used with release) will fix this by getting rid of unused method calls, but this will hide debugging info on crash
        multiDexEnabled true
    }
}

Каковы некоторые недостатки использования мультидекса, если это необходимо?
isJulian00

1
Очень хороший вопрос, на который у меня нет ответа. Если у вас их нет, прочитайте следующее: на developer.android.com/studio/build/multidex#mdex-gradle Похоже, что для API> = 21 проблем не возникает. Для <21, кажется, Android должен сделать некоторую причудливую работу, которая потенциально может иметь проблемы. Так как многие люди должны включить это, я предполагаю, что в Android все работает хорошо, поэтому я бы не стал сильно беспокоиться об этом. Мне просто нравится быть консервативным, где это возможно.
Эрни Томасон

10

Я понятия не имею, почему, может быть, это потому, что я разрабатываю в Kotlin, но чтобы исправить эту ошибку, мне, наконец, нужно создать класс, который расширяется MultiDexApplicationследующим образом:

class MyApplication : MultiDexApplication() {
}

и по моему Manifest.xmlя должен установить

<application
        ...
        android:name=".MyApplication">

чтобы никого не смущать я тоже делаю

multiDexEnabled true
implementation 'com.android.support:multidex:1.0.3'

для Android это также работает для меня:

implementation 'androidx.multidex:multidex:2.0.0'

...

<application android:name="android.support.multidex.MultiDexApplication">

у меня не работает


не забудьте сделать проект чистым и перестроить после установки multiDexEnabled true. Это исправило это для меня.
псевдозач

Изменение атрибута имени приложения в манифесте также не сработало, но включение multiDex в файле сборки gradle и добавление реализации сработало. Кажется, что менять тег манифеста сейчас необязательно?
Коди

9

У вас слишком много методов. Файл Android dex имеет ограничение в 65536 методов, которые вам разрешено иметь.

Для начала, если вам не нужен весь API Google Play Services и только местоположение, замените

compile 'com.google.android.gms:play-services:11.8.0'

с участием

compile 'com.google.android.gms:play-services-location:11.8.0'

Вы можете обратиться к этой странице, чтобы узнать, как этого избежать, или, если необходимо, разрешите больше: https://developer.android.com/studio/build/multidex.html.


да, но это не та реальная проблема. Я думаю, что я добавляю такие же зависимости. Один для Firebase и другой для определения местоположения. Проверьте ниже две строки.
Мухаммед Адиль Саттар


6

добавьте свой файл android / app / build.gradle

 defaultConfig {
        applicationId "com.ubicacion"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // ✔
        missingDimensionStrategy 'react-native-camera', 'general'
    }

5

Я столкнулся с этой ошибкой дважды, и решение для этого есть; Проверьте файл приложения, чтобы увидеть ваш целевой SDK, если он 20 или выше, просто добавьте одну строку в вашdefaultconfig { multiDexEnabled true }

Иначе, если ваш targetSDK меньше 20, добавьте строку в defaultConfig, а также добавьте зависимость

implementation 'com.android.support:multidex:1.0.3'.

Проверьте эту ссылку для более.

https://developer.android.com/studio/build/multidex#mdex-gradle


5

Использование поддержки multidex должно быть последним средством. По умолчанию сборка Gradle будет собирать тонну транзитивных зависимостей для вашего APK. Как рекомендуется в Документах для разработчиков Google , сначала попытайтесь удалить ненужные зависимости из вашего проекта.

С помощью командной строки перейдите к корневому каталогу проектов Android. Вы можете получить дерево зависимостей компиляции следующим образом.

gradlew app:dependencies --configuration debugCompileClasspath

Вы можете получить полный список дерева зависимостей

gradlew app:dependencies

введите описание изображения здесь

Затем удалите ненужные или транзитивные зависимости из вашего приложения build.gradle. Например, если ваше приложение использует зависимость, называемую com.google.api-client, вы можете исключить ненужные вам библиотеки / модули.

implementation ('com.google.api-client:google-api-client-android:1.28.0'){
   exclude group: 'org.apache.httpcomponents'
   exclude group: 'com.google.guava'
   exclude group: 'com.fasterxml.jackson.core'
   }

Затем в Android Studio выберите «Создать»> «Анализировать APK» ... Выберите файл APK выпуска / отладки, чтобы просмотреть его содержимое. Это даст вам методы и количество ссылок следующим образом.

Проанализировать APK


1
Каковы некоторые недостатки использования мультидекса, если это необходимо
isJulian00

2

В сборке: приложение

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.proyecto.marketdillo"
    minSdkVersion 14
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0-rc02'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.android.support:multidex:1.0.3'
}
apply plugin: 'com.google.gms.google-services'

1
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.dev.khamsat"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }

этого было достаточно для меня тоже.
nyxee

1

Ошибка вызвана количеством зависимостей классов, которые есть в файле Gradle вашего приложения. Если классы превышают 72 400, вы можете использовать мультидекс в качестве решения для лучшей обработки индексации файлов. Узнайте больше здесь: https://developer.android.com/studio/build/multidex

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.