неожиданное исключение верхнего уровня:

Я попытался добавить службы магазина Google Play в свой файл build.gradle, и синхронизация прошла успешно. Теперь, когда я пытался запустить приложение, я получаю следующее исключение в Android Studio:

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:283)
    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:502)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
    at com.android.dx.command.dexer.Main.run(Main.java:277)
    at com.android.dx.command.dexer.Main.main(Main.java:245)
    at com.android.dx.command.Main.main(Main.java:106)
Error:Execution failed for task ':app:dexDebug'.

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: команда процесса 'C: \ Program Files \ Java \ jdk1.8.0_60 \ bin \ java.exe' завершена с не- нулевое значение выхода 2

До добавления игрового сервиса все работало нормально. Мой файл build.gradle выглядит следующим образом:

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

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

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"
    defaultConfig {
        applicationId 'com.xyz.app'
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 2
        versionName "1.0.1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

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

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'me.neavo:volley:2014.12.+'
    compile 'com.google.code.gson:gson:2.2.+'
    compile 'com.facebook.android:facebook-android-sdk:4.7.0'
    compile 'com.google.android.gms:play-services:8.4.0'
    compile('com.crashlytics.sdk.android:crashlytics:2.5.5@aar') {
        transitive = true;
    }
}

Я искал проблему в Google и обнаружил, что проблема указывает, что превышено ограничение в 65 536 методов в файле dex.

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

Но мой проект не такой уж большой.

Скажите, пожалуйста, что я делаю не так, и предложите способ решения этой проблемы. Спасибо.


person Geeky Singh    schedule 22.12.2015    source источник
comment
какой модуль игрового сервиса используется?   -  person Veer3383    schedule 22.12.2015
comment
Пожалуйста, проверьте мой ответ в stackoverflow.com/questions/32844287/   -  person Shadow Droid    schedule 22.12.2015
comment
@ Veer3383 Я использую api местоположения, чтобы получить текущее местоположение с помощью GoogleApiClient.   -  person Geeky Singh    schedule 22.12.2015
comment
@Shadow Droid попробовал ваше решение, но это не помогло   -  person Geeky Singh    schedule 22.12.2015
comment
тогда вам нужно использовать только этот компилятор com.google.android.gms: play-services-location: 8.4.0, вам не нужно включать multidex, попробуйте и посмотрите.   -  person Veer3383    schedule 22.12.2015
comment
@ Veer3383, это решение отлично сработало. Я предпочел ваш подход, поскольку он уменьшает общий размер финального apk, а также нет необходимости включать multidex и добавлять запись в манифест. Спасибо. :)   -  person Geeky Singh    schedule 22.12.2015
comment
Еще один способ сказать спасибо - принять ответ; )   -  person Veer3383    schedule 22.12.2015
comment
@GaganSingh Я упомянул то же самое, что Veer3383 предложил вам, с той лишь разницей, что в том ответе я упомянул услугу в соответствии с этим вопросом. Я думал, ты сможешь понять. В любом случае, проблема решена отлично.   -  person Shadow Droid    schedule 22.12.2015


Ответы (4)


Вы превышаете максимально допустимое количество методов, равное 65 КБ. Одним из решений этого является использование опции multidex в gradle.

Измените свой build.gradle, как показано ниже

android {
  ...

  defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 23
    ...

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

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

Ссылка на ссылку

Другое решение - оптимизировать ваши методы с помощью proguard, который можно включить с помощью

minifyEnabled true

раздел.

Кроме того, вы можете оптимизировать свои зависимости, чтобы не превышать ограничение на количество методов в 65 КБ. Посетите этот сайт, чтобы получить инструкции по установке плагина прямо в Android Studio, который будет отображать количество методов каждая зависимость в вашем build.gradle бок о бок. Принимая это во внимание, вы можете решить, какую зависимость оставить, а какую можно заменить чем-то менее требовательным к методам.

person Nishant.    schedule 22.12.2015
comment
Это решение сработало для меня. Спасибо. Но все же мне интересно, как мое приложение превысило максимальное количество методов в 65 КБ. Есть ли конкретная причина для этого? - person Geeky Singh; 22.12.2015
comment
@GaganSingh см. Ссылку на сайт, которую я добавил в конце своего ответа. Есть возможность установить плагин прямо в Android Studio. Вы можете использовать это, чтобы определить, какая зависимость является виноватой. - person Nishant.; 22.12.2015
comment
Я понял. Я думаю, что в сервисах Google Play есть более 65 тысяч методов, поэтому после использования игровых сервисов я получил эту ошибку. Спасибо за вашу помощь. :) - person Geeky Singh; 22.12.2015
comment
В этом случае вы можете начать использовать сегментированные модули из сервисов Google Play. Взгляните здесь: developers.google.com/android/guides/setup - person Nishant.; 22.12.2015

Не включайте всю зависимость игровых сервисов,

заменять

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

только с модулями, которые вы используете.

Eg.

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

Верните это для справки,

если вам нужно включить в игровые сервисы все модули,

обратитесь к ответу Radix

person Veer3383    schedule 22.12.2015

в основном это вызвано тем, что вы превышаете пределы метода. У вас есть два варианта решения этой ошибки.

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

2) Второй. Включите multidex для включения multidex: Теперь все, что вам нужно сделать, это переопределить это в своем классе Application:

public class YouApplication extends Application {

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

}

Добавьте библиотеку поддержки multidex в свой градиент

 android {
compileSdkVersion 22
buildToolsVersion "23.0.0"

     defaultConfig {
         minSdkVersion 14 //lower than 14 doesn't support multidex
         targetSdkVersion 22

         // Enabling multidex support.
         multiDexEnabled true
     }
}

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

В своем манифесте добавьте класс 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">
   ...
  </application>

I hope this will Help you....

person santoXme    schedule 22.12.2015

См. Эту ссылку.

Иногда зависимости больших библиотек также могут привести к увеличению размера символа. Эта ссылка говорит об избежании ограничения в 65 КБ с помощью таких средств, как proguard.

или вы можете просто использовать мультидексирование, которое создаст для вас 2 файла classes.dex при достижении большого размера символа.

person tosif24    schedule 22.12.2015