2
respostas

Problemas com .dex

Ao adicionar as dependências do Retrofit e do converter Jackson, o build do aplicativo passa a dar um erro na task :app:transformClassesWithDexForDebug, no log aparece um site para ler sobre isso.

The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Message{kind=ERROR, text=The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html, sources=[Unknown source file], original message=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:484)
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
    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)
, tool name=Optional.of(Dex)}

É estranho como estou com um erro de na minha aplicação ter mais de 64k de métodos, o que de alguma forma está relacionado com a aplicação ter dependências em excesso de acordo com o texto, sendo que as únicas dependências que eu tenho são as inseridas no curso.

Eu baixei o projeto do professor mais a diante e vi que a unica diferença entre os arquivos do gradle é que a versão do retrofit usada em aula é 2.1.0 e a minha era 2.4.0. Eu tentei fazer o downgrade e o erro persistiu.

Curiosamente o projeto do professor também da o mesmo erro aqui, será que eu deveria apagar o cache do gradle ou algo assim? Não sei como fazer isso.

Eu realizei o procedimento do site, que envolve habilitar o multidex para poder exceder o limite de 64k de métodos (o que não acho que faz sentido porque meu projeto só tem as dependências da aula).

O resultado é que a task :app:transformClassesWithDexForDebug roda por aproximadamente 5 minutos (o cooler do meu notebook fica insano nessa hora hahaha) e então acontece um Error de falta da memória. Como se alguma coisa tivesse entrado em loop infinito no gradle.

Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded
Message{kind=ERROR, text=Uncaught translation error: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: GC overhead limit exceeded, sources=[Unknown source file]}

Como saio desse dilema com o build do aplicativo aqui?

2 respostas

Consegui fazer o projeto funcionar. Parece que é uma má pratica adicionar com.google.android.gms:play-services:8.4.0 como dependência porque ele adiciona muito código que não é utilizado no projeto.

Eu removi essa dependência e no lugar adicionei:

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

Adicionalmente também adicionei um plugin ao meu projeto que conta a quantidade de métodos no tal do dex, essa foi a saída:

Total methods in app-debug.apk: 37850 (57,76% used)
Total fields in app-debug.apk:  21758 (33,20% used)
Total classes in app-debug.apk:  3839 (5,86% used)
Methods remaining in app-debug.apk: 27685
Fields remaining in app-debug.apk:  43777
Classes remaining in app-debug.apk:  61696

Com isso consegui uma boa quantidade de métodos de sobra, entretanto, ainda não sei porque não consigo usar o multidex (como eu tinha dito, roda por uns 5 minutos e da erro de falta de memória).

Também não sei porque o projeto do professor funcionou tranquilamente mesmo tendo as mesmas dependências.

Opa Gabriel, blz?

Vi que passou por uma grande aventura hehe

Realmente essa parte de configuração de build, escolha de dependências, seja por versão ou quantidade impacta nesse processo de empacotamento. Dado que no curso tudo estava funcionando, não vi a necessidade de abordar o assunto de multidex, assim como mencionou...

Para que o multidex funcione, primeiro é necessário identificar as restrições de build, a primeira delas é a versão mínima que está dando suporte, se for abaixo da 21 (Android 5) vai ser necessário utilizar a seguinte dependência:

com.android.support:multidex:1.0.0

De resto é só configurar conforme as orientações do Android Developers.

No tutorial feito pelo Android Developers, mostra a utilização da versão 1.0.3 se a 1.0.0 não funcionar, tente usar ela.

E parabéns por pesquisar e tentar resolver o problema, esse é o espírito para evoluir cada vez mais. Claro, você pode sempre tirar dúvida quando achar necessário :)

[]s