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

时间:2014-11-05 17:44:52

标签: android gradle dex multidex android-multidex

我正在我的应用上尝试新的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。

13 个答案:

答案 0 :(得分:16)

我的配置:

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 / outputs / 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&amp; 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.

答案 1 :(得分:5)

设置您的应用项目以使用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);
        }
      }
      

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

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

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

答案 4 :(得分:1)

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

以下是官方doc
还有
我不得不将名称更改为androidx .... Multidex。

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

希望它可以帮助其他寻求通过jetpack添加多dex的人。

答案 5 :(得分:1)

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

android:name="androidx.multidex.MultiDexApplication"

implementation "androidx.multidex:multidex:2.0.1"

答案 6 :(得分:1)

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

android:name=".MainApplication"

我正在使用React Native。

答案 7 :(得分: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仿真器。仅**标记的行被更改。

答案 8 :(得分:0)

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

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

android:name="androidx.multidex.MultiDexApplication"

答案 9 :(得分:0)

这对我有用。

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

答案 10 :(得分:0)

Delete ./gradle .idea and build directory
Clean project
Uninstall app if already install on device and again install

答案 11 :(得分:0)

问题出在Gradle文件中,请增加原来的版本

buildscript {
    repositories {
        google()
        jcenter()

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

    }
}

答案 12 :(得分:0)

我只是改变了 在清单申请中

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

android:name="androidx.multidex.MultiDexApplication"

运行正常