Cómo habilitar multidex con la nueva biblioteca de soporte de Android Multidex

142

Quiero usar la nueva biblioteca de soporte Multidex para romper el límite del método para una de mis aplicaciones.

Con Android Lollipop, Google introdujo una biblioteca de soporte multidex que facilita el multidex.

¿Qué pasos son necesarios para usar esta biblioteca y construir mi aplicación con soporte multidex?

Janusz
fuente
Multidex admite la biblioteca de terceros para su aplicación
Keshav Gera

Respuestas:

293

Editar:

Android 5.0 (API nivel 21) y superior utiliza ART que admite multidexing. Por lo tanto, si minSdkVersiontiene 21 años o más, la biblioteca de soporte multidex no es necesaria.


Modifica tu build.gradle:

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
}

Si está ejecutando pruebas unitarias, querrá incluir esto en su Applicationclase:

public class YouApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

}

O simplemente haz que tu applicationclase se extiendaMultiDexApplication

public class Application extends MultiDexApplication {

}

Para más información, esta es una buena guía.

Chad Bingham
fuente
2
Si está utilizando las nuevas herramientas de compilación, este es definitivamente el camino a seguir.
Janusz
1
@ jem88 ¿Has actualizado tu gradle a 1.0 ?? Debe estar en 2.2. + (Eche un vistazo a su gradle-wrapper.properties) Los puntos clave: 1 su buildToolsVersion debe ser 21.1.1 o superior. 2 agregue multiDexEnabled truea su configuración predeterminada de su build.gradle (observe que no hay un =) 3 agregue el'com.android.support:multidex:1.0.0'
Chad Bingham el
3
¿Qué tal si no usamos la clase de aplicación? ¿Agregar android:name="android.support.multidex.MultiDexApplication"a la applicationetiqueta es AndroidManifest.xmlsuficiente?
Buddy
1
compilar 'com.android.support:multidex:1.0.1' no es necesario en 23
Naveed Ahmad
3
@NaveedAhmad, de acuerdo con los documentos de Google para desarrolladores: ..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'.
Sakiboy
44

Los siguientes pasos son necesarios para iniciar multi-dexing:

Agregue android-support-multidex.jar a su proyecto. El jar se puede encontrar en la carpeta del SDK de Android / sdk / extras / android / support / multidex / library / libs

Ahora puede dejar que su clase de aplicación de aplicaciones extienda MultiDexApplication

public class MyApplication extends MultiDexApplication

o anula attachBaseContext así:

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

Utilicé el enfoque de anulación porque eso no interfiere con la jerarquía de clases de su clase de aplicación.

Ahora su aplicación está lista para usar múltiples dex. El siguiente paso es convencer a Gradle para que construya un apk multi-dexed. El equipo de herramientas de compilación está trabajando para facilitar esto, pero por el momento debe agregar lo siguiente a la parte de Android de sus aplicaciones build.gradle

   dexOptions {
      preDexLibraries = false
   }

Y lo siguiente a la parte general de sus aplicaciones build.gradle

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

Se puede encontrar más información en el blog de Alex Lipovs .

Janusz
fuente
9
¿Cómo puedo usar esto sin gradle?
lacas
3
@ Janusz, ¿es posible usar la opción multidex sin gradle?
Devrim
1
No creo que esto sea posible sin gradle.
Janusz
55
¿Qué es la corrección Eclipse Ant, no gradle?
portfoliobuilder
Mi proyecto no crea un archivo gradle, creé uno y seguí tus pasos, pero no funciona para mí
BaDo
16

SIMPLEMENTE, para habilitar multidex, necesita ...

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}
...
}

dependencies {
implementation 'com.android.support:multidex:1.0.0'
}

También debe cambiar su archivo de manifiesto. En su manifiesto, agregue la clase MultiDexApplication de la biblioteca de soporte multidex al elemento de aplicación como este

<?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">
       ...
   </application>
</manifest>
smoothumut
fuente
1
Esto no habilitará la desintoxicación múltiple. Todavía te falta la clase de aplicación.
Chad Bingham el
1
Gracias por el comentario, esto funcionó para mi caso. Aquí está el enlace que obtuve referencia de developer.android.com/tools/building/multidex.html
smoothumut
1
Sí, tienes razón. Parece que no necesita tenerlo en su clase de aplicación a menos que esté ejecutando pruebas.
Chad Bingham
No entiendo esto ... Mi manifiesto de aplicación ya tiene una etiqueta de nombre. No creo que lo reemplace con android:name="android.support.multidex.MultiDexApplication Por favor, guíame ..
mboy
1
@mboy: No, MainActivity y la clase de aplicación son diferentes. Conozca más sobre la clase de aplicación aquí: rominirani.com/android-application-class
akshay7692
9

En su build.gradle agregue esta dependencia:

compile 'com.android.support:multidex:1.0.1'

