移动应用性能收集工具原理解析

性能收集分析相关工具总览

  收集、分析、展示移动应用性能数据的工具很多,大致可以分为如下几类。例如可收集多项性能指标的移动性能工具,perfdog,Solopi,其中Solopi开源,pefdog商业工具。可进行Crash分析的工具,例如商业的Firebase Crashlytics和开源的Sentry工具。如果需要对网络相关数据进行分析,可以使用Charles或者Wireshark。除此之外,还有综合性的性能管理工具,例如Dynatrace等。总体来说,商业工具能力,准确性,用户体验肯定强于开源工具,作为个人学习研究,更多只有从开源工具出发。所以,此篇博客在编写中,也会以开源工具进行举例。

移动端性能测试工具
PerfDog:用于监控应用性能、CPU、内存、电量消耗等数据的工具,支持移动应用的性能测试和实时监控。
Solopi:专注于移动应用性能的测试和监控,包括帧率、CPU、内存等指标的实时监测。

Crash分析工具
Firebase Crashlytics:Google提供的强大的崩溃报告和分析工具,可实时监控应用的崩溃情况。
Sentry:开源的错误追踪工具,支持多种平台,包括移动应用的错误报告和性能监控。

网络性能测试工具
Charles Proxy:网络调试代理工具,可以捕获和分析移动应用的网络请求和响应数据。
Wireshark:开源的网络分析工具,支持捕获和分析移动应用的网络数据包。

APM工具(应用性能管理):
Dynatrace:云原生的全栈性能监控解决方案,支持移动应用性能监控和用户体验分析。

收集哪些性能指标以及如何收集

  进行性能分析前,首先要明白每个性能指标含义,以solopi收集的性能指标为例,我们来展开看看移动应用性能常见指标,以及可以通过哪些方式收集这些指标。

帧率

  帧率的计算公式是:帧率=绘制的帧数/时间段,大多数应用程序和游戏开发者的目标帧率是60FPS(帧/每秒),为什么目标帧率是60FPS呢?因为大多数现代智能手机和平板电脑的屏幕刷新率为60Hz,所以,只要帧率达到60FPS,即每秒绘制的帧数是60,那么用户视觉效果就比较流畅,不会有卡顿的感觉。最低不能低于30FPS,这是因为显示器在等待新的帧时,重复显示上一帧的图像,导致画面不流畅。高的可以达到90FPS(例如,对于高刷新频率的设备而言)。

如何收集帧率信息

  收集帧率的方式有两种,一种是利用Choreographer类统计帧率,这种需要在应用内部写代码实现,只能收集该应用的帧率信息。另外一种方式是使用gfxinfo工具。以Solopi为例,也是通过gfxinfo工具信息计算1秒内超时帧时间,从而反推出实际帧率,所以在接近静止的情况下, 部分帧率可能显示有误。推荐在滑动或页面切换等动态场景下进行帧率测试。gfxinfo的方式,可以收集所有应用的帧率信息,非常适合做性能数据收集工具,所以,这里,也重点介绍如何通过gfxinfo收集帧率信息。

  收集帧率信息主要有两个步骤,步骤一:通过adb命令获取gfxinfo信息,步骤二:对信息进行解析,计算得出帧率信息。gfxinfo信息内容大致如下所示:

Stats since: 统计开始时间,单位为纳秒。
Total frames rendered: 总渲染帧数。
Janky frames: 卡顿帧数,即超过16ms(每秒60帧的刷新间隔)的帧数。
Janky frames percentage: 卡顿帧占比,即卡顿帧数与总帧数的比例。
90th percentile: 90分位数,表示90%的帧的渲染时间低于该值(以毫秒为单位)。
95th percentile: 95分位数,表示95%的帧的渲染时间低于该值(以毫秒为单位)。
99th percentile: 99分位数,表示99%的帧的渲染时间低于该值(以毫秒为单位)。
Number Missed Vsync: 未同步垂直同步次数,即由于未能及时渲染而导致的丢帧次数。
Number High input latency: 高输入延迟次数,表示输入事件处理时间过长而导致的延迟次数。
Number Slow UI thread: UI线程响应缓慢次数,即UI线程处理时间过长的次数。

