移动应用性能关注分析哪些指标

 移动应用常见性能指标

  要对应用开展性能测试,首先需要了解需要重点关注哪些指标?指标的参考范围大致是多少?可采用哪些工具收集这些指标?如何收集?如果指标有异常,大致有哪些high level的优化思路。这篇博客从cpu,内存,网络,其他,四个方面整理了移动应用常见指标以及参考值范围。具体如下图所示:(需要注意:指标数据范围仅供参考,以内存占用大小为例,国内很多app,实际应用大小都超过了200MB)

如何用Android Studio Profile分析应用性能

  使用Android studio上运行移动应用,在工具最下面,会自动显示Profile工具菜单,如果没有看到这个菜单,还可以通过View/Tool Windows/中选择Profile工具。选择虚拟设备,以及选择应用后,就可以通过profile观察应用消耗的cpu,内存等信息了。

  除了Android Profiler,还可以使用App Inspector观察应用的网络请求情况,数据库连接情况,后台任务情况等信息。通过收集这些信息进行性能评估。

  在Android studio上还可以连接Firebase观察crash情况。在App Quality Inspect菜单中,选择Firebase,安装FireBase官网给出的配置建议完成配置后,即可通过FireBase观察应用Crash情况。

  除了上面的性能数据收集分析工具,在Android studio中还可以查看logcat日志,查看应用运行过程中的异常信息,可帮助开发更好的进行分析。Android studio上的工具总体来将大部分都是白盒层面的工具,除了这些工具,实际还可以通过第三方黑盒类工具进行性能数据收集和分析。

如何用charles、wireshark等分析网络情况

  如果要使用工具对移动应用进行抓包,大致可以分为三个步骤。步骤一:在工具上设置代理端口以及bypass的URL,这样所有通过这个端口的流量都会转发到代理工具上。步骤二:保证移动应用和电脑连接到相同的wifi上,这样可以保证通过内部IP地址访问时,可以相互访问,在手机上将电脑的内部IP地址+工具的代理端口设置为手机的代理,这样所有经过手机的流量,实际都会转发到电脑上安装的代理工具上。步骤三:下载证书,并在手机上信任证书,这样https的请求才能被解码显示。下面以charls和fidder为例子,简要演示如何通过抓包工具抓取移动手机上http/https请求。

步骤一:代理端口和规则设置

下面是Fidder的connections菜单的设置,这里代理的端口是8866,enable“Allow remote devices to connect”,Bypass URLs中增加了*,即所有的请求都被代理转发。

如果选用Charles来抓包,charles的默认端口是8888,这里也需要配置SSL proxying,增加了*,即所有的请求都被抓取并转发。

步骤二:移动手机上手动设置代理

在手机上设置代理前,首先需要知道电脑的内网IP,这个IP可以从代理工具上获取,以charles为例,在help菜单下,点击“Install Charles Root certification on a Mobile Device”,即可显示电脑的内网IP地址,当然,你也可以通过ifconfig命令获取IP地址。

  在移动手机的wifi菜单下,手动设置代理的IP地址的端口,如下图所示:这里用的是Fidder的代理地址信息。设置代理后,所有的手机上的流量就能被抓包工具获取,并进行转发。

