Кількість посилань на метод у файлі .dex не може перевищувати 64 к API 17


154

Я будую додаток із бібліотекою SugarORM, але коли я намагаюся створити проект для API 17 (не перевіряв інших), він показує помилку збірки.

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

Але коли я будую цей проект для android v5.0 або вище, він працює добре. Якщо я видаляю залежність градусів від SugarORM, вона працює добре для обох пристроїв v4.2.2 та v5.0.



спробуйте використовувати Proguard це посилання android-arsenal.com/details/1/337 вказує на використання SugarORM з proguard
Shaan_B

19
Щойно це дісталося після оновлення до api 23. Виробляти Android з Android просто неможливо. Кожен sdk розбиває речі. Кожне оновлення до AS розбиває речі. Повідомлення про помилки непридатні ЯК зламаний. Сміття, сміття, сміття.
RunLoop

1
@RunLoop не втрачає надії .... Я виявив, що андроїд - найкраща платформа, яка коли-небудь була розроблена .... Moch Гнучка і потужна .... Як ви забрудите руки кодуванням .... це буде добре .... Кожне повідомлення про помилку є корисним. Але потрібно зрозуміти повідомлення
Sandeep Singh Rana

2
@Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.Я пропоную верхню (і прийняту) відповідь !.
Джон Гудвін

Відповіді:


331

У вас занадто багато методів. Для dex може бути лише 65536 методів .

Як пропонується, ви можете використовувати підтримку мультидекса .

Просто додайте ці рядки в module/build.gradle:

android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

Також Manifestдодайте MultiDexApplicationклас із бібліотеки підтримки мультидекса в елемент програми

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

            <!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

Якщо ви використовуєте свій власний Applicationклас, змініть батьківський клас з Applicationна MultiDexApplication.
Якщо ви не можете цього зробити, у вашому класі Application замініть attachBaseContextметод із:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}

Іншим рішенням є спробувати видалити невикористаний код за допомогою ProGuard - Налаштуйте параметри ProGuard для вашої програми для запуску ProGuard і переконайтеся, що ви активували скорочення для версій версій.


1
@Override захищений від невідомих attachBaseContext (контекст newBase) {super.attachBaseContext (newBase); MultiDex.install (це); } також перемогти
Сандіп Сінгх Рана

1
Клацнувши на клавіші MultiDexApplication, натиснувши Cmd, я бачу, що декомпільований файл .class вже виконує саме те, що ви описуєте опис attachBaseContext (). Тож не потрібно буде перекривати це знову, напевно, ..
Мете

4
Що робити, якщо я не маю занадто багато методів. У мене не так багато методів у моєму додатку. Я вважаю, що цього навіть не досягти.
Неонова ворона

6
Я зробив лише ці дві частини: "multiDexEnabled true" і компілював "com.android.support:multidex:1.0.0" у своєму файлі build.grandle. Мені не довелося нічого міняти у своєму файлі маніфестів, а також не робити інших речей, які ви згадали про переосмислення attachBaseContext тощо. Але ваше рішення вирішило проблему для мене! Дякую.
Хайме Монтоя

2
@NeonWarge Можливо, через ваші залежності. Можливо, ви включили цілі сервіси Google Play? Перевірте цю відповідь для деталей
mr5

132

В android / app / build.gradle

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

Помістіть це всередині своєї defaultConfig:

multiDexEnabled true 

це працює для мене


3
Це лише для Lollipop чи вище, чи не так?
Вік Сергій

1
Це робить збірку успішною, але програма виходить з ладу після запуску.
Васант

18

Я отримав це повідомлення про помилку, оскільки під час кодування моєї версії автоматичного оновлення проекту в моєму build.gradleфайлі:

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

Вирішіть це, виправивши версію:

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

2
Я створюю простий додаток, який працював чудово, поки я не спробував дотримуватися підручника Google Map Objects. Раптом я вже не зміг скласти. Це рішення зафіксувало це для мене. Як на землі ти це розробив?
маккаро

4
Цей метод на щастя спрацював, оскільки у нових бібліотеках компіляції є занадто багато методів (перевищує 65536), а у старих бібліотеках немає. Тож це просто швидке виправлення, рано чи пізно ви повинні виправити, додавши підтримку мультидекса, як прийнята відповідь.
Quan Nguyen

15

Це для мене працювало:

Це відбувається тому, що занадто багато невикористаних методів. Більшість цих методів надходять із включених бібліотек вашого build.gradle

Використовуйте мінімізовані та стискаючі ресурси, щоб виправити це за допомогою gradle та очистити код одночасно.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }

