Android 调试低内存崩溃(线程相关?)
我正试图调试我的Android应用程序的一个神秘崩溃,它似乎发生在内存不足的情况下。有关应用程序的来源,请访问。该应用程序的包是cz.jirkovsky.lukas.chmupocasi 发生的情况是,当手机内存开始不足时,我试图从最近的应用程序列表(长按Home按钮后显示的应用程序)中重新打开应用程序,应用程序崩溃 我曾尝试使用Android Studio调试该应用程序,但该应用程序总是在遇到主活动的onCreate()和onStart()中的任何断点之前崩溃,从而无法进行调试。更糟糕的是,即使logcat也不包含任何信息,应用程序崩溃时显示的唯一相关行是:Android 调试低内存崩溃(线程相关?),android,crash,Android,Crash,我正试图调试我的Android应用程序的一个神秘崩溃,它似乎发生在内存不足的情况下。有关应用程序的来源,请访问。该应用程序的包是cz.jirkovsky.lukas.chmupocasi 发生的情况是,当手机内存开始不足时,我试图从最近的应用程序列表(长按Home按钮后显示的应用程序)中重新打开应用程序,应用程序崩溃 我曾尝试使用Android Studio调试该应用程序,但该应用程序总是在遇到主活动的onCreate()和onStart()中的任何断点之前崩溃,从而无法进行调试。更糟糕的是,即
I/ActivityManager( 428): Displayed cz.jirkovsky.lukas.chmupocasi/.MainActivity: +1s45ms (total +23m23s835ms)
完整的日志可以在,以防我遗漏了什么
最后,我尝试在应用程序崩溃后将调试器附加到应用程序上,此时显示Android的对话框“不幸的是,应用程序已停止”。我没有看到我的任何代码在任何线程中运行。以下是“导出线程”包含的内容:
有没有关于如何调试此类崩溃或如何获取更多信息的想法?我终于找到了解决方案。这实际上是两个不同的问题 第一个问题是,我的设备(华为Y300)没有记录任何可以使用logcat检索的堆栈跟踪。这很可能是因为我今天早些时候重新启动了,或者,不太可能是因为我尝试通过
android.util.Log
记录一些调试信息
第二个是坠机事件本身。从崩溃中获取堆栈跟踪后,问题很容易解决。尽管我之前使用调试器获得的信息指出线程存在一些问题,但真正的原因是以下异常:
android.app.Fragment$InstantiationException: Unable to instantiate fragment cz.jirkovsky.lukas.chmupocasi.RetainFragment: make sure class name exists, is public, and has an empty constructor that is public
真正的原因是,RetainFragment
是包私有的。但是,从片段继承的所有类必须是公共类或公共静态内部类
如果它们不是,它可能会咬你很厉害。原因是,即使在类是包私有的情况下它似乎工作得很好,但在销毁片段后重新创建片段以在内存不足的情况下回收一些内存时,它也会失败
最后的寓意是,你不应该总是听IDE说什么,因为在Android Studio告诉我可以将这个片段类设置为包私有后,我引入了这个bug。我终于找到了解决方案。这实际上是两个不同的问题
第一个问题是,我的设备(华为Y300)没有记录任何可以使用logcat检索的堆栈跟踪。这很可能是因为我今天早些时候重新启动了,或者,不太可能是因为我尝试通过android.util.Log
记录一些调试信息
第二个是坠机事件本身。从崩溃中获取堆栈跟踪后,问题很容易解决。尽管我之前使用调试器获得的信息指出线程存在一些问题,但真正的原因是以下异常:
android.app.Fragment$InstantiationException: Unable to instantiate fragment cz.jirkovsky.lukas.chmupocasi.RetainFragment: make sure class name exists, is public, and has an empty constructor that is public
真正的原因是,RetainFragment
是包私有的。但是,从片段继承的所有类必须是公共类或公共静态内部类
如果它们不是,它可能会咬你很厉害。原因是,即使在类是包私有的情况下它似乎工作得很好,但在销毁片段后重新创建片段以在内存不足的情况下回收一些内存时,它也会失败
最后的寓意是,你不应该总是听IDE说什么,因为在Android Studio告诉我这个片段类可以被包私有化之后,我引入了这个bug
android.app.Fragment$InstantiationException: Unable to instantiate fragment cz.jirkovsky.lukas.chmupocasi.RetainFragment: make sure class name exists, is public, and has an empty constructor that is public