运行时的NoClassDefFoundError是外部.AAR库中的类

时间:2016-04-08 17:13:46

标签: java

所以我今天遇到了这个问题。我有一个例外说

"NoClassDefFoundException" class com.example.app.MainClass$3

我知道这个异常是什么意思所以首先我查看位于/app/build/intermediates/exploded-aar/$packageName%/%versionName%/jars.

中的classes.jar文件

在那里我发现"失踪"具有完全相同签名的类:MainClass$3。所以它产生了。然后在我的智能手机上,我转到/data/app/%packageName%/并查看base.apk文件内部。在里面我找到了一个名为classes.dex的文件。我用Notepad ++打开它,我发现在那里也提到了MainClass$3!为什么找不到这堂课?我还应该检查什么?我不能发布原始的异常消息,也不能将文件用于商业广告,但是如果需要,我会尽可能地澄清事情。

更新#1 :我认为我需要添加一些内容。所有这一切的奇怪之处在于,这个类是唯一一个无法从整个库中找到的类。它不是新的,我很久以前就添加了它,所以我只是想,也许是从该类运行一些代码导致此错误时发生的一些异常?

UPDATE#2:我调试了我的应用程序并看到了最奇怪的事情:我能够使用参数调用有问题的类的构造函数,并且对象是成功创建的。然后我调用了类的方法并得到了这个异常。这是我调用的方法

public Observable<String> getSnapshotTaker() {
        int a = 1;
        Observable<String> snapshotTaker = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                queueSnapshot(true, 0, subscriber);
            }
        });
        return snapshotTaker;
    }

我插入了

int a = 1;

用于调试目的。应用程序崩溃,方法的第二行有例外,我试图创建一个Observable。所以,它看起来不是导致崩溃的类SnapshotManager,而是Observable。但是为什么异常消息看起来像这样呢?

更新#3:这是堆栈跟踪:

E/AndroidRuntime: FATAL EXCEPTION: main

 java.lang.NoClassDefFoundError: com.test.pack.SnapshotManager$3
    at com.test.pack.SnapshotManager.getSnapshotTaker(SnapshotManager.java:370)
    at com.test.pack.CameraPresenter.takePhoto(CameraPresenter.java:31)
    at com.test.pack.MainActivity$MainShutterClickListener.onClick(MainActivity.java:1100)
    at android.view.View.performClick(View.java:5204)
    at android.view.View$PerformClick.run(View.java:21153)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1 个答案:

答案 0 :(得分:5)

我找出了问题的根源。首先,我注意到NoClassDefFound异常指向了一个错误的类。我的意思是SnapshotManager不是&#34; def&#34;找不到RxJava库中的Observable类。这是导致异常的原因:

  • 依赖于我制作的图书馆的主要项目。
  • 依赖于rxjava的库
  • 主项目从使用rxjava类的库中调用一些代码 并且,只要主项目没有rxjava依赖,它就会崩溃。

解决方案很简单:如果你有一个带有一些外部依赖项的库项目,你也应该在主项目中提到这些依赖项。我知道这不是最好的解决方案,可能有办法不这样做,但这就是我想出的。