以Solopi为例子,就是通过gfxinfo信息中的超时帧时间,来反推帧率的,具体项目的代码可以查看solopi source code。

卡顿率/卡顿次数

卡顿次数:在测试周期内,检测到帧率低于阈值的时间段数。每当帧率低于阈值并持续一段时间,就计为一次卡顿。这里的阀值,可以进行自定义设置,例如低于目标帧率60FPS,就可以记为一次卡顿。即帧渲染时间大于16ms,就计算为卡顿。

卡顿率:卡顿时间占总测试时间的百分比。假设在一次测试中,应用运行了120秒,期间总共有4次帧率低于16 FPS的情况,总计卡顿时间为8秒,那么:卡顿次数:4次。卡顿率:8/120*100%=6.7%。在上面的gfxinfo中,也有卡顿率的数据信息。

cpu/内存

  以solopi为例,cpu是包含应用顶层Activity所在进程的CPU占用百分比与全局CPU占用百分比,对于单进程应用,该数据表示该应用的CPU占用情况;对于多进程进程应用,该数据表示顶层UI进程的CPU占用情况,当发生进程切换时,Soloπ能够自动切换到新的进程数据。

  以solopi为例,内存包含应用顶层Activity所在进程的PSS(Proportional Set Size,即实际使用内存)内存、Private Dirty(私有内存)内存与全局占用内存,对于单进程应用,该数据表示该应用的内存占用情况;对于多进程进程应用,同CPU一样,Soloπ也支持自动切换顶层进程。
如何统计cpu和内存信息呢?
有两种方式统计cpu和内存信息,方式一:直接读取/proc/<pid>/stat文件来获取进程的 CPU 时间,或者,直接读取/proc/<pid>/statm 文件获取进程的内存统计信息。方式二:通过adb shell命令获取内存和cpu使用信息。以Android设备为例,现在已经关闭了直接读取文件的口子,所以,通常情况下,是使用adb命令来获取内存,cpu信息。
 下面是通过adb命令获取内存使用信息的示例代码。在执行adb命令的时候,要保证adb具有root权限。可以通过adb root命令将ADB daemon提升为Root权限。
import subprocessdef get_memory_info(pid):try:# Run adb shell command to read /proc/<pid>/statmcommand = f"adb shell cat /proc/{pid}/statm"result = subprocess.check_output(command, shell=True)statm_data = result.decode('utf-8').strip().split()# Parse statm datasize, resident, shared, text, lib, data, dt = map(int, statm_data)memory_info = {'size': size,         # total program size (pages)'resident': resident, # resident set size (pages)'shared': shared,     # shared pages (pages)'text': text,         # text (code) size (pages)'lib': lib,           # library (unused since Linux 2.6; always 0)'data': data,         # data + stack (pages)'dt': dt              # dirty pages (unused since Linux 2.6; always 0)}return memory_infoexcept subprocess.CalledProcessError as e:print(f"Error executing command: {e}")return Noneexcept Exception as e:print(f"Error: {e}")return None# Replace with your application's PID
pid = '12345'
memory_info = get_memory_info(pid)
if memory_info:print(f"Memory info for PID {pid}:")print(f"Size: {memory_info['size']} pages")print(f"Resident set size (RSS): {memory_info['resident']} pages")print(f"Shared pages: {memory_info['shared']} pages")print(f"Text (code) size: {memory_info['text']} pages")print(f"Data + stack size: {memory_info['data']} pages")

网络

  以solopi为例,网络包含应用上下行速率与累计流量以及全局上下行速率与累计流量。属于应用维度数据,具体数据如下图所示:

如何获取网络数据?

  获取网络数据和获取cpu/内存数据一样,可以直接读取/proc/pid/net/dev文件获取网络数据,或者通过adb命令获取(命令:adb shell cat /proc/pid/net/dev)。下图是solopi部分源码,可以看到这里统计了wlan0的网络数据情况,具体逻辑可以查看solopi source code下面的NetworkTools.java代码。当然,关于网络流量统计,网上也提交了bug,因为这里grep wlan0,只统计了网络wifi的流量,没有统计到移动流量。bug详细信息见这里。

