Android 中的卡顿丢帧原因概述 - 方法论

news/2025/1/21 21:21:09/文章来源:https://www.cnblogs.com/linhaostudy/p/18684459

Android 手机使用中的卡顿问题 , 一般来说手机厂商和 App 开发商都会非常重视 , 所以不管是手机厂商还是 App 开发者 , 都会对卡顿问题非常重视 , 内部一般也会有专门的基础组或者优化组来进行优化 .

目前市面上有一些非常棒的第三方性能监控工具 , 比如腾讯的 Matrix ; 手机厂商一般也会有自己的性能监控方案 , 由于可以修改源码和避免权限问题 , 所以手机厂商可以拿到更多的数据 , 分析起来也会更方便一些.

说回流畅度 , 其实就是操作过程中的丢帧 , 本来一秒中画面需要更新 60 帧,但是如果这期间只更新了 55 帧 , 那么在用户看来就是丢帧了 , 主观感觉就是卡了 , 尤其是帧率波动 , 用户的感知会更明显. 引起丢帧的原因非常多, 有硬件层面的 , 有软件层面的 , 也有 App 自身的问题. 所以这一部分我分为四篇文章去讲 , 会简单讲一下哪些原因会用户觉得卡顿丢帧 :

0. Android 中的卡顿丢帧原因概述 - 方法论
1. Android 中的卡顿丢帧原因概述 - 系统篇
2. Android 中的卡顿丢帧原因概述 - 应用篇
3. Android 中的卡顿丢帧原因概述 - 低内存篇

1. 流畅度相关工作内容概述

作为手机厂商优化组的一员 , 我有必要在开始之前简单描述一下我们工作的流程 . 系统开发的过程中, 有很多引起 Android 卡顿的原因,但是用户和测试感受最直观的是正在使用的应用掉帧和不流畅 . 由于测试和用户没有办法直接确定卡顿的原因, 所以一般会直接将 Bug 提到我们这边, 所以我们的角色更像是一个卡顿问题接口人, 负责分析引起卡顿的原因, 再把 Bug 分配给对应的模块负责人去解决 , 如框架 \ App \ 多媒体 \ Display \ BSP 等.

所以直接由我们来解决的问题并不是很多, 我们更多的时候是通过专门的分析工具 , 结合源码来定位和分析问题 , 最多使用的工具如下:

  1. Systrace\strace\ftrace : 从整个系统的层面来看问题的大致原因
  2. MethodTrace : 可以从进程的角度 , 以详细调用栈的形式来显示
  3. Android Studio 的 Profile 工具
  4. MAT : 用来分析内存问题
  5. Log : LogReport 抓取或者录制的 Log , 里面包含大量的信息 , 包括各种常规 Log (Main Log , System Log , Event Log , Kernel Log , Crash Log 等) , 也包含了厂商自己加的一些 Log ( Power Log , Performance Log 等) , 也包含事故发生时候的截图 \ 录制的视频等
  6. 复现视频
  7. 本地复现等

确定卡顿的根本原因 , 这需要对 Android App 开发 \ Android Framework 知识 \ Display 知识 \ Linux Kernel 知识有一定的了解 , 知道基本的工作流程 , 并能熟练使用对应的工具 , 区分不同的场景 , 迅速找到问题的原因 , 然后和相关模块的负责人一起讨论优化.

对于一些系统全局性的方案则需要与对应的模块负责人一起分析和解决, 必要的时候我们也会开发一些 Feature 来解决问题 .

2. 性能问题分析的一些工具和套路

