致命异常:在Android应用程序中调用静态方法时出现java.lang.NoClassDefFoundError

时间:2016-01-25 16:48:04

标签: java android android-gradle noclassdeffounderror

我们的一位测试人员使用运行Android 4.4.4的T-mobile Galaxy S4遇到了非常奇怪的NoClassDefFoundError崩溃问题。我完全不知道为什么会发生这些事情。

最新的一个是在片段中的onCreateView中调用静态方法时发生的。

MyCustomClass.getNumberOfItems(getActivity());

失败
  

致命异常:java.lang.NoClassDefFoundError   com.mycompany.myapp.utilities.MyCustomClass $ 5'/ P>

以下是相关方法:

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。)什么是&#34; $ 5&#34;课后名字? (回答:使用CollectionUtils.filter过滤匿名类的引用) 2.)这个用户有另一个类似性质的崩溃,但是在一个通过gradle包含的库中有一个完全不同的静态方法调用。我在这个问题中引用的崩溃来自于我自己的库项目中的代码,同样的静态方法调用也适用于应用程序中的其他位置。这个问题似乎正在蔓延,或者至少不包含在1个类或1个库中。

我们在build.gradle中定位以下Android版本:

minSdkVersion 14
targetSdkVersion 22  (android 5.1)

这可能会发生什么?另外需要注意的是,已签名的APK是使用Android Studio 2.0预览版4生成的。但是,该应用程序适用于20-30个其他测试版测试人员,所以我对使用预览版本的预览版本犹豫不决工作室。

3 个答案:

答案 0 :(得分:6)

NoClassDefFoundError s发生了,因为multidex只是在这个应用中部分实现了 - 出于某种原因,这在Android 5/6上工作正常,但在Android 4.x上它使你的应用程序崩溃{{1}在随机的地方。在我看来,Android Studio应该检测到这种情况,并且应该警告您已经不正确地实现了多索支持。

要解决此问题,请确保您的项目符合以下条件:

    应用级build.gradle的NoClassDefFoundError部分中的
  1. multiDexEnabled = true

  2. 项目级build.gradle中的
  3. defaultConfig

  4. 在应用类的compile 'com.android.support:multidex:1.0.0'中致电MultiDex.install()

  5. 有关multidex的更多详情,请访问here.

答案 1 :(得分:0)

我没有完全实现MultiDex支持,所以我的某些类不在正确的dex文件中。要解决此问题,您要做的不仅仅是在multiDexEnabled = true块中设置defaultConfig。并且:

  • 在您的依赖项中包括编译'com.android.support:multidex:1.0.1'
  • 让您的Application类扩展MultiDexApplication而不只是扩展Application。或者,您可以在应用程序类的MultiDex.install()中调用attachBaseContext()

答案 2 :(得分:0)

确保按照其他人在此处指出的答案设置先决条件,如果仍然发生崩溃,您可能也想尝试这种方法https://developer.android.com/studio/build/multidex#keep

<块引用>

为 multidex 应用构建每个 DEX 文件时,构建工具会执行复杂的决策,以确定主 DEX 文件中需要哪些类,以便您的应用可以成功启动。如果主 DEX 文件中未提供启动期间所需的任何类,则您的应用将崩溃并显示错误 java.lang.NoClassDefFoundError

using proguard

编辑:

或者您可以尝试这种方法,以便在主 DEX 中注册您的课程

https://medium.com/androidiots/androidiots-podcast-6-the-black-magic-behind-android-runtime-part-2-9390f751eef0