SDK 21 以下的 NoClassDefFoundError

NoClassDefFoundError below SDK 21

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

在我的 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', 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 版本出现这些问题吗?

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

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

5.

之前的 android 版本似乎是必需的

如果你没有have/use申请class,你可以这样写:

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

进入您在 AndroidManifest.xml

上的标签

如果您已经实施了应用程序class,@user2700475 + @sirvon 回复是您的最佳选择。

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

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

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

这将通过三种方式实现。

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

实际上,当您在 defaultConfig、ProductFlavor 或 BuildType 中指定 multiDexEnabled 为真时,使用 android 等级插件版本 0.14.0 和构建工具版本 21.1.0 然后它会自动包含对 com.android.support:多索引:1.0.0。 您可以使用 androidDependencie 任务或 运行 ./gradlew -q android:dependencies 命令(android:是我的 android 模块)进行检查。 因此无需显式添加

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

如果您在应用程序中扩展了应用程序 class:

  1. 定义您的应用程序扩展 MultiDexApplication class,例如:
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);}
}

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