我正在尝试使用LeakCanary来检测我的应用程序中的内存泄漏,但它没有比消息"倾倒内存,应用程序将冻结.Brrr."更进一步.我已经等了大约20分钟左右,但没有变化.在这些设备上的行为相同:1.华硕fonepad 8(Android 5.0股票)2.索尼Xperia SP(Android 5.1.1 CM 12.1自定义)3.HTC Desire C(Android 4.4 CM 11自定义)
我在教学中做了一切建议:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
Run Code Online (Sandbox Code Playgroud) 所以今天我遇到了这个问题.我有一个例外说
"NoClassDefFoundException" class com.example.app.MainClass$3
Run Code Online (Sandbox Code Playgroud)
我知道这个异常是什么意思所以首先我查看了位于的classes.jar文件 /app/build/intermediates/exploded-aar/$packageName%/%versionName%/jars.
在那里,我找到了具有完全相同签名的"缺失"类:MainClass$3.所以它产生了.然后在我的智能手机上,我去看了/data/app/%packageName%/里面的base.apk文件.在里面我发现了一个名为的文件classes.dex.我用Notepad ++打开它,我发现在MainClass$3那里也提到了我!为什么找不到这堂课?我还应该检查什么?我不能发布原始异常消息,也不能发布文件,因为它是商业广告,但如果需要,我会尽量澄清事情.
更新#1:我认为我需要添加一些内容.所有这一切的奇怪之处在于,这个类是唯一一个无法从整个库中找到的类.这不是新的,我很久以前就添加了它,所以我只是想,也许是从该类运行一些代码时发生的一些异常导致了这个错误?
更新#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;
}
Run Code Online (Sandbox Code Playgroud)
我插了
int a = 1;
Run Code Online (Sandbox Code Playgroud)
用于调试目的.应用程序崩溃,方法的第二行有异常,我正在尝试创建一个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) …Run Code Online (Sandbox Code Playgroud)