unable - multidex android
Después de la actualización de AS a 1.0, obteniendo el "ID de método no en[0, 0xffff]: 65536" error en el proyecto (2)
El error significa que has alcanzado el recuento máximo de métodos en tu aplicación. Eso incluye cualquier biblioteca que use para su proyecto.
Hay dos formas de abordar el problema:
- Deshágase de las bibliotecas de terceros que realmente no necesita. Si usa los servicios de google play que pueden contribuir mucho al recuento de métodos. Afortunadamente, a partir de la última versión de los servicios de juegos, http://developer.android.com/google/play-services/setup.html#split del marco.
- Use una configuración multi dex para su aplicación.
Actualicé Android Studio a la última versión, y dejé "arreglar el proyecto" y cosas por el estilo, pero ahora mi proyecto no compila, me da
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)
Sin embargo, esto no se resuelve solo por multidexing, porque cuando agregué esto:
defaultConfig {
...
multiDexEnabled = true
}
Esto pasa
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
Código de error: 3 Salida:
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)
Traté de cambiar las herramientas de compilación a la última
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
Debido a que por defecto cambió a 20.0.0 que parecía usar el SDK para 4.4W, pero esto no solucionó mi problema.
¿Alguien sabe qué podría estar mal aquí?
EDITAR:
Cambiar las herramientas de compilación o compilar el SDK no solucionó el problema.
Convertir la aplicación en un proyecto multi-dex y también agregar lo siguiente
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
...
multiDexEnabled true
}
...
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
}
Se corrigió el proceso de compilación, sin embargo, esto todavía parece ser solo un "tratamiento", pero no una solución al problema.
No estoy seguro de si esto está relacionado, pero esta es mi lista de dependencia:
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''
}
La única nueva dependencia desde entonces ha sido la última línea, que agregué según https://developer.android.com/google/gcm/client.html así que no creo que ese sea el origen del problema.
EDIT2:
Sí, fue la fuente del problema. Como necesitaba Google Cloud Messaging
, reemplacé esa dependencia con la base según http://developer.android.com/google/play-services/setup.html#split :
compile ''com.google.android.gms:play-services-base:6.5.87''
Y solucionó el problema. Gracias por la ayuda.
EDIT3:
A partir de los servicios de juego 7.0.0, el GCM está en
compile ''com.google.android.gms:play-services-gcm:7.0.0''
EDIT4:
Play Services actualizado a 7.3.0. Consulte la última versión aquí: http://developer.android.com/google/play-services/setup.html#split
Estoy eliminando estos problemas y en mi caso usé este enlace para superar ese error con éxito ... !!!
El límite de DEX 64k ya no es un problema, casi
Para resumir, agregando soporte multidex:
En caso de
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 decidió lanzar una solución oficial para esto en la forma de la Biblioteca de soporte MultiDex.
dependencies {
...
compile ''com.android.support:multidex:''
...
}
A continuación, habilite el multidexing configurando el marcador multiDexEnabled en la sección buildType o productFlavor de su configuración gradle.
defaultConfig {
...
multiDexEnabled true
...
}
Luego, dependiendo de su proyecto, tiene 3 opciones:
Si no ha creado su propia clase de aplicación, simplemente declare android.support.multidex.MultiDexApplication como su clase de aplicación en AndroidManifest.xml
....
android:name="android.support.multidex.MultiDexApplication"
...
Si ya tiene su propia clase de aplicación, amplíe android.support.multidex.MultiDexApplication
lugar de android.app.Application
Si su clase de Aplicación extiende alguna otra clase y no desea o no puede cambiarla, anule attachBaseContext()
como se muestra a continuación:
public class MyApplication extends FooApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Su proceso de compilación podría quedarse sin memoria. Para solucionarlo, configure las siguientes opciones de dex en el cierre ''android'' -
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
Más información sobre multidex está aquí: http://developer.android.com/tools/building/multidex.html
Otro enlace que ayuda a resolver estos errores: Referance Link