Число ссылок на методы в файле .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 gradle, она отлично работает на обоих устройствах v4.2.2 и v5.0.

Сандип Сингх Рана
источник
1
developer.android.com/tools/building/multidex.html . проверить это
Рагхунандан
попробуйте использовать proguard по этой ссылке android-arsenal.com/details/1/337 определяет использование SugarORM с proguard
Shaan_B
19
Только что получил это после обновления до API 23. Просто невозможно быть продуктивным с Android. Каждый SDK ломает вещи. Каждое обновление AS ломает вещи. Сообщения об ошибках непригодны. КАК сломан. Мусор, мусор, мусор.
RunLoop
1
@RunLoop не теряй надежду .... Я обнаружил, что Android - лучшая из когда-либо разработанных платформ ... Моч. Гибкая и мощная .... Как ты запачкаешь руки в кодировании .... Это будет хорошо .... Каждое сообщение об ошибке полезно. Но нужно понимать сообщения
Сандип Сингх Рана
2
@Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.Я предлагаю лучший (и принятый) ответ!
Джон Гудвин

Ответы:

332

У тебя слишком много методов. Для dex может быть только 65536 методов .

Как и предполагалось, вы можете использовать поддержку multidex .

Просто добавьте эти строки в 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класс из библиотеки поддержки multidex в элемент приложения.

    <?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.
Если вы не можете сделать это, в вашем классе приложения переопределите attachBaseContextметод с помощью:

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

Другое решение состоит в том, чтобы попытаться удалить неиспользуемый код с помощью ProGuard. Настройте параметры ProGuard для своего приложения для запуска ProGuard и убедитесь, что у вас включено сжатие для сборок выпуска.

Габриэле Мариотти
источник
1
@ Override protected void attachBaseContext (Context 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

В андроиде / 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
Это только для леденцов или выше, не так ли?
Vic Torious
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. Внезапно я не смог больше скомпилировать. Это решение исправило это для меня. Как, черт возьми, ты решил это?
Маккару
4
К счастью, этот метод сработал, потому что в новых библиотеках компиляции слишком много методов (превышает 65536), а в старых нет. Так что это просто быстрое решение, рано или поздно вы должны исправить это, добавив поддержку multidex, как принятый ответ.
Цюань Нгуен
15

Вот что сработало для меня:

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

Используйте минимизацию и сжатие ресурсов, чтобы исправить это с помощью gradle и одновременно очистить свой код.

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }
Thunderstick
источник
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

Эта ошибка также может возникать при загрузке всех API-интерфейсов Google Play, когда вы используете только afew.

Как утверждает google: «В версиях сервисов Google Play до 6.5 вам приходилось собирать весь пакет API в ваше приложение. В некоторых случаях это усложняло сохранение количества методов в вашем приложении (включая рамки API, библиотечные методы и ваш собственный код) в пределах 65 536.

Начиная с версии 6.5 вы можете выборочно скомпилировать API-интерфейсы службы Google Play в свое приложение. "

Например, когда вашему приложению нужны play-services-maps, play-services-location. Вам нужно добавить только два 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 API нажмите здесь

Джеймс Кута Симию
источник
9

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

Поддержка Multidex до Android 5.0

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

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

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

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

Избегайте ограничения в 64К

  • Удалите неиспользуемый код с помощью ProGuard - включите сжатие кода

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

Если ваш minSdkVersion установлен на 21 или выше, все, что вам нужно сделать, это установить для multiDexEnabled значение true в файле 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'
}

Переопределите класс Application, измените его для расширения 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>
Basi
источник
8

Я столкнулся с той же проблемой, и для поддержки multidex вы должны помнить о minSdkVersion вашего приложения. Если вы используете minSdkVersion 21 или выше, просто напишите multiDexEnabled true, как это

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

Это работает для меня, и если вы используете minSdkVersion ниже 21 (ниже lolipop ), то вам нужно сделать две простые вещи

1. Сначала добавьте эту зависимость

скомпилируйте 'com.android.support:multidex:1.0.1'

в вашей сборке.

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

андроид: имя = "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>

Бинго, тогда он будет работать и в нижней версии .. :) Счастливого кодирования

Sudhansu
источник
1

Просто дополнительный комментарий, прежде чем добавлять поддержку multidex - убедитесь, что вы не добавляете ненужные зависимости.

Например, в официальном руководстве аналитики Facebook

В них четко указано, что вы должны добавить следующую зависимость:

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

на самом деле это весь FacebookSDK - поэтому, если вам нужна, например, только аналитика, вам нужно заменить ее на:

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

Частичные опции SDK для Facebook

Гал Ром
источник
Полностью согласен. В моем случае, например, мне просто нужна была кнопка «Войти с Facebook» и я использовал весь SDK facebook. Я заменил его на facebook-coreи facebook-loginи ошибка ушла.
Cleybertandre
0

Для меня работает обновление Gradle. Найдите обновление на веб-сайте Android, затем добавьте его в свой build.gradle (проект) следующим образом

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

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

androidXP
источник
0

Можно также попробовать это:

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

Надеюсь, это кому-нибудь поможет. Спасибо

Lazycoder_007
источник
0

**

Для разработчиков игр Unity

**

Если кто-то пришел сюда, потому что эта ошибка обнаружилась в их проекте Unity, перейдите в Файл-> Настройки сборки -> Настройки плеера -> Плеер. перейдите в «Параметры публикации» и на вкладке «Сборка» включите «Пользовательский шаблон запуска». путь будет показан под этим текстом. перейдите по пути и добавьте multiDexEnabled true следующим образом:

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}
PerhapsMister
источник
-1

Вы можете включить «Instant Run» в Android Studio, чтобы получить поддержку мультидекса.

Quang Vĩnh Hà
источник
-2

Сделайте это, это работает:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}
tejasri
источник
2
Пожалуйста, объясните свой ответ. Ответы только на код не рекомендуется на SO. Спасибо.
Геннадий Сапрыкин