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
这将通过三种方式实现。
- 如@FireZenk 所述,您可以将此 class 声明为 AndroidManifest.xml.
中的应用程序
<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:
- 定义您的应用程序扩展 MultiDexApplication class,例如:
public class MyApplication extends MultiDexApplication {
...
}
或点赞@user2700475 已发布
- 让您的应用程序覆盖 attachBaseContext:
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);}
}
在之前答案的帮助下,我设法找到了解决这个问题的方法。我只是想把所有这些放在一起。
我刚刚在我的应用程序中遇到了一个棘手的错误。
在我的 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
这将通过三种方式实现。
- 如@FireZenk 所述,您可以将此 class 声明为 AndroidManifest.xml. 中的应用程序
<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:
- 定义您的应用程序扩展 MultiDexApplication class,例如:
public class MyApplication extends MultiDexApplication {
...
}
或点赞@user2700475 已发布
- 让您的应用程序覆盖 attachBaseContext:
public class MyApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);}
}
在之前答案的帮助下,我设法找到了解决这个问题的方法。我只是想把所有这些放在一起。