应用卡顿问题的原因比较多, 在数据埋点还没有完善的情况下, 更多的依赖 Systrace 来从全局的角度来分析卡顿的具体原因:

  1. Systrace 分析
    1. 首先确认卡顿的 App
    2. 通过 App 的主线程和 SurfaceFlinger 的主线程信息可以确定卡顿的现场
    3. 分析 Systrace , Systrace 的分析需要一定的知识储备 : 需要知道 Systrace 每一个模块展示的内容是如何与用户感受到的内容相对应的 ; 需要知道 Systrace 上各个模块的交互式如何展示的 ; 需要知道 Binder 调用信息 ; 需要会看 Kernel 信息 (后续会继续完善Systrace 系列)
      1. 如果是 App 主线程耗时, 则分析 App 主线程的原因 ( 案例里有 App 的卡顿原因 )
      2. 如果是 System 的问题, 则需要分析 System_Server \ SurfaceFlinger \ HWC \ CRTC \ CPU 等 ( 详细参考下面系统卡顿原因)
  2. TraceView + 源码分析
    1. 使用 Systrace 确定原因后, 可以使用 TraceView 结合源码查看对应的代码逻辑 , Android Studio 的 Profile 工具可以以进程为单位 , 进行 Method 的 Profile , 可以打出非常详细的函数调用栈 , 并且可以与 Systrace 相对应
    2. 源码分析可以使用 Android Studio 进行断点调试 App 或者 Framework , 观察 Debug 信息是否与预期相符
  3. 很多问题也需要借助 Log 工具抓上来的 Log 进行分析 , Log 分析 Log 里面一些比较重要的点 (一般从 Log 里面很难确定卡顿的原因, 但是可以结合 Systrace 做一定的辅助分析)
    1. 截图 : 确定卡顿发生的时间点 \ 卡顿的界面 (如果没有尽量提供)
    2. dumpsys meminfo 信息
    3. dumpsys cpuinfo 信息
    4. “Slow dispatch” 和 “Slow delivery” Log 信息
    5. 卡顿发生的一段时间内的 EventLog , 还原卡顿时候用户的操作
  4. 本地尝试复现
    1. 可以录高速录像, 观察细节,如果必现,可以让测试这边提供录像.
    2. 过滤 Log , 找到卡顿时候的异常 Log
    3. 多抓几份 Systrace , 有助于确定原因
  5. 可以让测试提供 LogReport 中没有的一些信息, 来分析当时用户的手机的整体的状态.
    1. adb shell dumpsys activity oom
    2. adb shell dumpsys meminfo
    3. adb shell cat /proc/buddyinfo
    4. adb shell dumpsys cpuinfo
    5. adb shell dumpsys input
    6. adb shell dumpsys window

3. 通过性能数据数据分析

由于用户反馈的不确定性 , 和内部测试的不完备性 , 通过系统或者 App 的性能埋点数据来做分析 , 是改进系统的一个好的方法 . 一方面不用用户主动参与 , 一方面有大量的数据可以来做分析 , 看趋势 .

目前国内各大手机厂商和 App 厂商基本都有自己的 APM 平台 , 负责监控 App 或者系统的监控程度 , 来做对应的优化方案 , 比如腾讯的 Matrix 平台已经监控了下面这些内容 , 其他的 App 厂商可以直接接入

手机厂商由于有代码权限 , 所以可以采集到更多的数据 , 比如 Kernel 相关的数据 : cpu 负载 \ io 负载 \ Memory 负载 \ FSync \ 异常监控 \ 温度监控 \ 存储大小监控 等 , 每一个大项又都有几十个小项 . 所以可以监控的数据会非常多 , 遇到问题也可以从多个技术指标去分析 . 这就需要在这方面经验非常丰富的团队 , 去定义这些监控指标 , 确定最终要收集那些信息 , 收集上来的数据如何去分析等.

至于后续的优化工作 , 就考验各个厂商的研发能力了 , 正如伟琳在这篇文章:那些年,我们一起经历过的 Android 系统性能优化 所说 , 目前能力比较强的手机厂商 , 都在底层各个模块 , 结合硬件做优化 , 因为归根结底都是资源的分配 ; 而一些研发实力不是很强的厂商 , 则重点还是围绕在根据场景分配资源.

4. 总结

这里简单概述了一下流畅性问题的一般分析思路和分析工具 , 而且由于我的方向主要在 Framework 和 App , 所以很多东西都是从上层的角度来说的 , 想必 Kernel 优化团队会有更好的角度和分析 .

各个厂商的优化大家可以看看这篇总结 , 那些年,我们一起经历过的 Android 系统性能优化 , 华米 OV 都有涉及 , 下面摘录了一段总结 , 大家可以看看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872985.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript的常用库 —— jQuery

利用JS去操控HTML和CSS,常用库之jQuery ฅʕ•̫͡•ʔฅjQuery用来更加方便地去控制前端的HTML标签和CSS属性。使用方式:1. 直接在<head>元素中添加: <script src="https://cdn.acwing.com/static/jquery/js/jquery-3.3.1.min.js"></script> 2…

