24

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

在我的 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 版本上导致这些问题吗?

4

3 回答 3

43

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

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

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

于 2015-03-13T20:59:22.620 回答
12

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

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

实际上,使用 android 级插件版本 0.14.0 和构建工具版本 21.1.0,当您在 defaultConfig、ProductFlavor 或 BuildType 中指定 multiDexEnabled 为 true 时,它​​会自动包含对 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);}
}

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

于 2015-07-09T09:41:35.020 回答
6

如果你没有/使用 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

于 2015-05-08T08:21:36.880 回答