SDK 21下面的NoClassDefFoundError

时间:2015-03-13 13:42:54

标签: android noclassdeffounderror multidex

我刚刚在我的App中遇到了一个尴尬的错误。

在我的Nexus 5/7上运行android 5.0.1 / 5.0.2,一切正常。 但是,如果我尝试在具有早期版本(测试4.4.4和4.3)的设备上运行完全相同的代码,我会收到以下错误:

03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'com.default.package.application.model.Appcomponent', referenced from method com.default.package.application.controller.DatabaseHandler.getScreenComponents
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$1', referenced from method android.support.v7.app.ActionBarActivityDelegate.<init>
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegateHC', referenced from method android.support.v7.app.ActionBarActivityDelegate.createDelegate
03-13 13:49:41.140  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegateBase', referenced from method android.support.v7.app.ActionBarActivityDelegate.createDelegate
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method android.support.v7.app.ActionBarActivityDelegate.getDrawerToggleDelegate
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.internal.view.SupportMenuInflater', referenced from method android.support.v7.app.ActionBarActivityDelegate.getMenuInflater
03-13 13:49:41.150  21714-21714/? E/dalvikvm﹕ Could not find class 'android.support.v7.app.ActionBarActivityDelegate$ActionBarDrawableToggleImpl', referenced from method android.support.v7.app.ActionBarActivityDelegate.getV7DrawerToggleDelegate
03-13 13:49:41.150  21714-21714/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.default.package, PID: 21714
    java.lang.NoClassDefFoundError: android.support.v7.app.ActionBarActivityDelegateHC

我已经尝试将support.v7库添加为jar,但没有任何区别。 但是因为它适用于Lollipop设备,所以无论如何都没有意义。

这可能是关于Dalvik / Art变化的一些问题吗? 或者事实上我必须使用com.android.support:multidex:1.0.0,因为它是一个相当大的应用程序。

更新:我尝试删除一些依赖项,以达到65k方法限制。之后,该应用程序在4.4.4和4.3设备上运行。 我为启用multidex支持所做的就是设置

multiDexEnabled true
在defaultConfig部分中输入

并添加

compile 'com.android.support:multidex:1.0.0'

下面是build.gradle的依赖项部分。

知道为什么这会在旧的Android版本上导致这些问题吗?

3 个答案:

答案 0 :(得分:43)

我通过将此问题添加到我的应用程序类来解决了这个问题。

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}

对于5之前的Android版本来说似乎是必要的。

答案 1 :(得分:12)

这有三种方式可以起作用。

  1. 正如@FireZenk所说,您可以将此类声明为 AndroidManifest.xml 中的应用程序。
  2. <application android:name="android.support.multidex.MultiDexApplication">
    

    实际上,当你在defaultConfig,ProductFlavor或BuildType中指定multiDexEnabled为true时,android等级插件版本为0.14.0并构建工具版本为21.1.0,它会自动包含对com.android.support:multidex:1.0的依赖性0.0。 您可以使用androidDependencie任务检查,或者运行./gradlew -q android:dependencies命令(android:是我的android模块)。 所以没有必要明确添加

    compile 'com.android.support:multidex:1.0.0'
    

    如果您在应用中扩展了Application类:

    1. 定义您的应用程序扩展MultiDexApplication类,如:
    2. public class MyApplication extends MultiDexApplication {
          ...
      }
      

      或者喜欢@ user2700475发布

      1. 让您的应用程序覆盖attachBaseContext:
      2. public class MyApplication extends Application {
            @Override
            protected void attachBaseContext(Context base) {
            super.attachBaseContext(base);
            MultiDex.install(this);}
        }
        

        借助之前的答案,我设法找到解决此问题的方法。我只想把所有这些放在一起。

答案 2 :(得分:5)

如果您没有/使用Application类,可以输入:

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

进入AndroidManifest.xml上的标记

如果您已经实现了Application类,那么@ user2700475 + @sirvon响应是您的最佳选择。

显然,您需要添加Gradle依赖项:

compile 'com.android.support:multidex:1.0.0'

有关65k方法问题的更多信息: https://developer.android.com/tools/building/multidex.html