AS更新到1.0后,项目中出现“方法ID不在:65536”的错误

我更新了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) 

但是,这只是通过多重索引来解决,因为当我添加这个:

 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) 

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

 android { compileSdkVersion 21 buildToolsVersion "21.1.1" 

因为默认情况下它变成了20.0.0,它似乎使用了4.4W的SDK,但是这并没有解决我的问题。

有人知道这里可能是错的吗?

编辑:

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

将应用程序变成一个multi-dex项目,并添加以下内容

 android { compileSdkVersion 21 buildToolsVersion "21.1.1" defaultConfig { ... multiDexEnabled true } ... dexOptions { incremental true javaMaxHeapSize "4g" } } 

修正了构build过程,但这似乎仍然只是一种“治疗”,而不是解决问题的方法。

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

 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添加了这一行,所以我不认为这是问题的根源。

EDIT2:

是的,这是问题的根源。 由于我需要Google Cloud Messaging ,因此我使用http://developer.android.com/google/play-services/setup.html#splitreplace了该基础:

 compile 'com.google.android.gms:play-services-base:6.5.87' 

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

EDIT3:

截至播放服务7.0.0,GCM在

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

EDIT4:

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

Solutions Collecting From Web of "AS更新到1.0后,项目中出现“方法ID不在:65536”的错误"

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

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

  1. 摆脱任何你不需要的第三方库。 如果您使用可能会对方法计数作出很大贡献的Google Play服务。 幸运的是,从最新的播放服务版本开始, 可能只包含部分框架。
  2. 为您的应用程序使用多重dex设置 。

我正在逐步解决这些问题,并在我的情况下使用这些链接成功地克服这个错误.. !!!

几乎所有的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) 

Google决定以MultiDex Support Library的forms发布一个官方解决scheme。

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

然后通过在gradleconfiguration的buildType或productFlavor部分中设置multiDexEnabled标志来启用多重分类。

 defaultConfig { ... multiDexEnabled true ... } 

然后根据你的项目,你有3个select:

如果您还没有创build自己的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'closures中设置下面的dex选项 –

 dexOptions { incremental true javaMaxHeapSize "4g" } 

有关multidex的更多信息,请访问: http : //developer.android.com/tools/building/multidex.html

成为帮助解决这些错误的另一个链接: 参考链接