繁体   English   中英

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

[英]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 支持。

要修复它,请确保您的项目符合以下条件:

  1. multiDexEnabled = true在应用级 build.gradle 的defaultConfig部分

  2. 在您的项目级 build.gradle 中compile 'com.android.support:multidex:1.0.0'

  3. 呼叫MultiDex.install()attachBaseContext()应用程序类的。

可以在此处找到有关 multidex 的更多详细信息

我们使用运行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 中注册您的课程

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM