Количество ссылок на методы в файле .dex не может превышать 64k API 17

Я создаю приложение с помощью библиотеки 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

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

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

Просто добавьте эти строки в module/build.gradle:

android {

    defaultConfig {
        ...

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

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

Также в свой 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 your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
            android:name=".YourCustomApplicationClass">

            ...
        </application>
    </manifest>

переопределить метод attachBaseContext

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

Если вы используете свой собственный класс Application, измените родительский класс с Application на MultiDexApplication.

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

Ответ 2

В 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

Я получил это сообщение об ошибке, потому что, кодируя мою версию автоматического обновления моего проекта в моем файле 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'
}

Ответ 4

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

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

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

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

Ответ 5

Эта ошибка также может возникать при загрузке всех сервисов google play, когда вы используете их только.

Как указано 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 нажмите здесь

Ответ 6

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

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

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

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

compile '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>

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

Ответ 7

Когда ссылки на приложения превышают 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>

Ответ 8

Для меня Обновление Gradle works.Look для обновления на Android-сайте затем добавьте его в свой build.gradle(Project), как этот

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

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

Ответ 9

Можно также попробовать следующее:

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

Надеюсь, это поможет кому-то. Благодаря

Ответ 10

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

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

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

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

Подробнее здесь - https://developer.android.com/studio/build/multidex

Ответ 11

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

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

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

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

который фактически является целым FacebookSDK - поэтому, если вам нужна, например, только аналитика, вам нужно заменить ее на:

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

Параметры частичного SDK Facebook

Ответ 12

для пользователя-флаттера это можно решить с помощью 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
    }

это сработало для меня.

Ответ 13

вы можете включить "Instant Run" в Android Studio, чтобы получить поддержку multidex.

Ответ 14

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

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