AS升级到1.0后,在项目中出现“方法ID不在[0,0xffff]:65536”的错误。

27

我把Android Studio更新到了最新版本,并让它“修复项目”之类的 - 但现在我的项目无法编译,显示以下错误:

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    D:\VGA\AndroidStudio\sdk\build-tools\21.1.1\dx.bat --dex --no-optimize --output D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\dex\debug --input-list=D:\VGA\Projects\Sales-App\Android-Project\svn\android\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:302)
        at com.android.dx.command.dexer.Main.run(Main.java:245)
        at com.android.dx.command.dexer.Main.main(Main.java:214)
        at com.android.dx.command.Main.main(Main.java:106)

然而,仅通过多 Dex 处理并不能解决这个问题,因为当我添加了以下内容时:

defaultConfig {
    ...
    multiDexEnabled = true
}

这会发生

D:\VGA\AndroidStudio\sdk\build-tools\21.1.1\dx.bat --dex --no-optimize --multi-dex --main-dex-list D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\multi-dex\debug\maindexlist.txt --output D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\dex\debug --input-list=D:\VGA\Projects\Sales-App\Android-Project\svn\android\app\build\intermediates\tmp\dex\debug\inputList.txt

错误代码: 3 输出:

UNEXPECTED TOP-LEVEL ERROR:
java.lang.OutOfMemoryError: GC overhead limit exceeded
    at com.android.dx.cf.code.ConcreteMethod.makeSourcePosistion(ConcreteMethod.java:254)
    at com.android.dx.cf.code.RopperMachine.run(RopperMachine.java:306)
    at com.android.dx.cf.code.Simulator$SimVisitor.visitLocal(Simulator.java:612)
    at com.android.dx.cf.code.BytecodeArray.parseInstruction(BytecodeArray.java:367)
    at com.android.dx.cf.code.Simulator.simulate(Simulator.java:94)
    at com.android.dx.cf.code.Ropper.processBlock(Ropper.java:787)
    at com.android.dx.cf.code.Ropper.doit(Ropper.java:742)
    at com.android.dx.cf.code.Ropper.convert(Ropper.java:349)
    at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:280)
    at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:137)
    at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:93)
    at com.android.dx.command.dexer.Main.processClass(Main.java:729)
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
    at com.android.dx.command.dexer.Main.access$300(Main.java:82)
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
    at com.android.dx.command.dexer.Main.processOne(Main.java:632)
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:505)
    at com.android.dx.command.dexer.Main.runMultiDex(Main.java:332)
    at com.android.dx.command.dexer.Main.run(Main.java:243)
    at com.android.dx.command.dexer.Main.main(Main.java:214)
    at com.android.dx.command.Main.main(Main.java:106)

我试图将构建工具更改为最新版本

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

默认情况下它更改为20.0.0,似乎使用4.4W的SDK,但这没有解决我的问题。是否有人知道这里可能出了什么问题?

编辑:

更改构建工具或编译SDK并不能解决问题。

将应用程序转换为multi-dex项目,还需添加以下内容:

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        ...
        multiDexEnabled true
    }

...
    dexOptions {
        incremental true
        javaMaxHeapSize "4g"
    }
}

已修复构建过程,但仍然只是“处理”,而不是解决问题。

