Помилка. Неможливо розмістити запитувані класи в одному файлі dex. Спробуйте надати список основного dex. # методи: 72477> 65536


309

Я хочу додати послуги плавного розташування, але це показує мені деяку помилку. Допоможи мені.

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'

Відповіді:


385

Жодна відповідь, яку вони вам дали, не була вичерпною. Проблема полягає в мультидексі. Ви повинні додати бібліотеку в ступінь програми:

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

Після цього додайте у defaultConfig градації програми:

multiDexEnabled true

Ваша заявка повинна бути типу Multidex. Ви повинні написати це в маніфесті:

android:name=".MyApplication"

"MyApplication" повинен бути або класом Multidex, або він повинен розширювати його.


5
Так MyApplication extends android.support.multidex.MultiDexApplication?
заборона-геоінженерія

2
Я спробував це рішення, але закінчую цю нову проблему: stackoverflow.com/questions/49518115/…
заборона-геоінженерія

22
Ось офіційна сторінка doc для android, яка пропонує більше пояснень, чому це відбувається, і як зробити кращу версію apk: developer.android.com/studio/build/multidex
Vrakfall

2
це не гарний спосіб вирішити проблему, краще видалити невикористаний код та бібліотеки,
перефактуруйте

5
відсутність 80000 методів було б прекрасним рішенням, якби в бібліотеках googles не було 80000 методів (ціла причина, чому вони додали мультидекс, тому що їх власна бібліотека служб, яку вони хотіли, щоб кожен мав десятки тисяч методів).
Лассі Кіннунен

194

Я вирішив свою проблему з рішенням нижче:

У файл збирання 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 (рівень 21) та новіших версій використовує час виконання під назвою ART, який в основному підтримує завантаження декількох файлів DEX з файлів APK. ART виконує попередню компіляцію під час встановлення програми, яка сканує файли classN.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, до 65536 (посилальний ліміт 64K) - включаючи рамкові методи 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:

Після додавання цих проектів синхронізації та перед запуском проекту обов’язково побудуйте проект перед запуском. інакше ви отримаєте виняток.


53

Ви можете слідувати цьому .

Версії платформи до Android 5.0 (рівень 21 API) використовують час виконання програми Dalvik для виконання коду програми. За замовчуванням Dalvik обмежує програми лише одним файлом байт-коду class.dex на APK. Щоб подолати це обмеження, ви можете додати до свого проекту бібліотеку підтримки multidex:

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

Якщо для вашого minSdkVersion встановлено 21 або вище, все, що вам потрібно зробити, це встановити multiDexEnabled на істину у файлі build.gradle на рівні модуля, як показано тут:

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

33

коли ви використовуєте залежності, то ваші методи зросли! google має рішення для цього. що називається Multidex!

ПРИМІТКА: переконайтеся, що мінімум SDK перевищує 14.

у вашому build.gradle:

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



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

ДЛЯ ВИКОРИСТАННЯ androidX:

 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'

чому?

Примітка: Не використовуйте об'єднану ціль відтворення послуг. Він об'єднує десятки бібліотек, роздуваючи вашу заявку. Замість цього вкажіть лише конкретні API 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

і якщо ви будуєте APELEASE 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
хахаха! Я щаслива, що це допомогло тобі!
Річардд

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-прилад

Потрібно змінити градус на 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, вам, ймовірно, не потрібно буде вмикати мультидекс. Я погоджуюся з MG Developer, що вам слід спробувати уникати мультидексів, якщо це можливо. Моє рішення полягало в тому, щоб увімкнути мультидекс лише для налагодження. 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

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

class MyApplication : MultiDexApplication() {
}

і в моєму Manifest.xmlя повинен встановити

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

щоб нікого не плутати, я також роблю:

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

для androidx це також працює для мене:

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 і лише місцеположення, замініть

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

Все, що мені потрібно було зробити, було встановити Мінімальну версію SDK до 21 у Файл> Структура проекту> Додаток> Аромати


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

Я зіткнувся з цією помилкою двічі, і рішення для цього є; Перевірте, чи ви додаєте файл gradle програми, щоб побачити цільовий 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

Застосування мультидекса має бути крайнім засобом. За замовчуванням збірка gradle збирає тону перехідних залежностей для вашого APK. Як рекомендовано в Документах розробників Google , спочатку спробуйте усунути непотрібні залежності зі свого проекту.

За допомогою командного рядка перейдіть до програми Android Root. Ви можете отримати дерево залежності компіляції наступним чином.

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.