避免UI耗时行为,让你的应用更流畅
发布时间 - 2025-07-15 00:00:00 点击率:次应用卡顿和不流畅是性能问题中最明显的表现之一。为了应对这些问题,软件绿色联盟与华为终端开放实验室进行了大量分析和总结,旨在为应用开发者提供有针对性的优化建议,共同提升用户体验。
本文主要探讨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点:
- 根据Systrace中UI本身的CPU占用情况确认:
2.4 测试结果
应用名称 版本号 场景 帧率(fps) 今日头条 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 ·
# linux
# 微信
# 抖音
# 工具
# 异步加载
# 系统版本
# 线程
# 异步
# android
# binder
# 性能优化
# ui
# 应用开发
# 加载
# 多个
# 华为
# 之王
# 用在
# 头条
# 进行了
# 今日
# 首次
# 冷启动
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
Laravel集合Collection怎么用_Laravel集合常用函数详解
SQL查询语句优化的实用方法总结
如何在IIS管理器中快速创建并配置网站?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
node.js报错:Cannot find module 'ejs'的解决办法
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何在万网主机上快速搭建网站?
做企业网站制作流程,企业网站制作基本流程有哪些?
微信小程序 input输入框控件详解及实例(多种示例)
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Android中AutoCompleteTextView自动提示
微信小程序 scroll-view组件实现列表页实例代码
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
高性价比服务器租赁——企业级配置与24小时运维服务
如何在万网自助建站平台快速创建网站?
Laravel如何实现一对一模型关联?(Eloquent示例)
Python文件流缓冲机制_IO性能解析【教程】
Linux系统命令中screen命令详解
网站制作软件免费下载安装,有哪些免费下载的软件网站?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel如何实现本地化和多语言支持?(i18n教程)
Android实现代码画虚线边框背景效果
详解Android中Activity的四大启动模式实验简述
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
大连 网站制作,大连天途有线官网?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
如何在云主机快速搭建网站站点?
如何快速选择适合个人网站的云服务器配置?
网站建设保证美观性,需要考虑的几点问题!
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
微信小程序 闭包写法详细介绍
C#如何调用原生C++ COM对象详解
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
在线制作视频的网站有哪些,电脑如何制作视频短片?
如何在搬瓦工VPS快速搭建网站?
详解CentOS6.5 安装 MySQL5.1.71的方法
深入理解Android中的xmlns:tools属性
Android滚轮选择时间控件使用详解
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
如何将凡科建站内容保存为本地文件?
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
高防服务器如何保障网站安全无虞?
Bootstrap整体框架之CSS12栅格系统
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置


,后续还将有更多精彩内容,敬请关注!