有没有办法让Android在跳过的帧上打印stacktrace

有没有办法让Android在跳过的帧上打印stacktrace,android,Android,我的Android应用程序定期收到关于跳过帧的警告。我不确定它可能来自哪里。有没有办法让Android添加UI线程的堆栈跟踪?基于此,很容易找出调用要跳过的帧的代码 I/Choreographer: Skipped 51 frames! The application may be doing too much work on its main thread. 不,没有办法。这在技术上是不可能的。 为了提供对用户事件的平滑反应,android应用程序以每秒60帧的速率呈现其UI。这意味着,每

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

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

不,没有办法。这在技术上是不可能的。 为了提供对用户事件的平滑反应,android应用程序以每秒60帧的速率呈现其UI。这意味着,每16毫秒的主(UI)线程都用于呈现应用程序UI。当有东西阻止UI线程这样做时-您开始在
Logcat
中看到这样的消息(
Skipped 51 frames!
)。我说的阻塞UI线程是指某人(你的应用程序组件)使用它太多了

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

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


“不,没有办法做到这一点。从技术上讲,这是不可能的。”从技术上讲,这是非常可能的。看看Android的源代码,看起来Android团队没有这么做。开发人员可以设置一个标志。(这样,对于真正的用户来说,它不会减慢任何速度。如果设置了标志,编排器检测到跳过的帧,它可能会触发JVM进行线程转储。通过获取UI线程并简单地编写stacktrace,它甚至可能更聪明。你说的是什么标志?我在编排器中没有发现任何跟踪打印代码。没有,但是Android开发者可以创造这样一个东西。这在技术上不是不可能的(对他们来说)。试着制作你自己的
编舞器
,它不会绘制帧,但会安排每16毫秒检查一次,而且这个检查会延迟很多,会打印堆栈跟踪。