首页 > 解决方案 > 有没有办法让 Android 在跳过的帧上打印堆栈跟踪

问题描述

我的 Android 应用会定期收到有关跳帧的警告。我不确定它可能来自哪里。有没有办法让Android添加UI线程的堆栈跟踪?基于此,很容易找出调用要跳过的帧的代码。

I/Choreographer: Skipped 51 frames!  The application may be doing too much work on its main thread.

标签: android

解决方案


不,没有办法做到这一点。这在技术上是不可能的。为了提供对用户事件的平滑反应,android 应用程序以每秒 60 帧的速率呈现其 UI。这意味着,每16 毫秒主 (UI) 线程用于呈现您的应用程序 UI。当某些东西阻止 UI 线程执行此操作时 - 您开始Skipped 51 frames!Logcat. 通过说阻塞 UI 线程,我的意思是某人(您的应用程序组件)正在使用它太多。

在一个奇怪的比较中,你可以把 UI 线程想象成一个公共厕所。每个人都在使用它(您的活动、片段、视图等)。Choreographer 必须每 16 毫秒使用一次。所以每 16 毫秒它就会尝试打开一扇厕所门并为你渲染 UI :) 当它关闭时,它会等待(并计数)直到有人释放它,然后尖叫着Logcat说有人浪费了他的时间来渲染n帧。所以他不可能也打印堆栈跟踪(如你所愿),因为他正在等待并且不知道谁在阻塞厕所......

虽然理解它很简单,但要弄清楚阻塞主线程的真正原因是什么并不那么简单。但#1 原因是在 UI 线程上做很多工作。要找出谁对此负责,您可以自己检查代码并定义(和衡量)任何可能阻塞 UI 的地方。最明显的例子是数据库访问、网络请求、图像处理等。为了帮助您,您可以使用CPU Profiler. 要了解更多信息,请点击以下链接。

https://vaibhavtolia.wordpress.com/2013/10/03/79/

https://developer.android.com/studio/profile/cpu-profiler


推荐阅读