应用卡顿和不流畅是性能问题中最明显的表现之一。为了应对这些问题,软件绿色联盟与华为终端开放实验室进行了大量分析和总结,旨在为应用开发者提供有针对性的优化建议,共同提升用户体验。
本文主要探讨UI耗时带来的性能问题。
UI耗时的定义UI耗时指的是在“UI”线程上执行耗时操作,导致某个连续任务的完成时间超过一帧的标准时间(60hz:16.7ms,90hz:11.1ms),从而引起用户感受到掉帧和卡顿。通过优化UI耗时问题,可以显著提升Android应用的性能表现。
问题测试流程本文主要介绍使用Systrace工具进行分析。
2.1 测试环境
手机型号:mate30 8+128g系统版本:Android 10.0屏幕刷新率:60hz
2.2 测试范围
今日头条7.5.6微信6.6.6/7.0.9塔王之王1.19.36抖音火山版8.3.5
2.3 测试步骤
安装并启动应用,完成授权;在各个应用的多个页面进行滑动,基于人眼主观流畅性体验,针对抓取不流畅页面的systrace和applog日志;根据systrace日志,分析不流畅界面的丢帧情况;判断是否存在UI耗时问题。判断方法如下:根据Systrace中UI本身的CPU占用情况确认:UI连续多个inflate:
UI线程直接decodeBitmap:
UI线程Binder调用,对端耗时阻塞UI:
UI加载插件:Systrace表现为大量VerifyClass:
UI持续running,没有tag点:
2.4 测试结果
今日头条7.5.6冷启动后滑动48微信6.6.6/7.0.9打开图片滑动/公众号文章滑动50塔王之王1.19.36游戏动效较多时40抖音火山版8.3.5冷启动42
总体来看,各应用在对应场景下的帧率均未达到或接近60fps,人眼主观感受不够流畅。经华为终端开放实验室测试发现,这些应用在新版本中已对该问题进行了优化,用户可以通过及时更新版本来获得更好的使用体验。
原因分析及优化建议
根据UI耗时的不同行为,分别提供以下建议:
UI连续多个inflate:在滑动场景中,连续多次inflate资源容易导致丢帧问题。建议预加载或异步加载资源,或者将资源加载分散到多帧中,不要在一帧内集中完成。
UI线程直接decodeBitmap:decodeBitmap涉及大量计算,本身就非常耗时,不建议在UI线程中直接执行,应在子线程中异步处理后再刷新UI。
UI线程Binder调用,对端耗时阻塞UI:UI发起音频等binder调用时,对端可能会因未知原因阻塞,从而导致UI阻塞,引发性能问题。建议应用充分考虑可能的耗时风险,根据业务需求谨慎使用。
UI加载插件异常:由于Android Q对dex2oat的限制,可能会导致应用卡顿、crash、首次启动黑屏/ANR等问题。
优化建议:
使用dexclassloader(sdk中提供的classloader)加载dex文件,runtime会记录加载的dex文件,在后台优化时(充电灭屏71分钟场景)会对动态加载的dex进行dex2oat编译优化。
UI持续running,没有tag点:因为Systrace中没有tag点,无法看到应用具体在做什么,这类问题通常需要找到必现的条件,进行针对性分析。
总之,开发者应避免在UI线程上执行耗时操作,以提供给用户更流畅的使用体验。性能优化系列文章已经分享了软件绘制、过度绘制等性能问题,后续还将有更多精彩内容,敬请关注!
· END ·
以上就是避免UI耗时行为,让你的应用更流畅的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/22910.html
微信扫一扫
支付宝扫一扫