有没有一种方法可以使Android在跳过的帧上打印stacktrace

时间:2018-06-21 01:13:00

标签: android

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

@Override
        public int getItemCount() {
            return 1;
        }

1 个答案:

答案 0 :(得分:0)

没有,没有办法做到。从技术上讲,这是不可能的。 为了提供对用户事件做出反应的平滑性,Android应用程序以每秒60帧的速率呈现其UI。这意味着,每个 16 ms 主(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