Pregunta No encontré la clase "android.support.multidex.MultiDexApplication" en la ruta: DexPathList


Estoy probando el nuevo Soporte MultiDex en mi aplicación y hasta ahora he logrado compilar mi aplicación correctamente, pero cuando la ejecuto, obtengo la siguiente excepción:

java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList[[zip file "/data/app/me.myapp.main-2.apk"],nativeLibraryDirectories=[/data/app-lib/me..main-2, /vendor/lib, /system/lib]]
    at android.app.LoadedApk.makeApplication(LoadedApk.java:507)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4382)
    at android.app.ActivityThread.access$1500(ActivityThread.java:139)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1270)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5086)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList[[zip file "/data/app/me.myapp.main-2.apk"],nativeLibraryDirectories=[/data/app-lib/me.myapp.main-2, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
    at android.app.Instrumentation.newApplication(Instrumentation.java:998)
    at android.app.LoadedApk.makeApplication(LoadedApk.java:502)

Este es mi archivo gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 21
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
    }
}

repositories {
    mavenCentral()
    mavenLocal()
}


dependencies {
    compile 'com.android.support:multidex:1.0.0'
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:support-v4:21.0.0'
    compile 'com.android.support:support-v13:21.0.0'
    compile 'com.android.support:appcompat-v7:21.0.0'
}

Y mi AndroidManifest.xml:

<application
android:name="android.support.multidex.MultiDexApplication">

No entiendo cuál es el problema. Creo que estoy haciendo todo de acuerdo con la documentación. ¿Hay algo más que me falta? Me aseguré de tener instalada la última biblioteca de soporte y repo desde el administrador de SDK.


32
2017-11-05 17:44


origen


Respuestas:


Mi configuración:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.14.+' // 0.14.1, 2014-11-6
    }
}

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

android {
    compileSdkVersion = 21
    buildToolsVersion = "21.1.0"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
        multiDexEnabled true
    }
}

Desafortunadamente, tengo el mismo problema. Pero encontré una situación extraña:

build / intermediate / dex / debug:

-rw-rw-r--  1 andrew andrew  2221176 Nov  6 20:18 classes2.dex
-rw-rw-r--  1 andrew andrew  8357596 Nov  6 20:18 classes.dex

descomprimir apk, construir / salidas / apk:

-rw-rw-r-- 1 andrew andrew 8357596 Nov  6 20:18 classes2.dex
-rw-rw-r-- 1 andrew andrew 2221176 Nov  6 20:18 classes.dex

En apk, las clases principales de classes.dex deberían ser más grandes que classes2.dex, pero no es así. También hago dex2jar y descomprimir jar para verificar clases, la clase de aplicación no está en classes.dex, está en classes2.dex por el contrario.

Sin embargo, debería haberlo arreglado. Aquí está mi plugin de gradle android parcheado que puedes probar:

buildscript {
    repositories {
        mavenCentral()
        maven { url 'https://github.com/yongjhih/android-gradle-plugin.m2/raw/master/' }
    }
    dependencies {
        classpath 'com.infstory.tools.build:gradle:0.14.+'
    }
}

El parche está en: https://github.com/yongjhih/android-gradle-plugin/commit/9c2212e3b1b4c6e1f7b47f2086aba1903a6258bf o https://android-review.googlesource.com/#/c/113331/

problema: https://code.google.com/p/android/issues/detail?id=78761

El parche oficial es https://android-review.googlesource.com/#/c/113201/ que ya se ha fusionado, creo que podría solucionarse en la próxima versión.

Ya se ha corregido 0.14.2 (2014/11/10). (de http://tools.android.com/tech-docs/new-build-system)

Release notes:

0.14.2 (2014/11/10)

Fix potential multi-dex issue where the dex files could be renamed during packaging, leading to the wrong main dex file being used.
Fix versionNameSuffix support
Fix BuildType.initWith to copy shrinkResources flag
setup default proguard rule file if none are provided (SDK/tools/proguard/proguard-android.txt)
BuildType.pseudoLocalesEnabled flag to include fake locales in apk.

16
2017-11-06 14:35



Estaba usando el último Android Studio y siguiendo el documento oficial para agregar soporte a multidex https://developer.android.com/studio/build/multidex.html . Pero todavía tengo la misma excepción. Pasé mucho tiempo resolviéndolo. Finalmente, encontré la causa en la que habilité "Puntos de corte de excepción de Java: cualquier excepción" y "Puntos de interrupción de excepción: cuando se lanza alguno". Después de deshabilitarlos, la aplicación se ejecutó sin problemas.

Solo sigue el documento oficial sobre multidex https://developer.android.com/studio/build/multidex.html . Funciona.


3
2018-06-05 09:43



Hace poco tuve este problema. A pesar de no haber cambiado mi configuración, este error comenzó a ocurrir. Probé todas las soluciones sugeridas, incluida la eliminación del dispositivo virtual y la creación de uno nuevo.

Sin embargo, sí noté que si construía una APK y la arrastraba al emulador para instalarla, funcionaba bien.

Al final limpiar el proyecto y volver a ejecutarlo y luego funcionó.


1
2017-10-04 23:51



La configuración de su proyecto de aplicación para usar una configuración multidex requiere que realice las siguientes modificaciones a su proyecto de aplicación, dependiendo de la versión mínima de Android compatible con su aplicación.

Si su minSdkVersion está configurada en 21 o más, todo lo que necesita hacer es establecer multiDexEnabled en verdadero en su archivo build.gradle de nivel de módulo, como se muestra aquí:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
}

Sin embargo, si su minSdkVersion está configurada en 20 o menos, entonces debe usar la biblioteca de soporte multidex de la siguiente manera:

  • Modifique el archivo build.gradle de nivel de módulo para habilitar multidex y agregue la biblioteca multidex como una dependencia, como se muestra aquí:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    
  • Dependiendo de si anula la clase de la Aplicación, realice una de las siguientes acciones:

    • Si no anula la clase de la Aplicación, edite su archivo de manifiesto para configurar Android: nombre en la etiqueta de la siguiente manera:

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapp">
          <application
                  android:name="android.support.multidex.MultiDexApplication" >
              ...
          </application>
      </manifest>
      
    • Si reemplaza la clase de la Aplicación, cámbiela para extender la Aplicación MultiDex (si es posible) de la siguiente manera:

      public class MyApplication extends MultiDexApplication { ... }
      
    • O si anula la clase de la aplicación, pero no es posible cambiar la clase base, puede reemplazar el método attachBaseContext () y llamar a MultiDex.install (esto) para habilitar multidex:

      public class MyApplication extends SomeOtherApplication {
        @Override
        protected void attachBaseContext(Context base) {
           super.attachBaseContext(base);
           MultiDex.install(this);
        }
      }
      

0
2017-07-11 14:06