Превышен лимит 64k ​​на более старых API, чем леденец, но не новый

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

Может быть, поскольку на старых версиях поддерживаются библиотеки поддержки?

Это моя градация:

apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion '23.0.2' lintOptions { checkReleaseBuilds true // Or, if you prefer, you can continue to check for errors in release builds, // but continue the build even when errors are found: abortOnError false } defaultConfig { applicationId "com.domain.myapp" minSdkVersion 16 targetSdkVersion 23 versionCode 27 versionName "1.2" // Vector compat vectorDrawables.useSupportLibrary = true } buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } } dependencies { compile files('libs/commons-io-2.4.jar') compile files('libs/activation.jar') compile files('libs/additionnal.jar') compile files('libs/mail.jar') compile project(':libraries:preferencefragment') // Gmail API compile('com.google.api-client:google-api-client-android:1.20.0') { exclude group: 'org.apache.httpcomponents' } compile('com.google.apis:google-api-services-gmail:v1-rev29-1.20.0') { exclude group: 'org.apache.httpcomponents' } // Play Services compile 'com.google.android.gms:play-services-location:8.4.0' compile 'com.google.android.gms:play-services-maps:8.4.0' compile 'com.google.android.gms:play-services-ads:8.4.0' compile 'com.google.android.gms:play-services-analytics:8.4.0' compile 'com.google.android.gms:play-services-identity:8.4.0' // Support libraries compile 'com.android.support:support-v4:23.3.0' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:cardview-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.github.bumptech.glide:glide:3.6.1' compile 'com.anjlab.android.iab.v3:library:1.0.20' compile 'com.sothree.slidinguppanel:library:2.0.3' compile 'com.commit451:PhotoView:1.2.5' compile('com.github.afollestad.material-dialogs:core:0.8.5.7@aar') { transitive = true } } 

РЕДАКТИРОВАТЬ:

Чтобы уточнить: Это происходит, когда я пытаюсь запустить приложение на эмуляторе, например, KitKat API 19

Аварийные журналы с консоли градиента:

 ... :App:generateDebugInstantRunAppInfo :App:transformClassesWithDexForDebug AGPBI: {"kind":"error","text":"The number of method references in a .dex file cannot exceed 64K.\nLearn how to resolve this issue at https://developer.android.com/tools/building/multidex.html","sources":[{}],"original":"UNEXPECTED TOP-LEVEL EXCEPTION:\ncom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536\n\tat com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)\n\tat com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)\n\tat com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)\n\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)\n\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:188)\n\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)\n\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)\n\tat com.android.dx.command.dexer.Main.run(Main.java:277)\n\tat com.android.dx.command.dexer.Main.main(Main.java:245)\n\tat com.android.dx.command.Main.main(Main.java:106)\n","tool":"Dex"} FAILED FAILURE: Build failed with an exception. * What went wrong: 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.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 * Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. BUILD FAILED 

Сообщение об ошибке из окна «Сообщение»:

 :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.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2 

Чтобы ответить на ваш конкретный вопрос:

  • Это ограничение количества методов ограничено в файле DEX (Dalvik Executable).
  • Общим обходным путем для этого ограничения является наличие нескольких файлов DEX.
  • Старые версии Android не поддерживают несколько файлов DEX.
  • Начиная с Lollipop система поддерживает его изначально.

Вот почему он не работает на старых устройствах, но работает на более новых устройствах. Он не имеет ничего общего с библиотеками поддержки.

Чтобы добавить более полезный контент в мой ответ:

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

Обходной путь (и даже сам вопрос) подробно описан в этом руководстве Google: http://developer.android.com/tools/building/multidex.html

Основой этого является:

  • Добавьте multidex к вашим зависимостям compile 'com.android.support:multidex:+'
  • Включить multiDex в скрипте сборки внутри android-> default config multiDexEnabled true
  • В манифесте сделайте ваше приложение MultidexApplication от MultidexApplication android:name="android.support.multidex.MultiDexApplication" или, если вам нужно Application подкласса для вашего собственного приложения, сделайте свое приложение от него.

Полностью согласен с @Budius. Вы должны указать класс приложения в манифесте. И пусть ваш класс приложения расширяет MultiDexApplication.

Требуется еще одна вещь. Вызов базового контекста присоединения в классе MultiDexApplication

 public class MyApplicationClass extends MultiDexApplication... { .... @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(MyApplicationClass.this); } ... } 

Это работало отлично для меня на устройствах pre и post lollipop.

Проблема возникает при использовании устройств Instant Run и pre-lollipop!

https://code.google.com/p/android/issues/detail?id=208577 https://code.google.com/p/android/issues/detail?id=196809

Вы должны добавить multiDexEnabled = true в ваш defaultConfig в файле gradle.