【发布时间】:2016-05-02 01:42:46
【问题描述】:
我们的一位 Beta 测试人员使用运行 Android 4.4.4 的 T-mobile Galaxy S4 遇到了非常奇怪的 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 的预览版。
【问题讨论】:
-
"1.) 类名后面的“$5”是什么?
MyCustomClass$5是在MyCustomClass中定义的匿名类的名称。它不一定是该类的源代码中出现的第 5 个匿名类,但您可能至少有 5 个。 -
@AndyTurner 我猜这是“getNumberOfItems”方法中的 CollectionUtils.filter 调用。我现在将使用该方法的代码更新我的问题。
-
这是与 multidex 设置不正确相关的一个潜在原因 stackoverflow.com/questions/27698287/…。不确定您是否正在使用它,但可能值得一试。
-
@GeorgeMulligan 您可能正在做某事。真的很好找!如果有帮助,我会回来报告。
-
你启用proguard了吗?如果是,请将您的
proguard-rules.pro放在上方
标签: java android android-gradle-plugin noclassdeffounderror