响应时间

  以solopi为例,包含应用点击的响应耗时与刷新耗时数据。属于应用维度数据。从用户点击开始,到系统第一次发出界面更新时间为响应耗时,到系统停止界面刷新的时间为刷新耗时。统计响应时间的逻辑是录屏分帧,solopi官网介绍是实现了自动识别开始帧和结束帧来统计响应时间,实际使用solopi会发现,统计的页面响应时间并不正确,例如用户点击开始,到点击应用的页面,这中间本身有人的手速操作时间在内,这部分被统计到响应时间里面了。所以,如果要计算准备的页面响应时间,还是只有录屏,人工识别页面的开始、结束帧,会更准确。具体录屏分帧的步骤如下所示:

  以上就是对于移动应用中常见性能指标含义理解,以及如何收集详细说明。关于crash等,会在后续博客中再详细介绍。

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

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

相关文章

猫超卡怎么使用?

天猫超市卡好像只能买天猫的东西 但是有时候淘宝、京东打折比天猫的单价还便宜 这样的话&#xff0c;猫超卡好像也没多大用处 这不&#xff0c;上个月618凑单的东西比在天猫超市买划算多了 最后我直接把猫超卡在收卡云上折现了&#xff0c;超划算

编程学单词:delta(希腊字母Δ/δ)

希腊字母表的第四个字母&#xff0c;大写为Δ&#xff0c;小写为δ。 (笔记模板由python脚本于2024年07月11日 12:32:56创建&#xff0c;本篇笔记适合喜欢写代码&#xff0c;更喜欢鼓捣Python的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.pyth…

算法 | NOIP1999 Cantor表

算法篇——Cantor的数表 - SteveWang - 博客园 (cnblogs.com) #include <bits/stdc.h> using namespace std; int high(int n) {return n*(n1)/2; } int main() {int k;cin>>k;int n1;while(1){if(high(n)>k){break;}n;} int mhigh(n);int wm-k1;if(n%20){cout…

Arcgis Api 三维聚合支持最新版API

Arcgis Api 三维聚合支持最新版API 最近有同学问我Arcgis api 三维聚合&#xff0c;官方还不支持三维聚合API&#xff0c;二维可以。所以依旧是通过GraphicLayers 类来实现&#xff0c;可支持最新Arcgis Api版本 效果图&#xff1a;

《计算机研究与发展》投稿经验

前言 记录下投计研展正刊的经验。跟专刊不同哈&#xff0c;专刊会更快&#xff0c;我看好像也有专刊的经验分享。【计算机研究与发展投稿记录】 期刊简介 来源计研展官网&#xff1a; 《计算机研究与发展》是中国科学院计算技术研究所和中国计算机学会联合主办的学术性期刊&a…

盲人出行体验攻略:蝙蝠避障,点亮前行的明灯

在繁华喧嚣的都市中&#xff0c;每一步都充满了未知与挑战&#xff0c;而对于盲人朋友们来说&#xff0c;出行更是一场无声的冒险。他们凭借着内心的勇气和坚韧的意志&#xff0c;在黑暗中摸索前行&#xff0c;每一步都承载着对生活的热爱与追求。今天&#xff0c;我们要深入探…

FLStudio21.3.12中文破解版本安装包win+mac电脑安装包下载

&#x1f3a4; FL Studio 21中文版&#xff1a;音乐制作新宠&#xff0c;让你的创作起飞&#xff01; 嗨&#xff0c;亲爱的音乐创作者们&#xff01;&#x1f44b;今天要和大家分享一个让我超级兴奋的宝藏软件——FL Studio 21中文版&#xff01;这不仅仅是一款音乐制作软件&…

STM32串口工作原理

STM32的串口是相当丰富的&#xff0c;功能也很强劲。最多可提供5 路串口&#xff0c;有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIRENDEC 规范(仅串口3支持)、具有DMA等。 串口最基本的设置&#xff0c;就是波特率的设置。STM32的串口使…

移动应用稳定性测试

移动应用稳定性测试 使用Monkey等工具进行移动应用稳定性测试是一种常见的自动化测试方法。Monkey工具可以自动生成各种随机事件来模拟用户操作&#xff0c;从而测试应用在不同情况下的表现。在执行monkey命令后&#xff0c;主要观察以下的结果信息来评估移动应用的稳定性。 崩…

