我们的一位测试人员在使用运行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添加的库中。我所提到的问题崩溃来自于我的自己的库项目代码部分,而且同样的静态方法调用在 App 的其他地方也能正常工作。这个问题似乎正在扩散,或者至少不仅局限于1个类或1个库。
我们在 build.gradle 中针对以下 Android 版本进行开发:
minSdkVersion 14
targetSdkVersion 22 (android 5.1)
这里可能发生了什么事情?还有一件需要注意的事情是,签名的APK是使用Android Studio 2.0 preview 4生成的。然而,该应用程序对其他20-30个测试人员正常运行,因此我不想指责使用Studio的预览版本。
MyCustomClass$5
是在MyCustomClass
中定义的匿名类的名称。它不一定是该类源代码中出现的第5个匿名类,但很可能至少有5个匿名类在其中。 - Andy Turnerproguard-rules.pro
放在它的上方。 - Rod_Algonquin