在路径上找不到类“android.support.multidex.MultiDexApplication”:DexPathList

Posted

技术标签:

【中文标题】在路径上找不到类“android.support.multidex.MultiDexApplication”:DexPathList【英文标题】:Didn't find class "android.support.multidex.MultiDexApplication" on path: 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 类确实存在吗?你可以在这个答案中找到如何做到这一点:***.com/a/4177581/1233652 【参考方案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

【讨论】:

以上是关于在路径上找不到类“android.support.multidex.MultiDexApplication”:DexPathList的主要内容,如果未能解决你的问题,请参考以下文章

Android ClassNotFoundException:在路径上找不到类

Android ClassNotFoundException:在路径上找不到类

在路径 DexPathList 上找不到类

ClassNotFoundException:在路径上找不到类:DexPathList

在路径上找不到类:dexpathlist

java.lang.ClassNotFoundException:在路径上找不到类“app path”:/data/app/