步骤三:下载安装证书,并信任证书

  代理设置后,就可以按工具的提示信息,到指定web地址上下载证书,下载后安装,并信任证书。以Android手机为例,设置-安全-更多安全设置-加密与凭据-安装证书,选择刚才通过网站下载的证书,即可进行安装。安装完成后,在该目录还有个用户凭证的菜单,进入查看确保刚才的证书已经添加进去了。(需要注意一点:必须先设置代理,到chls.pro/ssl地址上才能下载证书。其他抓包工具如Fidder,HTTP toolkit等也是相同的步骤)

  安装证书后,即可开始用Fidder或者Charls进行抓包了。在手机上访问移动app或者在浏览器上访问网站,在工具中会显示所有的https/http请求信息。下图是Fidder中抓取到的http请求信息,可以看到里面包含了整个请求耗费的时间,以及分段时间(即DNS time/TCP connect Time/HTTPS Handshake Time等),除时间外,还包括包的大小信息,通过这些信息,可以有效进行性能分析。

  当然,除了Fidder,Charles也同样可以获取到https/http请求的时间,包大小等信息。具体如下所示:

  对于https请求,为什么charles等工具可以进行解码呢?Charles和类似的中间人(Man-in-the-Middle, MITM)代理工具能够解密 HTTPS 请求的原因在于它们能够扮演客户端和服务器之间的中间人角色,通过安装自签名根证书来实现。以下是详细的解释其工作原理和具体步骤:
  Charles 生成一个自签名的根证书,并要求用户在其设备上安装并信任这个根证书。当 Charles 代理 HTTPS 请求时,它会在客户端和目标服务器之间建立两个独立的 SSL/TLS 连接。对于每一个客户端请求,Charles 生成一个与目标服务器对应的伪造证书,这个伪造证书是用 Charles 的自签名根证书签名的。

  Charles 与客户端建立 SSL/TLS 连接,并将自己伪装成目标服务器。因为客户端信任 Charles 的根证书,所以它会信任这个伪造的服务器证书。
  同时,Charles 与目标服务器建立另一个 SSL/TLS 连接,并使用服务器的真实证书进行通信。Charles 代理解密从客户端发送到服务器的加密数据,然后将其转发到目标服务器。同样地,它解密从服务器返回到客户端的加密数据,再将其转发回客户端。

  当然,如果请求数据是应用层加密的,Charles 或其他类似的工具无法直接解密这些内容。你需要应用本身的密钥和算法来解密,这通常是不可能的,因为这些信息对于普通用户来说是不可访问的。例如,抓取weixin的包,是无法看到包的request具体内容的,应该是weixin进行了请求数据层面的再次加密。

  charles和fidder主要是抓取https/http请求,如果要对网络进行更加细致的分析,需要配合wireshark,wireshark是一个开源的抓包分析工具,对于https请求,wireshark不支持自动解密操作,这个部分可以用charles或者fidder解决。当开启了charles或者fidder一类的工具后,因为移动手机上的所有流量都会经过代理工具,所以开启wireshark,选择以太网端口抓取流量,即可抓取电脑上所有流量,再通过在过滤器中设置过滤来查看需要的分析的包信息。启动wireshark(这里为了不会有权限问题,使用sudo命令启动应用:sudo /Applications/Wireshark.app/Contents/MacOS/Wireshark)。在filter中通过设置ip地址为移动手机地地址来筛选出移动手机上的所有请求,然后进行分析。

  当然,除了启动代理工具,来让wireshark抓取移动手机上流量包外,还可以在电脑上开启热点,手机连接到热点网络上,在启动wireshark时选择热点网路,也可以实现抓取移动手机上流量的效果。

如何用UIAutomator2进行巡检

  除了上面的性能数据收集工具,还可以使用Android提供的UIAutomator2工具编写巡检代码。自动检查某些关键操作是否在期望时间内完成。例如,这里假设期望的所有操作都能在200ms内完成,下面代码调用Android提供的uiautomator2框架,对应用的一些需要检查的元素进行操作,并判断耗费的时间,将生成的结果存储到巡检报告文件中。为了测试更加稳定,也可以多次操作,求平均值,如果平均值在200ms内即可。

