2015-12-22 19 views
2

Я попытался добавить сервисы Google Play Store в файл 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:[email protected]') { 
     transitive = true; 
    } 
} 

Я искал вопрос на Google и обнаружил, что выпуск состояние, превышающий предел 65536 методов в DEX файл

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

Но мой проект не так достаточно большой.

Пожалуйста, расскажите мне, что я делаю неправильно, и предложите подход к его решению. Спасибо.

+1

которые играют модуль службы используют? – Veer3383

+0

Пожалуйста, проверьте мой ответ в http://stackoverflow.com/questions/32844287/java-finished-with-non-zero-exit-value-1-android-gradle/32844773#32844773 –

+0

@ Veer3383 Я использую местоположение api для получить текущее местоположение с помощью GoogleApiClient. –

ответ

4

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

Измените build.gradle ниже

android { 
    ... 

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

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

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

Reference Link

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

minifyEnabled true 

секции.

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

+0

Это решение сработало для меня. Благодарю. Но все же я удивляюсь, как мое приложение превысило максимальный предел количества методов в 65K, любая конкретная причина для этого? –

+0

@GaganSingh ссылается на ссылку сайта, которую я добавил в нижней части моего ответа. Существует возможность установить плагин прямо в Android Studio. Вы можете использовать это, чтобы найти, какая зависимость является виновником. –

+0

Я понял. Я думаю, что службы Google Play имеют более 65 тыс. Методов, поэтому после использования игровых сервисов я получил эту ошибку. Спасибо за вашу помощь. :) –

1

См. Это link.

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

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

3

Dont включают все игровые услуги зависимость,

заменить

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

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

Например.

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

Rerfer this для refrence,

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

см ответ Radix в

2

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

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

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

public class YouApplication extends Application { 

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

} 

Добавить multidex библиотеку поддержки в вашем Gradal

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 из мульти Dex библиотека поддержки элементу приложения, как этот

<?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> 

Я надеюсь, это поможет вам ....

Смежные вопросы