nuevamente en su archivo build.gradle agregue esta línea al bloque defaultConfig :

multiDexEnabled true

En lugar de extender su clase de aplicación desde Aplicación extiéndala desde MultiDexApplication ; me gusta :

public class AppConfig extends MultiDexApplication {

ahora estás listo para irte! Y en caso de que lo necesite, todo lo que MultiDexApplicationhace es

public class MultiDexApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
MohammadReza
fuente
6

build.gradle

multiDexEnabled true
implementation 'androidx.multidex:multidex:2.0.1'

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
Isaak Osipovich Dunayevsky
fuente
3

Paso 1: Cambiar build.grade

defaultConfig {
    ...
    // Enabling multidex support.
    multiDexEnabled true
}

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

Paso 2: configuración en la clase de aplicación

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        MultiDex.install(this);
    }
}

Paso 3: Cambiar las propiedades de grado.

org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

¡Funcionará!. Gracias.

sonnv1368
fuente
Recibo el mensaje "No se puede encontrar el símbolo de MultiDex". ¿Alguien se enfrentó a este problema antes?
Aung Myint Thein
2

Aquí hay un enfoque actualizado a partir de mayo de 2020, con Android X.

Para minSdk> = 21

No necesitas hacer nada. Todos estos dispositivos usan la VM Android RunTime (ART), que admite multidex de forma nativa.

Para minSdk<21

En su nivel de módulobuild.gradle , asegúrese de que se completen las siguientes configuraciones:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    implementation 'androidx.multidex:multidex:2.0.1'
}

Luego, src/main/AndroidManifest.xmldebe declarar MultiDexApplicationcomo application:name:

<manifest package="com.your.package"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="androidx.multidex.MultiDexApplication" />
</manifest>
Jameson
fuente
1

Añadir a AndroidManifest.xml:

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

O

MultiDex.install(this);

en el método attachBaseContext de su aplicación personalizada

o su aplicación personalizada extiende MultiDexApplication

agregue multiDexEnabled = true en su build.gradle

defaultConfig {
    multiDexEnabled true
}

dependencies {
    compile 'com.android.support:multidex:1.0.0'
    }
}
Malik Abu Qaoud
fuente
@Harsha no se recomienda usar esto, pero intente agregar largeHeap a su archivo de manifiesto <aplicación android: largeHeap = "true"> </application>
Malik Abu Qaoud
android: largeHeap = "true" android: allowBackup = "true" se agregaron ambos
Harsha
agregue esto al archivo gradle >>>>>>>>> dexOptions {javaMaxHeapSize "4g"}
Malik Abu Qaoud
1

Primero debes probar con Proguard (Esto limpia todo el código sin usar)

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
Moisés Apaza Q
fuente
0

Si desea habilitar multi-dex en su proyecto, simplemente vaya a gradle.builder

y agregue esto en su dependencia

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

entonces tienes que agregar

 defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...

// Enabling multidex support.
multiDexEnabled true}

Luego abra una clase y extiéndala a la Aplicación. Si su aplicación usa extiende la clase de Aplicación, puede anular el método oncrete () y llamar

   MultiDex.install(this) 

para habilitar multidex.

y finalmente agregar a tu manifiesto

 <?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">
   ...
   </application>
 </manifest> 
pavel
fuente
1
¿Qué es gradle.builder?
Chad Bingham
Gradle su archivo que se encuentra en su proyecto Android Studio
Pavel
0

Todas las respuestas anteriores son increíbles.

También agregue esto, de lo contrario su aplicación se bloqueará como la mía sin ningún motivo

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
Abhishek Mathur
fuente
0

Con androidx, las bibliotecas de soporte clásicas ya no funcionan.

La solución simple es usar el siguiente código

En su build.gradlearchivo

android{
  ...
  ...
  defaultConfig {
     ...
     ...
     multiDexEnabled true
  }
  ...
}

dependencies {
  ...
  ...
  implementation 'androidx.multidex:multidex:2.0.1'
}

Y en su manifiesto simplemente agregue el atributo de nombre a la etiqueta de la aplicación

<manifest ...>
    <application
        android:name="androidx.multidex.MultiDexApplication"
     ...
     ...>
         ...
         ...
    </application>
</manifest>

Si su aplicación está dirigida a API 21 o superior, multidex está habilitado de forma predeterminada.

Ahora, si desea deshacerse de muchos de los problemas que enfrenta al tratar de admitir multidex, primero intente usar la reducción de código mediante la configuración minifyEnabled true.

mayank1513
fuente
-2

simplemente agregando esto recortado en build.gradle también funciona bien

android {
   compileSdkVersion 22
   buildToolsVersion "23.0.0"

     defaultConfig {
         minSdkVersion 14 //lower than 14 doesn't support multidex
         targetSdkVersion 22

         **// Enabling multidex support.
         **multiDexEnabled true****
     }
}
Chirag Thummar
fuente
-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
latitud longitud
fuente