import uiautomator2 as u2
import time# 连接设备
d = u2.connect()# 定义关键元素的资源ID或其他属性
elements_to_check = [{"resourceId": "com.example:id/button1"},{"resourceId": "com.example:id/button2"},{"resourceId": "com.example:id/input_field"},{"resourceId": "com.example:id/submit_button"}
]def check_operation_timing(element):# 开始计时start_time = time.time()# 执行操作try:el = d(**element)if el.exists:el.click()else:print(f"元素 {element} 不存在")return False, 0except Exception as e:print(f"操作失败: {e}")return False, 0# 结束计时end_time = time.time()# 计算响应时间response_time = (end_time - start_time) * 1000  # 转换为毫秒# 检查响应时间是否在200ms以内if response_time <= 200:print(f"操作成功,响应时间:{response_time:.2f} 毫秒")return True, response_timeelse:print(f"操作超时,响应时间:{response_time:.2f} 毫秒")return False, response_timedef perform_inspection(elements):response_times = []for element in elements:success, response_time = check_operation_timing(element)if success:response_times.append(response_time)time.sleep(0.5)  # 添加一些延迟,以避免设备过载return response_times# 进行巡检
response_times = perform_inspection(elements_to_check)# 统计结果
if response_times:average_time = sum(response_times) / len(response_times)print(f"平均响应时间:{average_time:.2f} 毫秒")
else:print("没有成功的操作")# 处理巡检结果,例如,保存到文件或数据库

  以上就是在进行移动应用性能测试分析时,需要关注的常用指标以及一些常用工具的使用。

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

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

相关文章

说一下GET请求和POST请求的区别

面试官常常会问到的一个问题就是&#xff1a;GET请求和POST请求的区别。因为一个看似简单的问题就能考察出面试者对网络协议和通信的掌握程度以及对前后端开发基础知识是否了解、安全性意识是否足够强&#xff0c;以及综合分析与总结能力等。 所以答的好可以让面试官对你刮目相…

YoloV8改进策略:卷积篇|Kan行天下之GRAM,KAN遇见Gram多项式V2版本

GRAM(GRAM可能是一个新提出的模型或方法的缩写,这里我们根据上下文进行解释)受到诸如TorchKAN和ChebyKAN等Kolmogorov-Arnold网络(KAN)替代方案的启发。GRAM引入了一种简化的KAN模型,但同时利用了Gram多项式变换的简单性。它与其他替代方案的不同之处在于其独特的离散性特…

Vue3 使用emoji表情包 emoji-mart-vue-fast

文档&#xff1a;emoji-mart-vue-fast - npm (npmjs.com) 非常简单 代码直接照抄即可 1. 引入 pnpm install emoji-mart-vue-fast 2. 使用 <template><Picker:data"emojiIndex":emojiSize"18":showPreview"false":infiniteScroll&quo…

【07】分布式事务解决方案

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有ACID四个特性&#xff1a;原子性、一致性、隔离性、持久性。任何事务机制在实现时&#xff0c;都应该考虑事务…

J025_斗地主游戏案例开发(简版)

一、需求描述 完成斗地主游戏的案例开发。 业务&#xff1a;总共有54张牌&#xff1b; 点数&#xff1a;3、4、5、6、7、8、9、10、J、Q、K、A、2 花色&#xff1a;黑桃、红桃、方片、梅花 大小王&#xff1a;大王、小王 点数分别要组合4种花色&#xff0c;大小王各一张。…

[激光原理与应用-114]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 18 - 产品宣传、介绍、产品价值、帮助客户解决的问题

目录 一、第一印象 1.1 我是谁&#xff1f;产品是什么&#xff1f;产品在产业链中的位置 1.2 公司在产业链中的位置&#xff1f;公司简介&#xff1f; 二、IPM工作原理 2.1 IPM系统组成 2.2 基于激光熔池光学检测原理 2.3 基于信号特征的检测原理 三、IPM产品如何与客…

2-17,18,19 -- 关于指针