前后端通信 —— HTTP/HTTPS

目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法&#xff08;常用&#xff09; 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码&#xff08;常用&#xff09; …

实用调试技巧(Visual Studio)

目录 Debug 和 Release 的区别 F10 --- 逐过程调试 & F11 --- 逐语句调试 F9 --- 新建/切换断点 & F5 --- 开始调试 shift F5 & ctrl F5 Debug 和 Release 的区别 Debug&#xff1a;通常为调试版本&#xff0c;它包含调试信息&#xff0c;并且不作任何优化…

亚信科技基于 Apache SeaTunnel 的二次开发应用实践

亚信科技在Apache SeaTunnel的实践分享 自我介绍 各位同学好&#xff0c;很荣幸通过Apache SeaTunnel社区和大家进行分享交流。我是来自亚信科技的潘志宏&#xff0c;主要负责公司内部数据中台产品的开发。 本次分享的主题是Apache SeaTunnel在亚信科技的集成实践&#xff0c…

商品分类左右联动

1、先看效果 2、以hooks方法处理&#xff0c;方便复制使用&#xff0c;见代码 Good.vue文件 <script setup lang"ts" name"goods">import {onMounted, ref, nextTick} from "vue";import useProductScroll from "/utils/hooks/useP…

Milvus核心设计(2)-----TSO机制详解

目录 背景 动机 Timestamp种类及使用场景 Guarantee timestamp Service timestamp Graceful time Timestamp同步机制 主流程 时间戳同步流程 背景 Milvus 在设计上突出了分布式的设计,虽然Chroma 也支持分布式的store 与 query。但是相对Milvus来说,不算非常突出。…

Python 神器:wxauto 库——解锁微信自动化的无限可能

&#x1f4dd;个人主页&#x1f339;&#xff1a;誓则盟约 ⏩收录专栏⏪&#xff1a;机器学习 &#x1f921;往期回顾&#x1f921;&#xff1a;“探索机器学习的多面世界&#xff1a;从理论到应用与未来展望” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f…

mysql高并发设计

mysql高并发设计 一、部署方案 https://blog.csdn.net/weixin_37519752/article/details/138728036 方案1&#xff1a;双主 1、优点 写入扩展性&#xff1a;两个节点都可以处理写入操作&#xff0c;提高了写入操作的扩展性。 高可用性&#xff1a;在任一节点故障时&#xff…

数据结构复习计划之复杂度分析(时间、空间)

第二节&#xff1a;算法 时间复杂度和空间复杂度 算法(Algorithm)&#xff1a;是对特定问题求解方法(步骤)的一种描述&#xff0c;是指令的有限序列&#xff0c;其中每一条指令表示一个或多个操作。 算法可以有三种表示形式&#xff1a; 伪代码 自然语言 流程图 算法的五…

猫不吃东西还呕吐是什么原因?可以预防猫咪呕吐的主食冻干推荐

猫咪突然食欲不振&#xff0c;还出现了呕吐的症状&#xff0c;这究竟是为什么呢&#xff1f;结合我多年养猫的经验&#xff0c;让我们一起分析一下可能的原因。 一、 猫不吃东西还呕吐是什么原因 &#xff08;1&#xff09;首先、排除猫瘟 如果你的猫咪一直家养&#xff0c;…

【Android】基于 LocationManager 原生实现定位打卡

目录 前言一、实现效果二、定位原理三、具体实现1. 获取权限2. 页面绘制3. 获取经纬度4. 方法调用5. 坐标转换6. 距离计算7. 完整代码 前言 最近公司有个新需求&#xff0c;想要用定位进行考勤打卡&#xff0c;在距离打卡地一定范围内才可以进行打卡。本文将借鉴 RxTool 的 Rx…

php快速入门

前言 php是一门脚本语言&#xff0c;可以访问服务器&#xff0c;对数据库增删查改&#xff08;后台/后端语言&#xff09; 后台语言&#xff1a;php&#xff0c;java&#xff0c;c&#xff0c;c&#xff0c;python等等 注意&#xff1a;php是操作服务器&#xff0c;不能直接在…