【问题标题】:NoClassDefFoundError below SDK 21SDK 21 以下的 NoClassDefFoundError
【发布时间】:2015-05-16 00:39:48
【问题描述】:

我刚刚在我的应用程序中遇到了一个尴尬的错误。

在我的 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 设备上运行。 我为启用多索引支持所做的只是设置

multiDexEnabled true

在defaultConfig部分并添加

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

在我的 build.gradle 的依赖项部分下方。

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

【问题讨论】:

  • 在eclipse中新建lollipop项目并将其appcompat添加到该项目中
  • com.default.package.application.model.appcomponent 来自哪里?
  • 我尝试在 Android Studio 中创建一个新项目并添加所有现有源,但我仍然遇到同样的问题。 com.default.package 只是我的实际包名的占位符。

标签: android noclassdeffounderror android-multidex


【解决方案1】:

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

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

对于 5 之前的 android 版本似乎是必需的。

【讨论】:

  • 您是否正在通过 MultiDexApplication 扩展您的应用程序类? “公共类 App 扩展 MultiDexApplication ”...也是?
  • public class MyApplication extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); }
  • 啊...错误地赞成它:(它仍然不适用于 kitkat 之前的版本
  • 为我修复了它,但是,如果您使用的是 Robolectric,那么单元测试可能会失败。我已经回答了一个类似的问题here,并提供了一些额外的链接和信息来解决围绕 Multidex 的几个问题。
  • 感谢您的解决方案,我正在尝试在我的 react-native 项目中使用相同的东西。但我收到有关 appOpsManager 的错误。你不知道为什么?
【解决方案2】:

这是如何工作的三种方式。

  1. 正如@FireZenk 所说,您可以在 AndroidManifest.xml 中将此类声明为应用程序。
<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. 您可以使用 androidDependencie 任务进行检查,或者运行 ./gradlew -q android:dependencies 命令(android: 是我的 android 模块)。 所以不需要显式添加

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

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

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

或喜欢@user2700475 发布

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

在以前的答案的帮助下,我设法找到了这个问题的解决方案。我只是想把所有这些放在一起。

【讨论】:

  • 感谢第一步的帮助!
  • 我推荐第三个选项,但是,如果您使用的是 Robolectric,那么单元测试可能会失败。我已经回答了一个类似的问题here,并提供了一些额外的链接和信息来解决围绕 Multidex 的几个问题。
【解决方案3】:

如果你没有/使用Application类,你可以这样写:

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

进入您在 AndroidManifest.xml 上的标签

如果您已经实现了一个应用程序类,@user2700475 + @sirvon 响应是您的最佳选择。

同样显然,你需要添加 Gradle 依赖:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多