java.lang.NoClassDefFoundError: Landroid/support/v4/os/BuildCompat 的解析失败

41

我已经将AppCompat库更新到24.2.1版本并将SDK升级到Android 7,但自那以后,我无法运行任何应用程序。希望您能帮我解决这个问题...

E/AndroidRuntime(17555): java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/os/BuildCompat;
E/AndroidRuntime(17555):    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:196)
E/AndroidRuntime(17555):    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:181)
E/AndroidRuntime(17555):    at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:521)
E/AndroidRuntime(17555):    at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:71)
E/AndroidRuntime(17555):    at com.ryosoftware.calendareventsnotifier.MainActivity.onCreate(MainActivity.java:844)
E/AndroidRuntime(17555):    at android.app.Activity.performCreate(Activity.java:5990)
E/AndroidRuntime(17555):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
E/AndroidRuntime(17555):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
E/AndroidRuntime(17555):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
E/AndroidRuntime(17555):    at android.app.ActivityThread.access$900(ActivityThread.java:154)
E/AndroidRuntime(17555):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
E/AndroidRuntime(17555):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(17555):    at android.os.Looper.loop(Looper.java:135)
E/AndroidRuntime(17555):    at android.app.ActivityThread.main(ActivityThread.java:5294)
E/AndroidRuntime(17555):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(17555):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(17555):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
E/AndroidRuntime(17555):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
E/AndroidRuntime(17555): Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.os.BuildCompat" on path: DexPathList[[zip file "/data/app/com.ryosoftware.calendareventsnotifier-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
E/AndroidRuntime(17555):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime(17555):    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
E/AndroidRuntime(17555):    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
E/AndroidRuntime(17555):    ... 18 more
E/AndroidRuntime(17555):    Suppressed: java.lang.ClassNotFoundException: android.support.v4.os.BuildCompat
E/AndroidRuntime(17555):        at java.lang.Class.classForName(Native Method)
E/AndroidRuntime(17555):        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
E/AndroidRuntime(17555):        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
E/AndroidRuntime(17555):        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
E/AndroidRuntime(17555):        ... 19 more
E/AndroidRuntime(17555):    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

请按照以下步骤操作:
  1. 右键单击您的项目,选择“属性”。
  2. 从左侧菜单中选择“Java Build Path”。
  3. 选择“顺序和导出”选项卡。
  4. 确保您添加到项目中的库或外部JAR包已被勾选。
  5. 最后,清理您的项目并运行。
- Ciril
请查看以下链接以获取您的解决方案:https://dev59.com/2afja4cB1Zd3GeqPy6IJ - user8919158
9个回答

55

您遇到了 NoClassDefFoundErrorClassNotFoundException 错误。

在Java中,当Java虚拟机在运行时无法找到编译时可用的特定类时,会发生NoClassDefFoundError。

FYI

您正在使用Eclipse。如果您熟悉使用它,那么Android Studio 是为Android开发提供的一种更简单的方式。对于一直使用Eclipse的开发人员来说,迁移到Studio可能是一场噩梦。我的个人意见是Eclipse已经过气了。

对于您的 NoClassDefFoundError 问题,请前往 Project > Clean 下的 rebuild 选项,然后选择要 清理 的项目。然后重启Eclipse并重新运行。

解决方案

检查您的classpath是否包含该jar(AppCompat),如果不包含,则只需将该类添加到您的classpath中。

您应该使用Android Studio而不是Eclipse。阅读

  1. 支持库功能

此库的Gradle构建脚本依赖项标识符如下:

com.android.support:appcompat-v7:24.2.1

然后清理-重建-重新启动IDE


1
感谢您的评论。最终解决了包括正确的appcompat库。不幸的是,我现在无法将所有项目迁移到AndroidStudio。 - The Matrix
4
@IntelliJAmiya 你好,我在使用Android Studio时遇到了同样的问题,我已经在主应用和AAR应用中都导入了这个库。 - Libathos

16

在我的情况下

  1. 清理项目
  2. 使其失效并重新启动

它能够工作


5

如果您试图在Activity创建期间发生的某些事情上设置断点并附加调试器,则另一个可能导致此问题的不好的原因是。

(如果直译,ugly可以翻译成“丑陋”的意思,但根据上下文,这里应该指“不好的”)


对我来说,这是一个类似于这个的不同错误,我也遇到了appcompat类找不到的问题,但在迁移到AndroidX后,问题是我的自动添加的appcompat依赖项太旧了(版本1.0.0)。当我更新到1.2.0版本时,问题得到解决:implementation "androidx.appcompat:appcompat:1.2.0" - Vitali Pom

3

我在我的Java包中添加了两个类,现在它可以正常工作,请保持如下图所示的两个类:

enter image description here

AsyncTaskCompat.java

public class AsyncTaskCompat {

/**
 * Executes the task with the specified parameters, allowing multiple tasks to run in parallel
 * on a pool of threads managed by {@link android.os.AsyncTask}.
 *
 * @param task The {@link android.os.AsyncTask} to execute.
 * @param params The parameters of the task.
 * @return the instance of AsyncTask.
 */
public static <Params, Progress, Result> AsyncTask<Params, Progress, Result> executeParallel(
        AsyncTask<Params, Progress, Result> task, Params... params) {
    if (task == null) {
        throw new IllegalArgumentException("task can not be null");
    }

    if (Build.VERSION.SDK_INT >= 11) {
        // From API 11 onwards, we need to manually select the THREAD_POOL_EXECUTOR
        AsyncTaskCompatHoneycomb.executeParallel(task, params);
    } else {
        // Before API 11, all tasks were run in parallel
        task.execute(params);
    }

    return task;
}
}

AsyncTaskCompatHoneycomb.java

class AsyncTaskCompatHoneycomb {

static <Params, Progress, Result> void executeParallel(
        AsyncTask<Params, Progress, Result> task, Params... params) {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
}
}

0
在我的情况下,只需对项目进行清理重建就可以解决问题。

0

将gradle中的implementation com.google.android.gms:play-services-maps更新到较新的版本。

这对我有用。


0
在我的情况下,错误是由于使用整个gms:play-services库引起的。 gms:play-services的某些组件引用了版本,而这些版本与您明确指定的版本不同。
仅使用所需的play-services,例如:'com.google.android.gms:play-services-analytics:10.2.0',而不是'com.google.android.gms:play-services:10.2.0'。
另外参见:所有com.android.support库必须使用完全相同的版本规范 好文章:https://blog.mindorks.com/avoiding-conflicts-in-android-gradle-dependencies-28e4200ca235

0

我遇到过非常类似的问题,问题出在我使用了一个旧版本(已弃用)的包,已经四年没有维护了。检查一下你最近添加的包,确认它们是否与你的Android SDK兼容。


0
public class MApplication extends Application {

    @Override
    protected void attachBaseContext(Context paramContext) {
        super.attachBaseContext(paramContext);
        Helper.install(MApplication.this);
    }
}

在这里,我们重写了attachBaseContext()方法,添加了Helper.install(MApplication.this);代码行。

注意:由于现在需要加载一些SDK类才能使用,所以加载过程是通过Helper.install()完成的。开发人员需要在使用任何SDK功能之前调用此方法。如果未能这样做,将导致意外崩溃。 reference

除非应用程序崩溃并显示java.lang.NoClassDefFoundError: Failed resolution of:....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接