我不确定这是否有关系,但这是我的依赖列表:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:multidex:1.0.0'
    compile 'com.android.support:appcompat-v7:21.0.2'
    compile 'com.squareup:otto:1.3.5'
    compile 'com.squareup.picasso:picasso:2.4.0'
    compile 'com.squareup.retrofit:retrofit:1.7.1'
    compile 'com.jakewharton:butterknife:6.0.0'
    compile 'com.madgag.spongycastle:core:1.51.0.0'
    compile 'com.madgag.spongycastle:prov:1.51.0.0'
    compile 'com.madgag.spongycastle:pkix:1.51.0.0'
    compile 'com.google.code.gson:gson:2.3'
    compile 'commons-io:commons-io:2.4'
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5'
    compile 'com.squareup.dagger:dagger:1.2.2'
    compile 'com.squareup.dagger:dagger-compiler:1.2.2'
    compile('com.googlecode.json-simple:json-simple:1.1.1') {
        exclude module: 'junit'
    }
    compile 'com.google.android.gms:play-services:6.5.87'
}
自那以后唯一新增的依赖是我根据https://developer.android.com/google/gcm/client.html添加的最后一行,因此我不认为这是问题的源头。
编辑2:
是的,这就是问题的源头。由于我需要使用Google Cloud Messaging,因此我按照http://developer.android.com/google/play-services/setup.html#split中的基本操作替换了该依赖项:
compile 'com.google.android.gms:play-services-base:6.5.87'

它解决了问题。感谢您的帮助。

编辑3:

从Play服务7.0.0开始,GCM位于

compile 'com.google.android.gms:play-services-gcm:7.0.0'

编辑4:

Play Services已更新至7.3.0版本。 请在此处查看最新版本:http://developer.android.com/google/play-services/setup.html#split


我遇到了同样的问题。 - M D
@MD 我打算尝试将构建工具还原到19.1.0版本,看看是否能解决问题。你有找到任何解决方案吗? - EpicPandaForce
我已经做了那个并且在旧版本上运行良好。 - M D
2个回答

20

这个错误意味着你的应用程序已经达到了最大方法计数。这包括你在项目中使用的任何库。

有两种方法可以解决这个问题:

  1. 摆脱你不需要的第三方库。如果你使用Google Play服务,那可能会对方法计数产生很大的贡献。幸运的是,在最新的Play服务发布版本中,可以仅包含部分框架。
  2. 为你的应用程序使用多 dex 设置

我尝试了多Dex设置,但构建过程崩溃并出现内存不足错误。我将Google云消息播放服务添加为依赖项,但这不是问题的原因。 - EpicPandaForce
我还在dex选项中添加了额外的内存,现在它可以工作了,但我认为这仍然是某种潜在问题。 - EpicPandaForce
3
没关系,这有助于编译整个 Google Play 服务,但只使用“base”时它可以正常工作,感谢你的帮助。 - EpicPandaForce

15

我遇到了这些问题,在我的情况下,使用以下链接成功地解决了错误..!!!

DEX 64k限制不再是问题,几乎可以解决

总之,添加multidex支持:

在这种情况下

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:302) 
   at com.android.dx.command.dexer.Main.run(Main.java:245) 
   at com.android.dx.command.dexer.Main.main(Main.java:214) 
   at com.android.dx.command.Main.main(Main.java:106)

谷歌决定通过MultiDex支持库的形式发布官方解决方案。

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

在gradle配置的buildType或productFlavor部分设置multiDexEnabled标志以启用multi-dex。

defaultConfig { 
   ... 
multiDexEnabled true 
... 
}

接着根据您的项目,您有三个选择:

如果您还没有创建自己的Application类,请在AndroidManifest.xml中将android.support.multidex.MultiDexApplication声明为您的应用程序类。

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

如果您已经有自己的Application类,请让它扩展android.support.multidex.MultiDexApplication而不是android.app.Application
如果您的Application类正在扩展其他类,或者您不想或无法更改它,请按照以下方式覆盖attachBaseContext()
public class MyApplication extends FooApplication { 
   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } 
}

你的编译过程可能会耗尽内存。 为了解决这个问题,在“android”闭包中设置以下dex选项——

你的编译过程可能会耗尽内存。 为了解决这个问题,在“android”闭包中设置以下dex选项——

dexOptions { 
   incremental true 
   javaMaxHeapSize "4g" 
}

关于Multidex的更多信息,请参见:http://developer.android.com/tools/building/multidex.html

另一个有助于解决此错误的链接:参考链接


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接