После обновления AS до 1.0 получение идентификатора метода не в [0, 0xffff]: ошибка 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)

Я попытался изменить инструменты сборки на последние

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

Потому что по умолчанию он изменился на 20.0.0, который, похоже, использовал SDK для 4,4 Вт, но это не решило мою проблему.

Кто-нибудь знает, что здесь может быть не так?

ИЗМЕНИТЬ:

Изменение инструментов сборки или 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, так что я не думаю, что это источник проблемы.

EDIT2:

Да, это был источник проблемы. Поскольку мне нужно было Google Cloud Messaging, я заменил эту зависимость на базовую согласно http://developer.android.com/google/play-services/setup.html#split :

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:

Сервисы Play обновлены до версии 7.3.0. Проверьте последнюю версию здесь: http://developer.android.com/google/play-services/setup.html#split


person EpicPandaForce    schedule 09.12.2014    source источник
comment
Я столкнулся с той же проблемой.   -  person M D    schedule 09.12.2014
comment
@MD Я собираюсь попробовать вернуть инструмент сборки к версии 19.1.0 и посмотреть, исправит ли это что-нибудь, вы нашли какое-нибудь решение?   -  person EpicPandaForce    schedule 09.12.2014
comment
Я уже сделал это, и он отлично работает со старыми.   -  person M D    schedule 09.12.2014


Ответы (2)


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

Есть два пути решения проблемы:

  1. Избавьтесь от любых сторонних библиотек, которые вам на самом деле не нужны. Если вы используете сервисы Google Play, это может сильно повлиять на количество методов. К счастью, в последнем выпуске игровых сервисов можно включать только части фреймворка.
  2. Используйте настройку multi dex для своего приложения.
person Konstantin Burov    schedule 09.12.2014
comment
Я попытался установить несколько Dex, но процесс сборки завершился с ошибкой нехватки памяти. Я добавил службу обмена облачными сообщениями Google в качестве зависимости, но это не является причиной проблемы. - person EpicPandaForce; 09.12.2014
comment
Ну, я также добавил дополнительную память к параметрам dex, и теперь это сработало, но я думаю, что это все еще какая-то основная проблема. - person EpicPandaForce; 09.12.2014
comment
Неважно, это помогло скомпилировать все сервисы Google Play, но только с базой все заработало правильно, спасибо за помощь. - person EpicPandaForce; 09.12.2014

Я фазирую эту проблему и в моем случае использовал эту ссылку, чтобы успешно преодолеть эту ошибку..!!!

Ограничение 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.

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

Затем включите multi-dexing, установив флаг multiDexEnabled в разделе buildType или productFlavor вашей конфигурации gradle.

defaultConfig { 
   ... 
multiDexEnabled true 
... 
}

Затем, в зависимости от вашего проекта, у вас есть 3 варианта:

Если вы не создали свой собственный класс приложения, просто объявите android.support.multidex.MultiDexApplication в качестве класса вашего приложения в AndroidManifest.xml.

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

Если у вас уже есть собственный класс приложения, сделайте его расширением android.support.multidex.MultiDexApplication вместо android.app.Application.

Если ваш класс приложения расширяет какой-то другой класс, и вы не хотите или не можете его изменить, переопределите attachBaseContext(), как показано ниже:

public class MyApplication extends FooApplication { 
   @Override 
   protected void attachBaseContext(Context base) { 
      super.attachBaseContext(base); 
      MultiDex.install(this); 
   } 
}

В процессе компиляции может не хватить памяти. Чтобы исправить это, установите следующие параметры dex в закрытии «android»:

dexOptions { 
   incremental true 
   javaMaxHeapSize "4g" 
}

Подробнее о multidex можно узнать здесь: http://developer.android.com/tools/building/multidex.html

Другая ссылка, которая помогает решить эту ошибку: Reference Link

person Dhruv Raval    schedule 25.03.2015