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。这意味着,每16 毫秒主 (UI) 线程用于呈现您的应用程序 UI。当某些东西阻止 UI 线程执行此操作时 - 您开始Skipped 51 frames!
在Logcat
. 通过说阻塞 UI 线程,我的意思是某人(您的应用程序组件)正在使用它太多。
在一个奇怪的比较中,你可以把 UI 线程想象成一个公共厕所。每个人都在使用它(您的活动、片段、视图等)。Choreographer
必须每 16 毫秒使用一次。所以每 16 毫秒它就会尝试打开一扇厕所门并为你渲染 UI :) 当它关闭时,它会等待(并计数)直到有人释放它,然后尖叫着Logcat
说有人浪费了他的时间来渲染n
帧。所以他不可能也打印堆栈跟踪(如你所愿),因为他正在等待并且不知道谁在阻塞厕所......
虽然理解它很简单,但要弄清楚阻塞主线程的真正原因是什么并不那么简单。但#1 原因是在 UI 线程上做很多工作。要找出谁对此负责,您可以自己检查代码并定义(和衡量)任何可能阻塞 UI 的地方。最明显的例子是数据库访问、网络请求、图像处理等。为了帮助您,您可以使用CPU Profiler
. 要了解更多信息,请点击以下链接。
推荐阅读
- python-3.x - python 中的函数如何访问在其块之外声明并且在其调用期间从未作为参数传递的值?
- node.js - 如何根据内容长度在pdfkit中生成水平线超过
- intellij-idea - 删除后如何阻止Intellij IDEA添加gradlew?
- javafx - javafx绑定按钮禁用属性到文件夹存在
- rate-limiting - 艾玛迪斯酒店查询率有限制吗?
- qt - QContextMenuEvent::reason() 什么时候返回 QContextMenuEvent::Reason::Other?
- python - 有没有办法保护可执行文件的资源?
- maven - Maven部署插件禁用重新部署
- python - 使用 discord.ext.commands,我如何让机器人发送自己的用户名?蟒蛇3
- android - Flutter 应用程序卡在 Splashscreen 上