62

我正在我的应用程序上尝试新的MultiDex 支持,到目前为止,我已经成功地编译了我的应用程序,但是在运行它时,我得到了以下异常:

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)

这是我的毕业文件:

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 管理器安装了最新的支持库和存储库。

4

14 回答 14

63

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

遵循官方文档

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

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

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

于 2018-10-16T19:23:18.937 回答
26

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

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

android:name="androidx.multidex.MultiDexApplication"
于 2019-05-22T04:35:01.553 回答
19

我的配置:

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 和解压缩 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.
于 2014-11-06T14:35:33.153 回答
8

将您的应用项目设置为使用 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);
        }
      }
      
于 2017-07-11T14:06:57.780 回答
7

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

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

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

于 2017-10-04T23:51:23.147 回答
7

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

android:name="androidx.multidex.MultiDexApplication"

implementation "androidx.multidex:multidex:2.0.1"

于 2019-10-18T12:24:01.350 回答
3

我正在使用最新的 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即可。有用。

于 2016-06-05T09:43:38.530 回答
2

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

android:name=".MainApplication"

我正在使用 React Native。

于 2020-03-08T10:48:15.373 回答
2

我在清单应用程序中进行了更改

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

android:name="androidx.multidex.MultiDexApplication"

它工作正常

于 2020-10-15T22:38:04.590 回答
1

This worked for me.

File -> Sync Project with Grandle Files

于 2019-07-19T00:13:04.690 回答
0

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

于 2018-11-17T15:54:27.773 回答
0

问题出在 Gradle 文件中请增加版本就可以了

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'

    }
}
于 2019-12-20T09:03:09.130 回答
0

android { 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
}
于 2021-08-27T23:36:46.980 回答
0
Delete ./gradle .idea and build directory
Clean project
Uninstall app if already install on device and again install
于 2019-11-06T12:26:05.810 回答