2 FreeRTOS移植

2 FreeRTOS移植 2.1 源码基本认识获取源码。官网地址:FreeRTOS™ - FreeRTOS™ 源码内文件结构:1) FreeRTOS文件夹结构2) Source文件夹结构3) portable文件夹结构 portable文件夹里面有编译器、内核环境可以选择。其中keil是我们使用的编译器类型,但Keil文件夹里只有一个…

22蓝帽初赛

参考wp:http://mp.weixin.qq.com/s?__biz=Mzk0MTQzNjIyNg==&mid=2247487196&idx=1&sn=48094c5a78749b45c3598ed51a5df0e3&chksm=c3901b8acd56bc2d1d06b323e9d1e86b90048a35dc3b3301b60bb1f488a764f0b52ebc490113&mpshare=1&scene=23&srcid=01218…

【Azure APIM】APIM服务配置网络之后出现3443端口不通,Management Endpoint不健康状态

如果没有关联的网络安全组,则阻止所有网络流量通过子网和网络接口。问题描述 APIM服务在配置网络之后,查看网络状态发现Management Endpoint是不健康状态, 提示无法连接到3443端口。错误消息: Failed to connect to management endpoint at xxxxxxxx.management.azure-api.…

【模拟电子技术】11-放大电路的性能指标

【模拟电子技术】11-放大电路的性能指标通过输入,输出侧的各一个电容来到输入纯交流,输出纯交流Ui变化引起UBE变化,UBE变化引起IB变化,IB变化引起IC变化,IC变化引起UCE变化,UCE变化引起Uo变化关于输入,输出等效电路的问题: 输入电阻Ri越大越好还是越小越好?当然是越大…

解决 WebSocket 连接断开问题:前端心跳机制的实现与优化

在开发过程中,我们经常会遇到需要实时通信的场景,而 WebSocket 是一种非常合适的技术选择。然而,在实际使用 WebSocket 的过程中,我们可能会遇到连接频繁断开的问题。最近,我在一个项目中就遇到了这样的问题,经过一番探索和优化,终于找到了解决方案,现在与大家分享一下…

图片内存变大

平时我们会经常遇到压缩图片内存的情况,但是需要把图片内存变大的情况有人遇到过吗,接下来就是图片变大术的详细教程!将需要处理的图片放在一个文件夹内(例:图片a.png放在D盘根目录下)win+R输入cmd打开命令控制行在命令控制行输入cd+图片所在的目录,如果是在磁盘根目录直…

paddleocr图片文字识别

介绍:PaddleOCR是由百度开发的一个OCR库,基于深度学习框架PaddlePaddle。PaddleOCR支持多语言文本识别,特别适合中文场景,同时它还提供了丰富的预训练模型。 1、安装pip3 install paddlepaddle pip3 install paddleocr2、使用from paddleocr import PaddleOCRdef paddle_im…

picoctf_2018_rop chain

main里面有个gets溢出函数,再点开flag函数看可以看到传入了一个a1参数,如果win1和win2都是1且a1为-559039827时会输出flag的值用十六进制比较,该数的十六进制可以直接再ida里面看到看到win1函数设置了win1为1,win2函数需要再传入一个参数为-1163220307那么win2就是1了这个参…

whuwc 游记

whuwc 游记whuwc 游记Star Sky Here we are 我们在此地 Riding the sky 翱翔于天际 Painting the night with sun 绘夜空以晨旭 You and I, Mirrors of night 你和我 交相辉映 Twin flames of fire 如两团火焰 Lit in another time and place 闪亮在彼时彼地 I knew your name …

nvm自动切换node版本

1、nvm常用命令nvm off //禁用node.js版本管理(不卸载任何东西) nvm on //启用node.js版本管理 nvm install <version> //安装node.js的命名 version是版本号 例如:nvm install 8.12.0 nvm uninstall <version> …

业财一体化与业财融合的联系与区别

业财一体化与业财融合比较相似,许多人把二者混为一谈,甚至概念搞反了,他俩有何异同呢?1 从定义来看,业财一体化(Integrated Business and Finance)是指将企业的业务活动与财务活动进行信息化、系统化的统一管理,通过先进技术手段,将业务流程、财务流程、管理流程有机整…