2014-11-05 245 views
31

我正在尝试新的MultiDex Support对我的应用程序,到目前为止我已设法正确编译我的应用程序,但运行它时,我出现以下情况例外:在路径中找不到类“android.support.multidex.MultiDexApplication”:DexPathList

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。

+0

您是否还确保您拥有最新的Build Tools版本?您还可以指定堆栈跟踪是来自调试还是发布版本? – PaulR 2014-11-05 18:38:13

+1

@PaulR我有21.1 Build Tool版本,堆栈跟踪属于调试版本。 – 2014-11-05 18:55:11

+0

@dustedrob奇怪。首先验证MultiDexApplication是否是您的maindexlist的一部分。此文本文件位于/app/build/intermediates/multi-dex/{debug/release}/maindexlist.txt – 2014-11-05 20:53:15

回答

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 

解压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,类的主要类别.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/9c2212e3b1b4c6e1f7b47f2086aba1903a6258bfhttps://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. 
+0

是的!这工作!谢谢你的帮助。 – 2014-11-06 19:02:29

+8

我正在使用1.1.0,刚刚遇到了这个问题... – Sam 2015-02-25 18:14:08

+0

嗨@Andrew Chen和@Roberto Betancourt,我尝试添加依赖项和存储库,但是在构建错误时出现'Error(1,0)TEST_SDK_DIR'打开文件。 – 2017-11-22 21:09:22

3

我用的是最新的Android Studio和下面的官方文档中添加支持multidex https://developer.android.com/studio/build/multidex.html。但我仍然有同样的例外。我花了很多时间解决它。最后,我发现原因是我启用了“Java异常断点 - 任何异常”和“异常断点 - 何时抛出”。我禁用它们后,该应用程序运行没有问题。

只需按照有关multidex https://developer.android.com/studio/build/multidex.html的官方文档。有用。

0

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

如果您的minSdkVersion设置为21或更高,所有你需要做的是设置multiDexEnabled为true在模块级的build.gradle文件,如下所示:

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

但是,如果你的minSdkVersion

  • 修改模块级的build.gradle文件,使multidex并添加multidex库作为依赖,如下所示:设置为20或更低,则必须按如下方式使用multidex支持库:

    android { 
        defaultConfig { 
         ... 
         minSdkVersion 15 
         targetSdkVersion 26 
         multiDexEnabled true 
        } 
        ... 
    } 
    
    dependencies { 
        compile 'com.android.support:multidex:1.0.1' 
    } 
    
  • 根据是否重写应用程序类,请执行下列操作之一:

    • 如果不重写应用程序类,编辑清单文件设置机器人:在标签的名称如下:

      <?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(本),以使multidex:

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

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

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

最后清理项目并重新运行,然后运行。

相关问题