[英]Exception java.lang.NoClassDefFoundError android/app/Activity
[英]Fatal Exception: java.lang.NoClassDefFoundError when calling static method in Android app
我们的一位使用运行 Android 4.4.4 的 T-mobile Galaxy S4 的 Beta 测试人员遇到了非常奇怪的 NoClassDefFoundError 崩溃。 我完全不知道为什么会发生这些。
最近一次发生在片段中的onCreateView
中调用静态方法时。
MyCustomClass.getNumberOfItems(getActivity());
失败
致命异常:java.lang.NoClassDefFoundError com.mycompany.myapp.utilities.MyCustomClass$5
这是有问题的方法:
public static List<Item> getNumberOfItems(final Context context)
{
List<Item> allFinishedItems = getAllFinishedItems(context);
CollectionUtils.filter(allFinishedItems, new Predicate<Item>()
{
@Override
public boolean evaluate(Item item)
{
// TODO Auto-generated method stub
return isNonCustomItem(context, item);
}
});
return allFinishedItems;
}
1.) 类名后面的“$5”是什么? (答案:引用匿名类以使用 CollectionUtils.filter 进行过滤) 2.) 该用户发生了另一次类似性质的崩溃,但具有完全不同的静态方法调用,该调用位于通过 gradle 包含的库中。 我在这个问题中引用的崩溃来自作为我自己的库项目一部分的代码,并且相同的静态方法调用在应用程序的其他地方有效。 这个问题似乎正在蔓延,或者至少没有包含在 1 个类或 1 个库中。
我们在 build.gradle 中针对以下 Android 版本:
minSdkVersion 14
targetSdkVersion 22 (android 5.1)
这里可能会发生什么? 另一件需要注意的事情是,签名的 APK 是使用 Android Studio 2.0 预览版 4 生成的。但是,该应用程序适用于 20-30 名其他 Beta 测试人员,因此我犹豫是否使用 Studio 的预览版。
NoClassDefFoundError
s 的发生是因为 multidex 仅在此应用程序中部分实现 - 出于某种原因,这在 Android 5/6 上运行良好,但在 Android 4.x 上它会使您的应用程序在随机位置因NoClassDefFoundError
崩溃。 在我看来,这种情况应该由 Android Studio 检测到,你应该被警告你没有正确实现 multidex 支持。
要修复它,请确保您的项目符合以下条件:
multiDexEnabled = true
在应用级 build.gradle 的defaultConfig
部分
在您的项目级 build.gradle 中compile 'com.android.support:multidex:1.0.0'
呼叫MultiDex.install()
在attachBaseContext()
应用程序类的。
我们使用运行Android 4.4.4的T-mobile Galaxy S4的Beta测试人员之一遇到了非常奇怪的NoClassDefFoundError崩溃。 我完全不知道为什么会发生这些事情。
最近的一个事件是在片段的onCreateView
中调用静态方法时发生的。
MyCustomClass.getNumberOfItems(getActivity());
失败于
致命异常:java.lang.NoClassDefFoundError com.mycompany.myapp.utilities.MyCustomClass $ 5
这是有问题的方法:
public static List<Item> getNumberOfItems(final Context context)
{
List<Item> allFinishedItems = getAllFinishedItems(context);
CollectionUtils.filter(allFinishedItems, new Predicate<Item>()
{
@Override
public boolean evaluate(Item item)
{
// TODO Auto-generated method stub
return isNonCustomItem(context, item);
}
});
return allFinishedItems;
}
1.)类名后面的“ $ 5”是什么? (答案:引用匿名类以使用CollectionUtils.filter进行过滤)2.)此用户发生了另一次类似的崩溃,但是通过gradle包含在库中的静态方法调用完全不同。 我在此问题中引用的崩溃来自我自己的库项目中的代码,并且相同的静态方法调用在应用程序的其他位置也有效。 这个问题似乎正在蔓延,或者至少没有包含在1个类或1个库中。
我们在build.gradle中定位以下Android版本:
minSdkVersion 14
targetSdkVersion 22 (android 5.1)
这可能是怎么回事? 还要注意的另一件事是,已签名的APK是使用Android Studio 2.0预览版4生成的。但是,该应用程序可用于其他20-30个Beta测试人员,因此我犹豫要使用Studio的预览版。
确保按照其他人的回答在此处设置先决条件,如果仍然发生崩溃,您可能也想尝试这种方法https://developer.android.com/studio/build/multidex#keep
为 multidex 应用程序构建每个 DEX 文件时,构建工具会执行复杂的决策,以确定主 DEX 文件中需要哪些类,以便您的应用程序可以成功启动。 如果主 DEX 文件中未提供启动期间所需的任何类,则您的应用程序将崩溃并显示错误 java.lang.NoClassDefFoundError
编辑:
或者您可以尝试这种方法,以便在主要 DEX 中注册您的课程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.