所以我今天遇到了这个问题。我有一个例外说
"NoClassDefFoundException" class com.example.app.MainClass$3
我知道这个异常是什么意思所以首先我查看位于/app/build/intermediates/exploded-aar/$packageName%/%versionName%/jars.
在那里我发现"失踪"具有完全相同签名的类: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)
答案 0 :(得分:5)
我找出了问题的根源。首先,我注意到NoClassDefFound异常指向了一个错误的类。我的意思是SnapshotManager不是&#34; def&#34;找不到RxJava库中的Observable类。这是导致异常的原因:
解决方案很简单:如果你有一个带有一些外部依赖项的库项目,你也应该在主项目中提到这些依赖项。我知道这不是最好的解决方案,可能有办法不这样做,但这就是我想出的。