android - sirve - multidex in kotlin
El número de referencias de métodos en un archivo.dex no puede exceder 64k API 17 (13)
Cuando las referencias de su aplicación superan los 65.536 métodos, encuentra un error de compilación que indica que su aplicación ha alcanzado el límite de la arquitectura de compilación de Android
Soporte Multidex anterior a Android 5.0
Las versiones de la plataforma anteriores a Android 5.0 (API nivel 21) usan el tiempo de ejecución Dalvik para ejecutar el código de la aplicación. Por defecto, Dalvik limita las aplicaciones a un solo archivo de código de bytes classes.dex por APK. Para evitar esta limitación, puede agregar la biblioteca de soporte multidex a su proyecto:
dependencies {
implementation ''com.android.support:multidex:1.0.3''
}
Soporte Multidex para Android 5.0 y superior
Android 5.0 (API nivel 21) y superior utiliza un tiempo de ejecución llamado ART que admite de forma nativa cargar múltiples archivos DEX desde archivos APK. Por lo tanto, si su minSdkVersion es 21 o superior, no necesita la biblioteca de soporte multidex .
Evita el límite de 64K
- Elimine el código no utilizado con ProGuard: habilite la reducción del código
Configurar multidex en la aplicación para
Si su minSdkVersion está configurado en 21 o superior, todo lo que necesita hacer es configurar multiDexEnabled en verdadero en su archivo build.gradle de nivel de módulo
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 28
multiDexEnabled true
}
...
}
si su minSdkVersion está configurado en 20 o menos, entonces debe usar la biblioteca de soporte multidex
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 28
multiDexEnabled true
}
...
}
dependencies {
compile ''com.android.support:multidex:1.0.3''
}
Anule la clase de aplicación, cámbiela para extender MultiDexApplication (si es posible) de la siguiente manera:
public class MyApplication extends MultiDexApplication { ... }
agregar al archivo de manifiesto
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="MyApplication" >
...
</application>
</manifest>
Estoy creando una aplicación con la biblioteca SugarORM pero cuando intento compilar el proyecto para API 17 (no verifiqué otras) muestra un error de compilación.
Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
: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.8.0_51.jdk/Contents/Home/bin/java'''' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console
Pero cuando construyo este proyecto para Android v5.0 o superior, funciona bien. Si elimino la dependencia de SugarORM Gradle, funciona bien para ambos dispositivos v4.2.2 y v5.0.
En android / app / build.gradle
android {
compileSdkVersion 23
buildToolsVersion ''23.0.0''
defaultConfig {
applicationId "com.dkm.example"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
Ponga esto dentro de su configuración predeterminada:
multiDexEnabled true
esto funciona para mi
Este error también puede ocurrir cuando carga todas las API de servicios de Google Play cuando solo usa algunas.
Según lo declarado por Google: "En las versiones de los servicios de Google Play anteriores a la 6.5, tenía que compilar todo el paquete de API en su aplicación. En algunos casos, hacerlo dificultaba mantener la cantidad de métodos en su aplicación (incluyendo API de marco, métodos de biblioteca y su propio código) por debajo del límite de 65,536.
A partir de la versión 6.5, puedes compilar selectivamente las API del servicio Google Play en tu aplicación ".
Por ejemplo, cuando su aplicación necesita play-services-maps, play-services-location. Debe agregar solo las dos apis en su archivo build.gradle en el nivel de la aplicación como se muestra a continuación:
compile ''com.google.android.gms:play-services-maps:10.2.1''
compile ''com.google.android.gms:play-services-location:10.2.1''
En vez de:
compile ''com.google.android.gms:play-services:10.2.1''
Para obtener una documentación completa y una lista de las API de servicios de Google Play, haga clic here
Esto es lo que funcionó para mí:
Esto sucede porque hay demasiados métodos no utilizados. La mayoría de estos métodos provienen de bibliotecas incluidas en su build.gradle
Use recursos de reducción y reducción para arreglar esto con gradle y limpiar su código al mismo tiempo.
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro''
}
debug {
minifyEnabled true
shrinkResources true
}
}
Haz esto, funciona:
defaultConfig {
applicationId "com.example.maps"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}
He estado enfrentando el mismo problema y para el soporte multidex, debe tener en cuenta la minSdkVersion de su aplicación. Si está utilizando minSdkVersion 21 o superior, simplemente escriba multiDexEnabled true de esta manera
defaultConfig {
applicationId *******************
minSdkVersion 21
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}
Funciona para mí y si está usando minSdkVersion por debajo de 21 (debajo de lolipop ), entonces tiene que hacer dos cosas extra simples
1. Primero agregue esta dependencia
compile ''com.android.support:multidex:1.0.1''
en su build.gradle.
2. Último y segundo, agregue uno en esta línea a continuación a su aplicación en manifiesto
android: name = "android.support.multidex.MultiDexApplication"
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:name="android.support.multidex.MultiDexApplication"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Bingo, entonces también funcionará en la versión inferior .. :) Happy coding
Para mí, la actualización de Gradle funciona. Busque actualizaciones en el sitio web de Android y luego agréguelas a su build.gradle (Proyecto) de esta manera
dependencies {
classpath ''com.android.tools.build:gradle:2.2.0-alpha4''
....
}
luego sincronice el proyecto con el archivo gradle y, a veces, podría suceder debido a java.exe (en mi caso) simplemente fuerce kill java.exe desde el administrador de tareas en Windows y luego vuelva a ejecutar el programa
Recibí este mensaje de error porque al codificar la versión de compilación de actualización automática de mi proyecto en mi archivo
build.gradle
:
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
testCompile ''junit:junit:4.12''
compile ''com.android.support:appcompat-v7:23.4.0''
compile ''com.android.support:design:23.4.0'' }
Resuélvelo corrigiendo la versión:
android {
...
buildToolsVersion "23.0.2"
...
}
dependencies {
compile fileTree(dir: ''libs'', include: [''*.jar''])
testCompile ''junit:junit:4.12''
compile ''com.android.support:appcompat-v7:23.0.1''
compile ''com.android.support:design:23.0.1''
}
Solo un comentario lateral, antes de agregar soporte para multidex, asegúrese de no agregar dependencias innecesarias.
Por ejemplo, en la guía oficial de análisis de Facebook
Indican claramente que debe agregar la siguiente dependencia:
implementation ''com.facebook.android:facebook-android-sdk:[4,5)''
que en realidad es todo el FacebookSDK, por lo que si necesita, por ejemplo, solo Analytics, debe reemplazarlo por:
implementation ''com.facebook.android:facebook-core:5.+''
También puedes probar esto:
android{
.
.
// to avoid DexIndexOverflowException
dexOptions {
jumboMode true
}
}
Espero que ayude a alguien. Gracias
Tienes demasiados métodos. Solo puede haber 65536 métodos para dex .
Como se sugiere, puede utilizar el soporte multidex .
Simplemente agregue estas líneas en
build.gradle
:
android {
defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}
...
}
dependencies {
compile ''com.android.support:multidex:1.0.0''
}
También en su
Manifest
agregue la clase
MultiDexApplication
de la biblioteca de soporte multidex al elemento de aplicación
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
android:name=".YourCustomApplicationClass">
...
</application>
</manifest>
anular el método attachBaseContext
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(newBase);
MultiDex.install(this);
}
Si está utilizando su propia clase de
Application
, cambie la clase principal de
Application
a
MultiDexApplication
.
Otra solución es tratar de eliminar el código no utilizado con ProGuard : configure los ajustes de ProGuard para que su aplicación ejecute ProGuard y asegúrese de tener habilitada la reducción para las versiones de lanzamiento.
puedes habilitar "Instant Run" en Android Studio para obtener soporte multidex.
Soporte Multidex anterior a Android 5.0
Las versiones de la plataforma anteriores a Android 5.0 (API nivel 21) usan el tiempo de ejecución Dalvik para ejecutar el código de la aplicación. Por defecto, Dalvik limita las aplicaciones a un solo archivo de código de bytes classes.dex por APK. Para evitar esta limitación, lea configurar su aplicación para multidex
Soporte Multidex para Android 5.0 y superior
Android 5.0 (API nivel 21) y superior utiliza un tiempo de ejecución llamado ART que admite de forma nativa cargar múltiples archivos DEX desde archivos APK. ART realiza la precompilación en el momento de la instalación de la aplicación, que busca archivos classN.dex y los compila en un único archivo .oat para que el dispositivo Android lo ejecute. Por lo tanto, si su minSdkVersion es 21 o superior, no necesita la biblioteca de soporte multidex. Todo lo que necesita hacer es establecer multiDexEnabled en verdadero en su build.gradle de nivel de módulo
Lea más aquí: https://developer.android.com/studio/build/multidex