避免UI耗时行为,让你的应用更流畅

发布时间 - 2025-07-15 00:00:00    点击率:

应用卡顿和不流畅是性能问题中最明显的表现之一。为了应对这些问题,软件绿色联盟与华为终端开放实验室进行了大量分析和总结,旨在为应用开发者提供有针对性的优化建议,共同提升用户体验。

本文主要探讨UI耗时带来的性能问题。

  1. UI耗时的定义 UI耗时指的是在“UI”线程上执行耗时操作,导致某个连续任务的完成时间超过一帧的标准时间(60hz:16.7ms,90hz:11.1ms),从而引起用户感受到掉帧和卡顿。通过优化UI耗时问题,可以显著提升Android应用的性能表现。

  2. 问题测试流程 本文主要介绍使用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 测试结果

    应用名称 版本号 场景 帧率(fps) 今日头条 7.5.6 冷启动后滑动 48 微信 6.6.6/7.0.9 打开图片滑动/公众号文章滑动 50 塔王之王 1.19.36 游戏动效较多时 40 抖音火山版 8.3.5 冷启动 42

    总体来看,各应用在对应场景下的帧率均未达到或接近60fps,人眼主观感受不够流畅。经华为终端开放实验室测试发现,这些应用在新版本中已对该问题进行了优化,用户可以通过及时更新版本来获得更好的使用体验。

  3. 原因分析及优化建议

    根据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


相关推荐: 深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  历史网站制作软件,华为如何找回被删除的网站?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何在建站宝盒中设置产品搜索功能?  Python文件操作最佳实践_稳定性说明【指导】  再谈Python中的字符串与字符编码(推荐)  如何确认建站备案号应放置的具体位置?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  公司网站制作需要多少钱,找人做公司网站需要多少钱?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何挑选高效建站主机与优质域名?  魔方云NAT建站如何实现端口转发?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  网站页面设计需要考虑到这些问题  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  linux top下的 minerd 木马清除方法  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel如何与Inertia.js和Vue/React构建现代单页应用  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  微信小程序 canvas开发实例及注意事项  油猴 教程,油猴搜脚本为什么会网页无法显示?  html如何与html链接_实现多个HTML页面互相链接【互相】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  网站制作企业,网站的banner和导航栏是指什么?  如何快速选择适合个人网站的云服务器配置?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  怎么用AI帮你为初创公司进行市场定位分析?  如何在七牛云存储上搭建网站并设置自定义域名?  如何快速打造个性化非模板自助建站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel distinct去重查询_Laravel Eloquent去重方法  原生JS获取元素集合的子元素宽度实例  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程