致命异常:java.lang.NoClassDefFoundError 在 Android 应用程序中调用静态方法时
Fatal Exception: java.lang.NoClassDefFoundError when calling static method in Android app
我们的一位使用 T-mobile Galaxy S4 运行 Android 4.4.4 的 Beta 测试人员遇到了非常奇怪的 NoClassDefFoundError 崩溃。我完全不知道为什么会发生这些。
最近一次发生在片段 onCreateView
中调用静态方法时。
MyCustomClass.getNumberOfItems(getActivity());
失败
Fatal Exception: java.lang.NoClassDefFoundError
com.mycompany.myapp.utilities.MyCustomClass
这是有问题的方法:
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.) class 名字后面的“$5”是什么? (答案:参考匿名 class 用 CollectionUtils.filter 过滤)
2.) 这个用户有另一个类似性质的崩溃,但是在通过 gradle 包含的库中有一个完全不同的静态方法调用。我在这个问题中引用的崩溃来自我自己的库项目的代码,并且相同的静态方法调用在应用程序的其他地方也有效。这个问题似乎正在蔓延,或者至少没有包含在 1 class 或 1 个库中。
我们在 build.gradle 中针对以下 Android 版本:
minSdkVersion 14
targetSdkVersion 22 (android 5.1)
这里可能发生了什么?另一件需要注意的事情是,签名的 APK 是使用 Android Studio 2.0 预览版 4 生成的。但是,该应用程序适用于 20-30 名其他 Beta 测试人员,所以我犹豫要不要指责使用预览版Studio 版本。
NoClassDefFoundError
之所以发生,是因为 multidex 在此应用程序中仅部分实现 - 出于某种原因,这在 Android 5/6 上运行良好,但在 Android [=40 上运行良好=] 它会让你的应用程序在随机位置崩溃 NoClassDefFoundError
。在我看来,这种情况应该由 Android Studio 检测到,并且应该警告您未正确实现 multidex 支持。
要修复它,请确保您的项目满足以下条件:
multiDexEnabled = true
在 app-level 的 defaultConfig
部分 build.gradle
compile 'com.android.support:multidex:1.0.0'
在你的 project-level build.gradle
在您的应用程序 attachBaseContext()
中调用 MultiDex.install()
class。
可以找到有关 multidex 的更多详细信息 here.
确保按照其他人的回答在这里指出的那样设置先决条件,如果崩溃仍然发生,您可能也想尝试这种方法https://developer.android.com/studio/build/multidex#keep
When building each DEX file for a multidex app, the build tools perform complex decision-making to determine which classes are needed in the primary DEX file so that your app can start successfully. If any class that's required during startup is not provided in the primary DEX file, then your app crashes with the error java.lang.NoClassDefFoundError
已编辑:
或者您可以尝试这种方法以便于在主要 DEX
中注册您的 类
我们的一位使用 T-mobile Galaxy S4 运行 Android 4.4.4 的 Beta 测试人员遇到了非常奇怪的 NoClassDefFoundError 崩溃。我完全不知道为什么会发生这些。
最近一次发生在片段 onCreateView
中调用静态方法时。
MyCustomClass.getNumberOfItems(getActivity());
失败
Fatal Exception: java.lang.NoClassDefFoundError com.mycompany.myapp.utilities.MyCustomClass
这是有问题的方法:
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.) class 名字后面的“$5”是什么? (答案:参考匿名 class 用 CollectionUtils.filter 过滤) 2.) 这个用户有另一个类似性质的崩溃,但是在通过 gradle 包含的库中有一个完全不同的静态方法调用。我在这个问题中引用的崩溃来自我自己的库项目的代码,并且相同的静态方法调用在应用程序的其他地方也有效。这个问题似乎正在蔓延,或者至少没有包含在 1 class 或 1 个库中。
我们在 build.gradle 中针对以下 Android 版本:
minSdkVersion 14
targetSdkVersion 22 (android 5.1)
这里可能发生了什么?另一件需要注意的事情是,签名的 APK 是使用 Android Studio 2.0 预览版 4 生成的。但是,该应用程序适用于 20-30 名其他 Beta 测试人员,所以我犹豫要不要指责使用预览版Studio 版本。
NoClassDefFoundError
之所以发生,是因为 multidex 在此应用程序中仅部分实现 - 出于某种原因,这在 Android 5/6 上运行良好,但在 Android [=40 上运行良好=] 它会让你的应用程序在随机位置崩溃 NoClassDefFoundError
。在我看来,这种情况应该由 Android Studio 检测到,并且应该警告您未正确实现 multidex 支持。
要修复它,请确保您的项目满足以下条件:
multiDexEnabled = true
在 app-level 的defaultConfig
部分 build.gradlecompile 'com.android.support:multidex:1.0.0'
在你的 project-level build.gradle在您的应用程序
attachBaseContext()
中调用MultiDex.install()
class。
可以找到有关 multidex 的更多详细信息 here.
确保按照其他人的回答在这里指出的那样设置先决条件,如果崩溃仍然发生,您可能也想尝试这种方法https://developer.android.com/studio/build/multidex#keep
When building each DEX file for a multidex app, the build tools perform complex decision-making to determine which classes are needed in the primary DEX file so that your app can start successfully. If any class that's required during startup is not provided in the primary DEX file, then your app crashes with the error java.lang.NoClassDefFoundError
已编辑:
或者您可以尝试这种方法以便于在主要 DEX
中注册您的 类