【问题标题】:Didn't find class "android.support.multidex.MultiDexApplication" on path: DexPathList在路径上找不到类“android.support.multidex.MultiDexApplication”:DexPathList
【发布时间】:2015-01-02 00:41:28
【问题描述】:

我正在我的应用程序上尝试新的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 管理器安装了最新的支持库和 repo。

【问题讨论】:

  • 您是否还确保您拥有最新的构建工具版本?您能否还指定堆栈跟踪是来自调试版本还是发布版本?
  • @PaulR 我有 21.1 Build Tools 版本,堆栈跟踪属于调试版本。
  • @dustedrob 奇怪。首先验证 MultiDexApplication 是 maindexlist 的一部分。这个文本文件可以在 /app/build/intermediates/multi-dex/{debug/release}/maindexlist.txt 下找到
  • @AlexLipov MultiDexApplication 在 maindexlist.txt 文件中。
  • @dustedrob 太好了。你能反编译你的主 dex 文件(从你的输出 apk 中提取它)来验证 MultiDexApplication 类确实存在吗?你可以在这个答案中找到如何做到这一点:stackoverflow.com/a/4177581/1233652

标签: android gradle dex android-multidex


【解决方案1】:

该解决方案对我没有帮助,因为我使用的是 jetpack 版本,即 androidx。图书馆。

关注官方doc.

我不得不将名称更改为 androidx....Multidex。

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

希望它可以帮助其他正在寻找使用 jetpack 添加 multidex 的人。

【讨论】:

  • 你的答案是正确的,很多人从文档中复制并粘贴代码,却没有注意到他们使用的是 androidx。
  • 您的解决方案也适用于 Unity build 2018 with Mono,谢谢
  • 你是绝对正确的@Man,它发生在我身上好几次从官方文档中复制支持库才意识到我正在使用 Jetpack
  • 只有在您不扩展应用程序(如文档中所述)时,这才会工作。如果你是,你需要这样做:Application extends MultiDexApplication
【解决方案2】:

在我的情况下,它通过在清单中的以下代码的更改来解决

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

android:name="androidx.multidex.MultiDexApplication"

【讨论】:

  • 我迁移到 androidx 并忘记进行切换,愚蠢的错误。谢谢。
【解决方案3】:

我的配置:

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

解压apk,构建/输出/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 来检查类,应用程序类不在 classes.dex 中,相反它在 classes2.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/

问题: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.

【讨论】:

  • 嘿@Andrew Chen 和@Roberto Betancourt,我尝试添加依赖项和存储库,但在构建时遇到错误Error(1,0) TEST_SDK_DIR open file。
  • @XY-JOE,你使用最新的 android-gradle 插件吗? 2.3.3 或 3.0.1
  • @AndrewChen 我正在使用 gradle 2.3.3 但我不知道我到底做了什么但我不再有这个错误。感谢您的帮助
  • 我什至在使用 AndroidX multidex v2.0.0 并将应用程序实现为 MultidexApplication。在较低的 API
【解决方案4】:

将您的应用项目设置为使用 multidex 配置需要您对应用项目进行以下修改,具体取决于您的应用支持的最低 Android 版本。

如果您的 minSdkVersion 设置为 21 或更高,您只需在模块级 build.gradle 文件中将 multiDexEnabled 设置为 true,如下所示:

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 类,执行以下操作之一:

    • 如果您不覆盖 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>
      
    • 如果您确实覆盖了 Application 类,请将其更改为扩展 MultiDexApplication(如果可能),如下所示:

      public class MyApplication extends MultiDexApplication { ... }
      
    • 或者,如果您确实覆盖了 Application 类但无法更改基类,那么您可以改为覆盖 attachBaseContext() 方法并调用 MultiDex.install(this) 以启用 multidex:

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

【讨论】:

  • 我将 minSdkVersion 设置为 21,构建后应用程序因错误而崩溃找不到类 android.support.multidex.MultiDexApplication
【解决方案5】:

我最近遇到了这个问题。尽管我的配置没有改变,但这个错误开始发生。我尝试了所有建议的解决方案,包括删除虚拟设备并创建一个新设备。

但是,我确实注意到,如果我构建了一个 APK 并将其拖到模拟器中进行安装,它就可以正常工作。

最后清理项目并重新运行,然后它就可以工作了。

【讨论】:

  • 我完全按照他们在文档中提到的去做,但仍然遇到同样的错误。我做了“清理项目”->“重建项目”,它解决了这个问题。谢谢
【解决方案6】:

对我来说,答案是切换到 androidx 版本

android:name="androidx.multidex.MultiDexApplication"

implementation "androidx.multidex:multidex:2.0.1"

【讨论】:

  • 同时检查使用 X multidex 而非旧版 dex 的库 (com.android.support:multidex)
【解决方案7】:

我正在使用最新的 Android Studio 并按照官方文档添加对 multidex https://developer.android.com/studio/build/multidex.html 的支持。但我仍然有同样的例外。我花了很多时间解决它。最后,我发现原因是我启用了“Java Exception Breakpoints - Any exception”和“Exception Breakpoints - When any is throwed”。在我禁用它们后,应用程序运行没有问题。

只要关注multidex的官方文档https://developer.android.com/studio/build/multidex.html即可。它有效。

【讨论】:

    【解决方案8】:

    就我而言,我只是更改了 build.gradle,然后就这样离开了 AndroidManifest:

    android:name=".MainApplication"
    

    我正在使用 React Native。

    【讨论】:

      【解决方案9】:

      我只是改变了 在清单应用程序中

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

      android:name="androidx.multidex.MultiDexApplication"

      一切正常

      【讨论】:

        【解决方案10】:

        这对我有用。

        文件 -> 将项目与 Grandle 文件同步

        【讨论】:

        • 和构建 -> 重建项目
        【解决方案11】:

        很奇怪,我得到了同样的错误信息,但是在我修复了一些 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 模拟器。只更改了 ** 标记的行。

        【讨论】:

          【解决方案12】:
          Delete ./gradle .idea and build directory
          Clean project
          Uninstall app if already install on device and again install
          

          【讨论】:

            【解决方案13】:

            问题出在 Gradle 文件中,请增加版本即可

            buildscript {
                repositories {
                    google()
                    jcenter()
            
                }
                dependencies {
                    classpath 'com.android.tools.build:gradle:3.5.3'
            
                }
            }
            

            【讨论】:

              【解决方案14】:

              机器人{ compileSdkVersion 30 buildToolsVersion "30.0.1"

              defaultConfig {
                  applicationId "com.nandeproduction.dailycost"
                  minSdkVersion 16
                  targetSdkVersion 30
                  versionCode 1
                  versionName "1.0"
              
                  testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
                  multiDexEnabled true
              }
              
              compileOptions {
                  sourceCompatibility 1.8
                  targetCompatibility 1.8
              }
              
              buildTypes {
                  release {
                      minifyEnabled false
                      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
                  }
              }}
              

              [解决方案]使用此特殊代码

              compileOptions {
                  sourceCompatibility 1.8
                  targetCompatibility 1.8
              }
              

              【讨论】:

                猜你喜欢
                • 2016-02-04
                • 2017-09-12
                • 2014-05-29
                • 2015-07-01
                • 2018-12-30
                • 2014-04-19
                • 1970-01-01
                相关资源
                最近更新 更多