Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 意外的顶级异常:_Android_Exception_Indexing_Overflow_Toplevel - Fatal编程技术网

Android 意外的顶级异常:

Android 意外的顶级异常:,android,exception,indexing,overflow,toplevel,Android,Exception,Indexing,Overflow,Toplevel,我尝试在build.gradle文件中添加Google play store服务,同步成功。现在,当我尝试运行该应用程序时,我在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(

我尝试在build.gradle文件中添加Google play store服务,同步成功。现在,当我尝试运行该应用程序时,我在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:process'command'C:\Program Files\Java\jdk1.8.0_60\bin\Java.exe''以非零退出值2结束

在添加play服务之前,它运行良好。我的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上搜索了这个问题,发现问题状态超过了dex文件中65536个方法的限制

com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
但我的项目还不够大

请告诉我我做错了什么,并提出解决方法。 谢谢。

请参阅此。

有时,大型库依赖项也会导致符号大小增加。此链接讨论如何通过proguard等方式避免65K限制


或者,您可以简单地使用多重索引,当达到较大的符号大小时,它将为您创建2个class.dex文件。

您的最大方法计数限制超过了65K。 一种解决方案是在gradle中使用multidex选项

修改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

此外,您还可以优化依赖项以避免超过65K方法计数限制。
签出此项,获取将插件安装到Android Studio的说明,该插件将并排显示build.gradle中每个依赖项的方法计数。考虑到这一点,您可以决定保留哪个依赖项,以及用不太需要方法的东西替换哪个依赖项

不包括整个播放服务依赖项

替换

compile 'com.google.android.gms:play-services:8.4.0'
仅使用您正在使用的模块

例如

请再次参考

如果您需要包括所有模块的播放服务


请参阅Radix的答案

基本上,这是因为您超出了方法的限制。解决此错误有两种选择

1) 减少项目中的方法数。基本上,在项目方法中添加的库也计入项目方法中。因此,不要使用该库的整个软件包使用您在项目中使用的模块:例如,您添加的Google play services整个软件包添加您想要使用的模块,如地图等

2) 第二个选项为启用多索引启用多索引: 现在,您需要做的就是在应用程序类中重写它:

public class YouApplication extends Application {

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

}
在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'
}
在清单中,将multidex支持库中的MultiDexApplication类添加到application元素,如下所示

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

...


我希望这将帮助您……

您使用的是哪种播放服务模块?请在@Veer3383中查看我的答案。我正在使用位置api使用GoogleAppClient获取当前位置。@Shadow Droid尝试了您的解决方案,但没有帮助,然后您只需使用此解决方案编译“com.google.android.gms:play services location:8.4.0”,无需启用multidex,试试看。这个解决方案对我有效。谢谢但我仍然想知道我的应用程序是如何超过65K的最大方法计数限制的,有什么具体原因吗?@GaganSingh请参阅我在答案底部添加的网站链接。可以选择将插件直接安装到Android Studio中。你可以用它来找出哪个依赖是罪魁祸首,我明白了。我认为Google Play服务有超过65k种方法,所以在使用Play服务后,我发现了这个错误。谢谢你的帮助。:)在这种情况下,您可能需要开始使用google play services中的分段模块。请看这里:
<?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>