13

Змініть рівень build.gradle програми:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

це працювало для мене.


так, це стара проблема, але для останніх версій API нам потрібна лише multiDexEnabledопція, без залежностей або явних змін файлів
Hpsaturn

11

Ця помилка також може виникнути під час завантаження всіх служб Google Play apis, коли ви використовуєте лише afew.

Як зазначає google: "У версіях сервісів Google Play до 6.5 вам потрібно було скласти весь пакет API у свій додаток. У деяких випадках це ускладнювало утримання кількості методів у вашому додатку (у т.ч. рамкові API, бібліотечні методи та власний код) під лімітом 65 536.

З версії 6.5 ви можете замість цього вибірково компілювати API служби Google Play у свій додаток. "

Наприклад, коли вашому додатку потрібні карти-сервіси-карти, розташування-послуги-послуги. Вам потрібно додати лише два apis у вашому файлі build.gradle на рівні програми, як показано нижче:

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

Замість:

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

Для отримання повної документації та списку служб google play apis натисніть тут


9

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

Підтримка Multidex до Android 5.0

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

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

Підтримка Multidex для Android 5.0 та новіших версій

Android 5.0 (рівень 21) та новіших версій використовує час виконання, який називається ART, який спочатку підтримує завантаження декількох файлів DEX з файлів APK. Тому, якщо ваш minSdkVersion становить 21 або вище, то вам не потрібен мультидекс бібліотека підтримки .

Уникайте обмеження 64K

  • Видаліть невикористаний код за допомогою ProGuard - увімкніть скорочення коду

Налаштування мультидекса в додатку для

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

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

якщо для вашого minSdkVersion встановлено значення 20 або менше, вам потрібно використовувати бібліотеку підтримки multidex

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

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

Замініть клас програми, змініть його, щоб розширити MultiDexApplication (якщо можливо) наступним чином:

public class MyApplication extends MultiDexApplication { ... }

додати до файлу маніфесту

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

8

Я зіткнувся з тією ж проблемою, і для підтримки multidex ви повинні пам’ятати про minSdkVersion вашої програми. Якщо ви використовуєте minSdkVersion 21 або вище, просто напишіть multiDexEnabled так, як це

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

Це працює для мене, і якщо ви використовуєте minSdkVersion нижче 21 (нижче lolipop ), вам доведеться зробити дві додаткові прості речі

1. Спочатку додайте цю залежність

компілювати 'com.android.support:multidex:1.0.1'

у вашому build.gradle.

2. Останнє і друге додайте один цей рядок нижче до вашої програми в маніфесті

android: name = "android.support.multidex.MultiDexApplication"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Bingo тоді він буде працювати і в нижній версії .. :) Щасливе кодування


1

Лише побічний коментар. Перш ніж додавати підтримку для мультидекса, переконайтеся, що ви не додаєте зайвих залежностей.

Наприклад, в офіційному посібнику з аналітики Facebook

Вони чітко зазначають, що слід додати таку залежність:

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

що насправді є всім FacebookSDK - тому якщо вам потрібен, наприклад, лише Analytics, вам потрібно замінити його на:

implementation 'com.facebook.android:facebook-core:5.+'

Часткові параметри SDK у Facebook


Повністю згоден. Наприклад, у моєму випадку мені просто потрібна була кнопка «логін з фейсбуком» і використовувала весь facebook sdk. Я замінив його на, facebook-coreі facebook-loginпомилка пішла.
cleybertandre

0

Для мене працює оновлення Gradle. Подивіться на оновлення на веб-сайті Android, а потім додайте його у свій build.gradle (Project), як це

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

потім синхронізувати проект з файлом gradle, плюс це може статися іноді через java.exe (у моєму випадку) просто змусити вбити java.exe з диспетчера завдань у Windows, а потім перезапустити програму


0

Можна також спробувати це:

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

Сподіваюся, це комусь допоможе. Дякую


0

**

Для розробників ігор Unity

**

Якщо хтось прийшов сюди, тому що ця помилка виявилась у проекті Unity, перейдіть у меню Файл-> Налаштування збірки -> Налаштування гравця -> Програвач. перейдіть до "Налаштування публікації" та на вкладці "Збірка" увімкніть "Спеціальний шаблон Gradle Launcher". під цим текстом буде показаний шлях. перейдіть до контуру та додайте true multiDexEnabled, як це:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}

-1

ви можете ввімкнути "Миттєвий запуск" в Android Studio, щоб отримати підтримку в декількох випадках.


-2

Зробіть це, це працює:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

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