卡顿、不流畅是应用性能问题最为直观的表现之一。针对应用卡顿现象,软件绿色联盟联合华为终端开放实验室进行了大量分析、总结,希望能够为应用开发者提供针对性的优化建议,共同打造更好的使用体验。
本文主要讨论UI耗时带来的性能问题。
UI耗时,顾名思义,是指应用在“UI”线程执行耗时的操作,导致某个连续的任务完成时间超过一帧标准时间(60hz:16.7ms,90hz:11.1ms),从而给用户造成掉帧、卡顿等感受。针对UI耗时问题进行优化,可以有效提高Android应用性能表现。
本文主要介绍利用Systrace工具进行分析。
手机型号:mate30 8+128g
系统版本:Android 10.0
屏幕刷新率:60hz
2.2测试范围
应用名称 | 版本号 |
---|---|
今日头条 | 7.5.6 |
微信 | 6.6.6/7.0.9 |
塔王之王 | 1.19.36 |
抖音火山版 | 8.3.5 |
Systrace表现为大量VerifyClass:
应用名称 | 版本号 | 场景 | 帧率(fps) |
---|---|---|---|
今日头条 | 7.5.6 | 冷启动后滑动 | 48 |
微信 | 6.6.6/7.0.9 | 打开图片滑动/公众号文章滑动 | 50 |
塔王之王 | 1.19.36 | 游戏动效较多时 | 40 |
抖音火山版 | 8.3.5 | 冷启动 | 42 |
总体上看,各应用对应的场景帧率都没有达到或者接近60fps,人眼主观感受不够流畅。经华为终端开放实验室测试发现,上述应用已在新版本优化该问题,用户可及时更新版本获取更好的使用体验。
3. 原因分析及优化建议
根据UI耗时不同行为,分别建议如下:
一般滑动场景连续多次inflate资源容易导致丢帧问题,建议预加载或者异步加载资源,或者考虑拆分到多帧里加载,不要集中到一帧内完成。
decodeBitmap涉及较大的计算量,方法本身就非常耗时,不建议在UI线程直接执行,而是在子线程异步处理后,刷新UI。
UI发起音频等binder调用,对端很容易由于未知原因阻塞,从而导致UI阻塞,导致性能问题,建议应用充分考虑可能的耗时风险,根据业务需要酌情使用。
由于Android Q 对dex2oat的限制,可能导致应用卡顿、crash、首次启动黑屏/ANR等问题。
优化建议:
使用dexclassloader(sdk中提供的classloader)加载dex文件,runtime会记录加载的dex文件,在后台优化时(充电灭屏71分钟场景)会对动态加载的dex做dex2oat编译优化;
因为Systrace中没有tag点,看不到应用具体在做什么事情,这类问题往往需要找到必现的条件,针对性地分析。
总而言之,开发者应避免在UI线程做耗时的操作,从而给用户带来更流畅的使用体验。性能优化系列文章已经对软件绘制、过度绘制等性能问题进行了分享,后续还有更多精彩内容,敬请关注!
· END ·