指针(pointer 声明指针 int *p;定义指针 int a 4; int *p &a; //指针p是指向变量a的地址的指针指针数组 int *arr[5];数组指针 int (*arr)[5];函数指针 int (*fun)(int,int) // 声明一个指向函数的指针,这个函数的返回值是int,有两个int的参数指针的指针 int **p;…

ArkTS学习笔记_封装复用之@Styles装饰器

ArkTS学习笔记_封装复用之Styles装饰器 背景&#xff1a; 在开发中&#xff0c;如果每个组件的样式都需要单独设置&#xff0c;就会出现大量代码在进行重复样式设置&#xff0c;虽然可以复制粘贴&#xff0c;但为了代码简洁性和后续方便维护&#xff0c;给出的思路是&#xff…

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示&#xff1a;如何做混合场景的脚本&#xff1f; 用211的业务比例 ①启动数据库服务 数据库服务&#xff1a;包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…

深入了解MySQL中的innodb_lock_wait_timeout

引言 在数据库管理中&#xff0c;确保数据的一致性和完整性是至关重要的。MySQL的InnoDB存储引擎通过行级锁定机制来实现这一点。然而&#xff0c;当多个事务同时操作数据库时&#xff0c;可能会出现锁等待的情况。了解并合理配置innodb_lock_wait_timeout参数&#xff0c;对于…

数据库第6次作业

内容 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均工资。 …

Spring 使用log4j

porn.xml 引入依赖 <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.23.1</version></dependency><dependency><groupId>org.apache.logging.log4j<…

解读网传《深圳IT圈⭕新解读八小时工作制》

网传深圳IT圈的新解读八小时工作制 工作时间安排&#xff1a; 10:00-12:0014:00-18:0019:00-21:00 初看&#xff1a;有惊喜 上午开始时间晚&#xff1a;相对于传统的9点开始&#xff0c;这种安排允许员工有更多的早晨时间&#xff0c;可以用来休息或处理个人事务。下午和晚上分…

typescript新规范及vue3常用的属性解析【2024】

文章目录 如在vue中 使用tyescript来规范定义类型解释一下 < >的意思 定义 了 personList &#xff1a;是个数组 Array 且要告诉里面每一项 结构长什么样 Array<PersonInter>definepropsvue3中的hooks组件父子组件 方法、数据、相互调用 如在vue中 使用tyescript来…

【LSTM和GRU极简,和最新的TT也就是状态】机器学习模型来学习状态

LSTM&#xff08;长短期记忆网络&#xff09;中的关键参数包括输入门、遗忘门、输出门、细胞状态和隐藏状态。以下是如何进行推理计算的示例&#xff1a; LSTM参数和公式 输入门&#xff08;i_t&#xff09;&#xff1a;决定输入的信息量。 遗忘门&#xff08;f_t&#xff0…

【React Native】做了一个简约的雷达图组件

本文目录 【React Native】做了一个简约的雷达图组件获取组件实现思路用法示例简易用法自定义美化 结语 【React Native】做了一个简约的雷达图组件 最近在使用 react-native 中需要绘制雷达图&#xff0c;没有找到合适的小组件&#xff08;大的图表库未直接提供&#xff0c;需…

pico+unity3d运行测试方法

一. 发布并运行程序 这个就很简单&#xff0c;电脑和pico数据库连接、pico打开开发者模式、运行的时候选择设备pico 二. pico串流助手 1.需要先下载pico的软件 PICO Developer Center、并安装串流助手、这种方式的话&#xff0c;安装了向日葵的小伙伴可能有冲突、百度一下解…

c#中的特性

在C#中&#xff0c;特性&#xff08;Attributes&#xff09;是一种向程序元素&#xff08;如类、方法、属性等&#xff09;添加元数据的方式。特性可以用来提供关于程序元素的附加信息&#xff0c;这些信息可以在编译时和运行时被访问。 特性主要有以下几个用途&#xff1a; 提…

手机数据恢复篇:如何从 Android 设备内恢复数据

如何从 Android 内部存储恢复数据&#xff1f; 要从 Android 内部存储恢复已删除的文件&#xff0c;您需要一个 Android 内部存储恢复应用或程序。请继续阅读以获取可靠的 Android 数据恢复软件&#xff0c;并让它帮助您从 Android 手机的内部存储恢复数据。 是否有可能恢复 An…

Typescript 合并接口

在TypeScript中&#xff0c;合并接口&#xff08;Interface Merging&#xff09;是一种强大的特性&#xff0c;它允许你扩展现有的接口&#xff0c;无论是通过声明合并还是在同一个声明块中直接扩展。这种特性在基于类的面向对象编程中非常有用&#xff0c;但TypeScript的接口合…