Не удалось найти класс "android.support.multidex.MultiDexApplication" по пути: DexPathList

Я пытаюсь создать новую MultiDex Support в своем приложении, и до сих пор мне удалось правильно скомпилировать приложение, но при его запуске я получаю следующее исключение:

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)

Это мой файл 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'
}

И мой AndroidManifest.xml:

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

Я не понимаю, в чем проблема. Я думаю, что я делаю все в соответствии с документацией. Есть что-то еще, чего я не вижу? Я убедился, что у меня была самая последняя библиотека поддержки и репо, установленные из менеджера SDK.

Ответ 1

Моя конфигурация:

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
    }
}

К сожалению, у меня такая же проблема. Но я нашел странную ситуацию:

сборки/промежуточные/Dex/отладки:

-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

unzip apk, build/output/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

В apk основные классы classes.dex должны быть больше, чем classes2.dex, но его нет. Я также использую dex2jar и unzip jar для проверки классов, класс приложения не существует в классах .dex, его в классах2.dex наоборот.

Однако я должен был исправить это. Вот мой исправленный Android-модуль gradle, который вы можете попробовать:

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

Патч находится в: https://github.com/yongjhih/android-gradle-plugin/commit/9c2212e3b1b4c6e1f7b47f2086aba1903a6258bf или https://android-review.googlesource.com/#/c/113331/

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

Официальный патч https://android-review.googlesource.com/#/c/113201/, который уже был объединен, я думаю, он может быть исправлен в следующей версии.

Уже исправлено 0.14.2 (2014/11/10). (из 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.

Ответ 2

Решение не помогло мне, потому что я использовал версию Jetpack, то есть Androidroid. библиотеки.

Последовал официальный док.
А также
Мне пришлось сменить имя на androidx.... Multidex.

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

Надеюсь, что это помогает другим людям, которые ищут добавление мультидекса с реактивным ранцем.

Ответ 3

В моем случае это решается путем изменения кода ниже в манифесте от

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

в

android:name="androidx.multidex.MultiDexApplication"

Ответ 4

Настройка вашего проекта приложения для использования конфигурации с несколькими приложениями требует внесения в проект приложения следующих изменений, в зависимости от минимальной версии Android, поддерживаемой вашим приложением.

Если для вашего minSdkVersion установлено значение 21 или выше, все, что вам нужно сделать, это установить для параметра multiDexEnabled значение true в файле build.gradle на уровне модуля, как показано ниже:

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

Однако, если для вашего minSdkVersion установлено значение 20 или ниже, вы должны использовать библиотеку поддержки multidex следующим образом:

  • Измените файл build.gradle на уровне модуля, чтобы включить multidex, и добавьте библиотеку multidex в качестве зависимости, как показано ниже:

    android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 26
            multiDexEnabled true
        }
        ...
    }
    
    dependencies {
      compile 'com.android.support:multidex:1.0.1'
    }
    
  • В зависимости от того, переопределяете ли вы класс Application, выполните одно из следующих действий:

    • Если вы не переопределяете класс приложения, отредактируйте файл манифеста, чтобы установить имя android: name в теге следующим образом:

      <?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>
      
    • Если вы переопределите класс приложения, измените его, чтобы расширить MultiDexApplication (если возможно) следующим образом:

      public class MyApplication extends MultiDexApplication { ... }
      
    • Или если вы переопределите класс приложения, но не можете изменить базовый класс, вместо этого вы можете переопределить метод attachBaseContext() и вызвать MultiDex.install(this), чтобы включить multidex:

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

Ответ 5

У меня недавно была эта проблема. Несмотря на отсутствие изменений в моей конфигурации, эта ошибка возникла. Я попробовал все предлагаемые решения, включая удаление виртуального устройства и создание нового.

Однако я заметил, что если я построил APK и перетащил его в эмулятор для установки, он работал нормально.

В конце очистки проекта и повторного запуска, а затем он работал.

Ответ 6

Я использовал последнюю версию Android Studio и после официального документа, чтобы добавить поддержку multidex https://developer.android.com/studio/build/multidex.html. Но у меня все же есть то же исключение. Я потратил много времени на его решение. Наконец, я обнаружил, что причина была в том, что я включил "Точки останова исключения Java - любое исключение" и "Исключительные точки останова - когда кто-то выбрасывается". После того как я отключил их, приложение бежало без проблем.

Просто следуйте официальному документу о multidex https://developer.android.com/studio/build/multidex.html. Он работает.

Ответ 7

Очень странно, я получил то же самое сообщение об ошибке, но после того, как я исправил некоторые линии gradle, это сработало. Может быть, это кому-нибудь поможет

Проект build.gradle:

от:

..

dependencies {
        // Android Gradle Plugin
        classpath 'com.android.tools.build:gradle:3.2.1'
        // Analytics
        **classpath 'com.google.gms:google-services:3.0.0'**
}

..

в:..

dependencies {
        // Android Gradle Plugin
        classpath 'com.android.tools.build:gradle:3.2.1'
        // Analytics
        **classpath 'com.google.gms:google-services:3.2.1'**
}

..

В модуле build.gradle:

от:

..

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:support-compat:26.1.0'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    **implementation 'com.google.android.gms:play-services-analytics:12.0.1'**
}

..

чтобы:

..

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
    implementation 'com.android.support:support-v4:26.1.0'
    implementation 'com.android.support:support-compat:26.1.0'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    **implementation 'com.google.android.gms:play-services-analytics:16.0.5'**
}

..

Других изменений в моем коде не было, но исправленная версия работала и на эмуляторах 4.x. Изменяются только отмеченные ** строки.

Ответ 8

Это сработало для меня.

Файл → Синхронизировать проект с файлами Grandle

Ответ 9

Для меня ответом было переключиться на версии androidx

android:name="androidx.multidex.MultiDexApplication"

implementation "androidx.multidex:multidex:2.0.1"