我的应用程序中偶尔会出现一个非常难以重现的 ANR 事件。今天发生了,我从设备中取出了位于 /data/anr 中的文件 trace.txt。不幸的是我无法理解这个文件中的数据,这里是完整的文件内容。有人能理解是什么让我的应用程序的 UI 无响应吗?我已经阅读了类似的问题,但仍然无法阅读该文件..
我已将完整的 trace.txt 文件内容粘贴到pastebin
编辑
pastebin 上的文件不再可用,我无法再访问 trace.txt 文件,因此可以关闭答案。
谢谢你
我的应用程序中偶尔会出现一个非常难以重现的 ANR 事件。今天发生了,我从设备中取出了位于 /data/anr 中的文件 trace.txt。不幸的是我无法理解这个文件中的数据,这里是完整的文件内容。有人能理解是什么让我的应用程序的 UI 无响应吗?我已经阅读了类似的问题,但仍然无法阅读该文件..
我已将完整的 trace.txt 文件内容粘贴到pastebin
编辑
pastebin 上的文件不再可用,我无法再访问 trace.txt 文件,因此可以关闭答案。
谢谢你
您可以使用Strictmode找出延迟特定线程的调用。使用它的最佳方式是以下形式。在您的应用程序 onCreate() 中,您启用 StrictMode。之后,(几乎)该线程上的所有慢速调用都将报告给您的日志,并带有发生位置的完整堆栈跟踪。
在您的自定义应用程序类中:
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectAll() // detect everything potentially suspect
.penaltyLog() // penalty is to write to log
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.build());
}
super.onCreate();
}
正如@Mohamed_AbdAllah 在他的评论中所写的那样“trace.txt 是发生 ANR 时所有正在运行的线程的情况。” 在发生 ANR 时从线程中找到 ANR 的原因似乎不可能使用您发布的跟踪。如果您想了解 trace 中的那些文本是什么意思,您可能对此感兴趣。(当 ANR 从跟踪中发生时,您可以得到哪个线程长时间运行,但这可能对您没有帮助)
或者,如果您想查看您的 Android 应用程序有哪些类型的崩溃/ANR(我假设您对您在 google play 上开发和发布的应用程序感兴趣),您可以使用崩溃报告 API。我为此使用了 crashlytics,它确实帮助我修复了我的应用程序崩溃。当您将此 api 添加到您的应用程序时,您可以跟踪网页上的所有崩溃/ANR。
如果您的目标是了解如何从 trace.txt 中找到 ANR 的原因,那么我不知道。但是,如果您需要查找并修复您的崩溃/ANR,请使用崩溃报告 API。
编辑:我假设您正在谈论您在 google play 上开发和发布的应用程序。如果您正在谈论尚未发布到 google play 的应用程序,@Jeffrey Klardie 的建议正是您所需要的。但不建议在 google play 的应用程序上启用Strictmode。
最可能的原因是编译器正在等待 UI 线程上的一些互联网操作。
如果没有代码来查看发生了什么,真的很难在这方面提供帮助,所以我将列出在这种情况下我会对自己的代码做什么。
sleep()
函数的使用、正在同步处理的异步活动等。Log
到处发表声明。观察运行的输出,看看它到达哪里或重复了什么。