android - targetsdkversion - Se superó el límite de 64 k en las API más antiguas que en lollipop, pero no en las más recientes
sdk version android (4)
Así que me pregunto por qué me encuentro con el límite del método dex de 64 k cuando intento ejecutar mi aplicación en versiones de Android anteriores a Lollipop, cuando se ejecuta correctamente en las versiones más recientes.
¿Podría ser, porque las bibliotecas de soporte en realidad están siendo referenciadas cuando se ejecutan en las versiones anteriores?
Este es mi gradle:
apply plugin: ''com.android.application''
android {
compileSdkVersion 23
buildToolsVersion ''23.0.2''
lintOptions {
checkReleaseBuilds true
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
defaultConfig {
applicationId "com.domain.myapp"
minSdkVersion 16
targetSdkVersion 23
versionCode 27
versionName "1.2"
// Vector compat
vectorDrawables.useSupportLibrary = true
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
}
dependencies {
compile files(''libs/commons-io-2.4.jar'')
compile files(''libs/activation.jar'')
compile files(''libs/additionnal.jar'')
compile files(''libs/mail.jar'')
compile project('':libraries:preferencefragment'')
// Gmail API
compile(''com.google.api-client:google-api-client-android:1.20.0'') {
exclude group: ''org.apache.httpcomponents''
}
compile(''com.google.apis:google-api-services-gmail:v1-rev29-1.20.0'') {
exclude group: ''org.apache.httpcomponents''
}
// Play Services
compile ''com.google.android.gms:play-services-location:8.4.0''
compile ''com.google.android.gms:play-services-maps:8.4.0''
compile ''com.google.android.gms:play-services-ads:8.4.0''
compile ''com.google.android.gms:play-services-analytics:8.4.0''
compile ''com.google.android.gms:play-services-identity:8.4.0''
// Support libraries
compile ''com.android.support:support-v4:23.3.0''
compile ''com.android.support:appcompat-v7:23.3.0''
compile ''com.android.support:cardview-v7:23.3.0''
compile ''com.android.support:design:23.3.0''
compile ''com.github.bumptech.glide:glide:3.6.1''
compile ''com.anjlab.android.iab.v3:library:1.0.20''
compile ''com.sothree.slidinguppanel:library:2.0.3''
compile ''com.commit451:PhotoView:1.2.5''
compile(''com.github.afollestad.material-dialogs:core:0.8.5.7@aar'') {
transitive = true
}
}
EDITAR:
Para aclarar: esto sucede cuando intento ejecutar la aplicación en un emulador que se ejecuta, por ejemplo, KitKat API 19
Registros de bloqueo de la consola de Gradle:
...
:App:generateDebugInstantRunAppInfo
:App:transformClassesWithDexForDebug
AGPBI: {"kind":"error","text":"The number of method references in a .dex file cannot exceed 64K./nLearn how to resolve this issue at https://developer.android.com/tools/building/multidex.html","sources":[{}],"original":"UNEXPECTED TOP-LEVEL EXCEPTION:/ncom.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536/n/tat com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:484)/n/tat com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:261)/n/tat com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:473)/n/tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:161)/n/tat com.android.dx.merge.DexMerger.merge(DexMerger.java:188)/n/tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)/n/tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)/n/tat com.android.dx.command.dexer.Main.run(Main.java:277)/n/tat com.android.dx.command.dexer.Main.main(Main.java:245)/n/tat com.android.dx.command.Main.main(Main.java:106)/n","tool":"Dex"}
FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task '':App:transformClassesWithDexForDebug''.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ''command ''/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'''' finished with non-zero exit value 2
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Mensaje de colisión desde la ventana de mensajes:
:App:transformClassesWithDexForDebug
Error: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
Error:Execution failed for task '':App:transformClassesWithDexForDebug''.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ''command ''/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'''' finished with non-zero exit value 2
¡El problema está ocurriendo cuando se utilizan los dispositivos Instant Run y pre-lollipop!
https://code.google.com/p/android/issues/detail?id=208577 https://code.google.com/p/android/issues/detail?id=196809
Completamente de acuerdo con @Budius. Debe mencionar una clase de aplicación en manifiesto. Y haga que su clase de aplicación extienda MultiDexApplication.
Hay una cosa más que se necesita. Llamando el contexto base adjunto en su clase MultiDexApplication
public class MyApplicationClass extends MultiDexApplication... {
....
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(MyApplicationClass.this);
}
...
}
Esto funcionó bien para mí en dispositivos pre y post piruleta.
Para responder a su pregunta específica es:
- Esta limitación de conteo de métodos está en el archivo DEX (Dalvik Executable).
- Una solución común para esta limitación es tener varios archivos DEX.
- Las versiones anteriores de Android no admiten de forma nativa múltiples archivos DEX.
- A partir de Lollipop el sistema lo soporta de forma nativa.
Es por eso que falla en dispositivos más antiguos pero funciona en dispositivos más nuevos. No tiene nada que ver con las bibliotecas de soporte.
Para agregar más contenido útil a mi respuesta:
Pero tal vez lo que algunos quieran saber es cómo solucionarlo en dispositivos más antiguos, tenga en cuenta que usé la palabra de natively
en mis puntos anteriores. Eso significa que hay soluciones para que las plataformas más antiguas lo admitan, pero tienes que codificar esas soluciones en tu aplicación.
La solución (e incluso el problema en sí) se explica en detalle en esta guía de Google: http://developer.android.com/tools/building/multidex.html
La base de esto es:
- agregue multidex a sus dependencias
compile ''com.android.support:multidex:+''
- habilite multiDex en su script de compilación en android-> configuración predeterminada
multiDexEnabled true
- en el manifiesto haga que su aplicación se extienda desde
MultidexApplication
android:name="android.support.multidex.MultiDexApplication"
o, si necesitaMultidexApplication
Application
para su propia aplicación, haga que la Aplicación se extienda desde ella.
debe agregar multiDexEnabled = true
en su defaultConfig
en el archivo de gradle.