【问题标题】:java.lang.NoClassDefFoundError on Android version lower than Lollipop低于 Lollipop 的 Android 版本上的 java.lang.NoClassDefFoundError
【发布时间】:2015-04-10 12:18:42
【问题描述】:

我有一台装有 Android 21 的 Nexus 5 设备。我正在测试我的项目没有问题。但是,如果我使用 Google API 19 在模拟器上进行测试,则会显示错误 java.lang.NoClassDefFoundError。如果在 Lollipop 上运行良好,怎么会出现这个错误?我什至用索尼 4.4 设备问过我的朋友,他的手机也崩溃了。我将编译 SDK 版本设置为 21,构建工具设置为 21.1.2。我尝试了 gradle clean 并且正在使用 Android Studio。任何帮助将不胜感激。

此错误仅发生在低于 Lollipop 的设备上:

这是出现在 Logcat 中的内容:

02-10 07:46:19.200    2238-2238/com.myproject.android.indonesia E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.myproject.android.indonesia, PID: 2238
    java.lang.NoClassDefFoundError: com.myproject.android.indonesia.task.GetProjectTask$1
            at com.myproject.android.indonesia.task.GetProjectTask.execute(GetProjectTask.java:27)
            at com.myproject.android.indonesia.activity.SplashActivity.launchProjectTask(SplashActivity.java:111)
            at com.myproject.android.indonesia.activity.SplashActivity.onCreate(SplashActivity.java:71)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

这里是调用getProjectTask()的sn-p

GetProjectTask mGetProjectTask = new GetProjectTask(this);
mGetProjectTask.mUrl.append(Constants.Link.HOST).append(Constants.Webservice.GET_PROJECT);
mGetProjectTask.params.put(Constants.Key.PRJ_LICENCE, Constants.Constant.LICENCE);
mGetProjectTask.params.put(Constants.Key.LANGUAGE, currentLanguage);
mGetProjectTask.params.put(Constants.Key.CTY_NAME, Constants.Value.APP_CTY_NAME);
mGetProjectTask.execute();

更新 看来我需要使用我正在使用的 SDK 之一的最新版本来避免此错误(Aviary SDK)。当我升级后,这个错误不再出现了。

【问题讨论】:

  • 请发布整个堆栈跟踪
  • 你能把代码 sn-p 显示在SplashActivity.java:71GetProjectTask 函数的位置吗?
  • 在我的 onCreate 方法上调用 getProjectTask。请看上面的sn-p。
  • 您必须发布 GetProjectTask 的代码,因为它使用的是 Lollipop 的一些新类。仅仅因为您的应用在 Lollipop 上运行并不意味着它会在旧系统上运行...
  • 你能发布GetProjectTask代码吗?

标签: android android-studio noclassdeffounderror


【解决方案1】:

您的类(GetProjectTask 中的第一个匿名类)扩展了该平台上不可用的类。

【讨论】:

  • 但是在将我们项目的目标设置为Android 21之前。该应用可以支持4.0+版本。一个库需要 21 个才能构建,这使得该应用程序只能在 5.0 中运行。我的最小 sdk 设置为 17。
  • 如果你有需要 API 21 的库,那么你不能在较低的 API 上使用它(包括它的类)。
【解决方案2】:

如果您仔细查看 API 文档,您会注意到类文档右上角的“add in API x”,以及每个 API 方法中的类似文本。

例如参见AnimatedVectorDrawable - 它是在 API 级别 21 (Lollipop) 中添加的。

尝试在旧设备上使用 API 21 中添加的类将失败,但您遇到了异常。这并不奇怪,因为不幸的是,较旧的操作系统版本中没有新功能。

您可以通过多种方式克服此异常:使用兼容性库,仅在手机支持时启用新功能(通过检查 Build.Version.SDK_INT 或使用 api 级别特定的 res 文件夹,例如 layout-v21

另一种选择是将minSdkVersion 设置为 21,然后您的应用将拒绝安装在旧设备上(并且不会在他们的 Google Play 商店中提供)。

有关此主题的更多详细信息,请参阅compatibility 上的 Android 文档。

【讨论】:

  • 如果我错了,请纠正我,但我知道使用兼容性库 (appcompat) 可以解决这个问题。情况并非总是如此?
  • 你错了。 appcompat 并不神奇,它实现了一些功能并与您的应用程序捆绑在一起(使您的 APK 更大)。有时这是可能的(实现片段、简单动画),但一些新功能需要更强大的硬件(阴影、模糊)或更深入的操作系统更改(矢量动画使用特殊的操作系统“渲染线程”)。
  • 还要注意 AppCompat 中的类不是同一个类,例如。 android.app.Fragment 使用在 OS 级别实现的 Fragment,android.support.v4.app.Fragment 在您的 apk 中实现类似的逻辑。即使它们看起来与使用它们的程序员相同,因为 Java 是强类型的,它们也不能互换。
【解决方案3】:

这已经为我解决了,添加 build.gradle:

 dexOptions {
        preDexLibraries = false
        javaMaxHeapSize = "4g"
    }

编译'javax.inject:javax.inject:1'

在应用程序类中扩展 MultiDexApplication

不要@Override attachBaseContext 方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 2015-08-22
    相关资源
    最近更新 更多