Инструменты сборки 21.1.2 — НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ ВЕРХНЕГО УРОВНЯ

Я внезапно сталкиваюсь с этой проблемой при создании/запуске моего проекта.

Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    /Users/aidanfollestad/Documents/android-sdk/build-tools/21.1.2/dx --dex --no-optimize --output /Users/aidanfollestad/Android Projects/Impression/app/build/intermediates/dex/debug --input-list=/Users/aidanfollestad/Android Projects/Impression/app/build/intermediates/tmp/dex/debug/inputList.txt
  Error Code:
    2
  Output:
    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
        at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
        at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:277)
        at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)
        at com.android.dx.command.dexer.Main.run(Main.java:246)
        at com.android.dx.command.dexer.Main.main(Main.java:215)
        at com.android.dx.command.Main.main(Main.java:106)

Мой файл Gradle содержит следующее:

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.14.+'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
apply plugin: 'versionPlugin'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.afollestad.impression"
        minSdkVersion 16
        targetSdkVersion 21
        versionCode 19
        versionName "0.7.0"
    }
}

repositories {
    mavenCentral()
    maven { url 'https://maven.fabric.io/public' }
}

dependencies {
    compile 'com.android.support:appcompat-v7:21.0.+'
    compile 'com.android.support:recyclerview-v7:21.0.+'
    compile 'com.koushikdutta.ion:ion:2.0.+'
    compile 'com.github.chrisbanes.photoview:library:1.2.+'
    compile 'com.afollestad:material-dialogs:0.4.5'
    compile 'com.google.android.gms:play-services:6.5.87'

    compile 'com.google.api-client:google-api-client:1.18.0-rc'
    compile 'com.google.api-client:google-api-client-android:1.18.0-rc'
    compile 'com.google.api-client:google-api-client-gson:1.18.0-rc'
    compile 'com.google.apis:google-api-services-drive:v2-rev152-1.19.0'

    compile('com.crashlytics.sdk.android:crashlytics:2.1.0@aar') {
        transitive = true;
    }
}

versionPlugin{
    buildTypesMatcher = 'release'
    supportBuildNumber = false
    fileNameFormat = '$appPkg-v$versionName-$versionCode'
}

Моя библиотека материалов-диалогов ссылается только на AppCompat-v7, на ту же версию, на которую ссылается этот файл Gradle. У меня нет JAR-файлов в папке libs, на которые я ссылаюсь. Я понятия не имею, какие библиотеки мешают друг другу (кроме возможности Play Services и AppCompat?). Любые идеи или решения?

Я заметил, что Ion ссылается на v4 библиотеки поддержки (https://github.com/koush/ion/blob/master/ion/build.gradle#L17), возможно, это может мешать работе AppCompat?


person afollestad    schedule 16.12.2014    source источник
comment
@ scott-barta, это не дубликат, другой ответ не решает проблему.   -  person afollestad    schedule 16.12.2014
comment
Я снова открыл его, но это действительно дубликат — у вас слишком много методов для одного файла dex. Это не столкновение.   -  person Scott Barta    schedule 16.12.2014
comment
Если вы не используете все службы Google Play, рассмотрите возможность использования разделить зависимости, которые позволяют вам зависеть только от тех частей сервисов Google Play, которые вам действительно нужны.   -  person ianhanniballake    schedule 18.01.2015


Ответы (3)


Попробуйте включить multidex build.gradle :

android {
   defaultConfig {
      ...
      multiDexEnabled = true
   }
}

Ссылка: Невозможно выполнить dex: идентификатор метода не в [0, 0xffff]: 65536

person Haresh Chhelana    schedule 16.12.2014
comment
использование multiDexEnabled имеет свои ограничения. Старайтесь избегать этого, если это возможно. - person Shubham; 23.09.2015
comment
@Shubham, не могли бы вы подробнее рассказать об ограничениях? - person Jus12; 19.11.2015
comment
@Jus12: Прочитайте все об этом здесь. developer.android.com/tools/building/multidex.html - person Shubham; 19.11.2015

Возможно, вы достигли предела в 65 000 методов. Вместо использования multiDex попробуйте использовать сервисы Google Play с большей степенью детализации. Следуйте этому руководству, вы можете использовать только части, которые вы хотите. Вероятно, это решит вашу проблему.

person webo80    schedule 10.02.2015
comment
Это отличный совет, нет необходимости включать multiDex (который, похоже, вызвал у меня другие проблемы), когда вы можете просто добавить определенные части сервисов Google Play, которые необходимы. - person Leon; 22.02.2016

Это исключение показывает, что ваш проект достиг максимального количества методов 65536. Вы просто выполняете приведенную ниже работу. У меня это сработало.

Шаг 1:
внутри build.gradle

      defaultConfig {  
       multiDexEnabled = true 
      }

Шаг 2:

внутри тега приложения манифеста

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

   or

Шаг 3: если вы используете класс, который расширяет приложение, выполните:

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

Шаг 4:

внутри build.gradle

  android{
    dexOptions { 
    incremental true 
    javaMaxHeapSize "4g" 
    }
   }
person KAMAL VERMA    schedule 09.12.2015