Android APP性能指标(二)

文章目录

  • 一、响应时间
      • 1.1 数据获取
      • 1.2 响应时间指标测试点
      • 1.3 启动速度测试点
      • 1.4 响应时间测试解决方法
  • 二、流量
      • 2.1 数据获取
      • 2.2 流量测试关注点
      • 2.3 测试标准
  • 三、电量
      • 3.1 连接手机
      • 3.2 数据获取
      • 3.3 获取APP的UID
      • 3.3 重置电池数据收集数据
      • 3.4 电量指标测试
  • 四、温度
  • 五、性能测试常见问题

在上一篇Android APP性能指标(一)中我们对CPU、内存、FPS和GPU四个常关注的指标进行学习。

本文将从响应时间、电量、流量等指标来了解Android性能。

一、响应时间

响应时间是衡量操作的APP达到期望效果的时间范围。如果一个软件,加载数据一直加载不出来,会对软件的日活、留存产生影响。

  • 应用冷启动<=600ms为优秀,<=800ms为良好,<=1000ms为可接受
  • 应用热启动<=200ms为优秀,<=400ms为良好,<=600ms为可接受

1.1 数据获取

获取package和activity的方法:adb logcat | grep -i displayed(需操作APP)
在这里插入图片描述

方法一:adb 方法

  1. 冷启动,需要提前确认程序是否在后台跑,如有则需要先kill应用程序
  2. 获取应用首次启动时间:adb shell am start -W -S -n package/activity
  3. 获取应用二次启动时间:adb shell am start –W –n
  4. 停止APP命令:adb shell am force-stop package

在这里插入图片描述
(1)WaitTime 就是总的耗时,包括前一个应用 Activity pause 的时间和新应用启动的时间;TotalTime+系统资源启动时间
(2)TotalTime 表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用 Activity pause 的耗时。也就是说,开发者一般只要关心 TotalTime 即可,这个时间才是自己应用真正启动的耗时

  使用am命令获取的时间只是apk从onCreate到onResume的时间,但不包含UI界面呈现出来的时间,所以考虑计算从am命令执行到logcat中有displayed出现的时候,视为app已经启动并展现,作为结束时间。此方法并不能完全计算出启动时间,有一定的误差。

方法二:使用charls 抓包,查看duration

在这里插入图片描述

1.2 响应时间指标测试点

  • 冷启动:应用首次启动所花费的时间
  • 热启动:应用非首次启动所花费的时间
  • 跳转:应用界面切换所花费的时间

1.3 启动速度测试点

  1. 冷启动速冻:首次启动app的时间间隔(只是启动时间,不包括页面加载)
  2. 热启动速度:非首次启动app的时间间隔(只是启动时间,不包括页面加载)
  3. 完全启动速度:从启动到首页完全加载出来的时间间隔
  4. 有网启动速度:从发起跳转,到页面完全加载出来的时间间隔
  5. 无网启动速度:从发起跳转,到页面完全加载出来的时间间隔

启动时间验收标准为 冷启动不超过1.5S,热启动不超过1S

1.4 响应时间测试解决方法

场景方法
获取单机事件触发到容器启动Native APP消耗的时间埋点
获取NativeAPP完全启动消耗时间查看system.log
获取Native调用PRC请求方法的延时时间埋点
获取RPC请求发出去过程中的具体数据埋点
获取RPC请求返回具体数据埋点
获取本地解析返回数据所消耗的时间埋点或者Traceview工具
获取界面渲染的时间慢速摄像机或埋点

二、流量

  如今,网络类型主要有2G、3G、4G、5G和WiFi,APP在使用不同网络时,我们要对其采取不同流量控制策略。如常用的视频APP,主要使用的网络类型为WiFi环境和蜂窝网络环境。

流量指标中涉及到的概念:

  • 中等负荷:应用正常操作
  • 高负荷:应用极限操作

2.1 数据获取

1、获取APP的PID:

  • 方法一:adb shell ps | grep 包名
    在这里插入图片描述
  • 方法二:adb shell dumpsys package 包名

2、获取流量数据命令:
adb shell cat /proc/获取的进程号PID/net/dev
在这里插入图片描述
注意:有些设备获取的流量数据有差异cat /proc/net/dev

3、tcpdump 抓包分析

  • 下载tcpdump工具,push到设备/data/local/tmp目录下

  • 在命令行中,输入tcpdump -v -i any -s 0 -c 2000 -w /文件地址
    在这里插入图片描述

  • tcpdump 工具命令参数说明
    -v/-vv/-vvv:,输出数据的详细程度,针对流量测试。
    -i:指定网卡(interface): any代表不限网卡
    -c: 指定接收包的数量,接收完成后自动停止抓包
    -s: 指每个包中最多截取的字节数,设置为0 时,为默认值262144

  • 使用Wirshark打开统计流量值,筛选ip.host=

2.2 流量测试关注点

  1. 应用首次启动流量值
  2. 应用后台持续运行时长2H的流量值
  3. 应用高负荷运行的流量峰值
  4. 应用中等负荷运行中的流量均值

2.3 测试标准

  • 不存在重复请求
  • 页面静默时或处于后台不应有流量增加
  • 缓存机制的逻辑合理
  • 在移动网络下不应自动下载素材等数据
  • 小缩略图小于5KB
  • 中缩略图小于25KB
  • 大缩略图小于50KB

三、电量

电量指标需要关注以下场景:

  1. 设备安装APK前后,待机功耗无明显差异
  2. 待机、操作页面、启动APK等常见操作,电量消耗均值正常
  3. 长时间使用APK,无异常耗电现象

  要通过adb命令来监控手机的耗电量,所以建议通过wifi的方式来连接手机,而不是用usb线来连接手机设备。usb方式连接手机会自动给手机充电,这样会影响对耗电量的统计的准确性。

3.1 连接手机

# 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个WiFi
# 先使用原装数据线把电脑与手机连接,手机在开发者选项中开启USB调试
# 使用adb devices命令查看是否与设备连接$ adb devices
List of devices attached
86af3f27	device
# 显示device表示连接成功# 断开数据线
$ adb connect 172.16.xxx.xxx:5555
unable to connect to 172.16.xxx.xxx:5555: Connection refused# 输入 adb tcpip 5555命令
# 打印 “restarting in TCP mode port: 5555”表示启动成功# 找到手机的 IP 地址
# 进入手机的WIFI连接,进入连接属性,查看手机的 IP
# 也可在「设置」-「关于手机」-「状态信息」-「IP地址」找到# 输入adb connect '手机ip地址'
$ adb connect 172.16.xxx.xxx:5555
# 出现 connected to ip:5555 表示连接成功

3.2 数据获取

adb命令:adb shell dumpsys battery

Current Battery Service state:AC powered: falseUSB powered: trueWireless powered: falseMax charging current: 500000    # 最大充电电流Max charging voltage: 5000000   # 最大充电电压Charge counter: 2449000status: 5               # 电池状态:2:充电状态 ,其他数字为非充电状态health: 2               # 电池健康状态:只有数字2表示goodpresent: true           # 电池是否安装在机身level: 100              # 电量: 百分比scale: 100voltage: 4302           # 电池电压temperature: 385        # 电池温度,单位是0.1摄氏度technology: Li-poly     # 电池种类

3.3 获取APP的UID

adb shell COLUMNS=512 top
在这里插入图片描述
或者adb shell ps | grep 包名,Windows电脑将grep替换成findstr即可
在这里插入图片描述

3.3 重置电池数据收集数据

  • 清除已有的耗电量数据
    adb shell dumpsys batterystats --enable full-wake-history

  • 重置设备耗电量数据
    adb shell dumpsys batterystats --reset

  • 然后执行业务场景,测试完成之后再执行以下命令取出APP电量消耗日志(把数据重定向到本地)
    adb shell dumpsys batterystats > 文件地址

在文件中搜索 Estimated power use (mAh)即可跳转到App电量消耗位置:
在这里插入图片描述
之前获取的Uid值 u0_a1619 需要将下划线 _ 去掉变成 u0a1619 ,然后通过该Uid在日志文件中查找则可搜索到该APP对应的耗电量。

其中, Uid u0a1619:0.0978 中的 0.0978 为该APP在测试期间消耗的总电量,单位为 mAh ,圆括号中详细说明了电量消耗的详细信息。

3.4 电量指标测试

电量指标需要从软件和硬件两方面都要进行测试。

硬件端:需要硬件测试工程师使用万用表、功耗仪进行测试。满足市场行业标准

软件端:

  • 方式一:可以使用第三方工具进行测评
  • 方式二:命令端获取电量数据

四、温度

Android 设备运行过程中,设备温度异常不仅对用户体验带来不好影响,同时也存在安全方面隐患。

温度指标需要关注如下几个场景:

  1. 设备满负荷情况,设备温度峰值无异常
  2. 设备APK长时间播放,设备温度均值无异常
  3. 设备常规操作如点击、启动APK等温度正常

温度指标数据与电量指标获取方式都一样的

  • adb shell dumpsys battery
    在这里插入图片描述
  • temperature:温度(int类型),单位:0.1度

五、性能测试常见问题

在性能测试过程中,经常会遇到如下问题及原因:

问题原因
APP连接超时网络中断;APP 请求接口异常
APP 闪退Android缓存垃圾过多;运行程序多,导致内存不足等;版本兼容问题
卡顿、黑白屏系统CPU、GPU资源不够;过度绘制
崩溃APP常常表现为Crash
交互性能差其他APK、弹框干扰
内存泄漏APK新建的对象没有释放,导致内存一直被占用
内存溢出APK申请内存不够时

参考文档:https://juejin.cn/post/7068239461607276581#heading-5

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

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

相关文章

打包系统待优化点

Base.Widget.AppCompat.ActivityChooserView中相关资源重复 D:\channelPackage\ToolConfigPath\games\dcpPro\100081\mumu\tempRes\values\attrs.xml:1171: error: duplicate value for resource attr/displayOptions with config . D:\channelPackage\ToolConfigPath\games\d…

【C++精简版回顾】19.异常处理

1.throw抛出问题 int print(int a,int b) {if (b 0)throw b;return a / b; } 2.try与catch解决问题 try {print(2, 0); } catch (int b) {cout << "竟然是&#xff1a;"<<b<<endl; } 结果&#xff1a; 补充1&#xff1a;可以抛出字符串等 1.throw…

day13_微服务监控Nginx(微服务集成SBA)

文章目录 1 微服务系统监控1.1 监控系统的意义1.2 SBA监控方案1.3 SBA实战1.3.1 创建SBA服务端1.3.2 微服务集成SBA 1.4 微服务集成logback1.5 配置邮件告警 2 Nginx2.1 Nginx简介2.2 下载和安装2.2.1 方式1&#xff1a;window本地安装2.2.1.1 下载2.2.1.2 安装2.2.1.3 目录结构…

关于 typeof 与 instanceof 区别引出的原型对象问题

一、关于 typeof 与 instanceof 区别&#xff1a; typeof 和 instanceof 是 JavaScript 中用于检查变量类型的两个不同操作符&#xff0c;它们在使用上有着明显的区别和不同的适用场景。 typeof typeof 是一个一元操作符&#xff0c;用于返回一个变量或表达式的数据类型的字符…

简单认识算法

什么是算法&#xff1f; 解决某个实际问题的过程和方法。 排序算法 1.冒泡排序 打印结果&#xff1a; 2.选择排序 打印结果&#xff1a; 优化选择排序&#xff1a;因为每一轮都需要以当前位置为基准与后面元素比较&#xff0c;太过繁琐&#xff0c;所以可以找到后面元素中较小…

Long使用==

1、背景&#xff1a;测试程序的时候发生了没数据的bug,于是在sevice层的一堆代码中调试&#xff0c;最后发现问题是在stream的filter方法中对两个Long使用造成的问题。 2、测试代码&#xff1a; Long a Long.valueOf(340);Long b Long.valueOf(340);System.out.println(a b)…

指针的学习4

目录 回调函数 qsort使用样例 使用qsort函数排序整形数据 使用qsort函数排序结构体 回调函数 回调函数就是一个通过函数指针调用的函数。如果把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xf…

想打造爆款AI应用?ai虚拟数字人制作助你一臂之力

如今&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI应用已经渗透到我们生活的方方面面。而在这个充满竞争和创新的时代&#xff0c;不少企业都在努力寻找打造爆款AI应用的机会。其中&#xff0c;AI虚拟数字人制作可以为他们提供一臂之力。 AI虚拟数字人制作是指利用人…

六氟化硫SF6气体怎么监测泄漏?

在当今的电力工程领域中,六氟化硫是一种应用广泛的电负性气体,从它发明至今已有百年历史。六氟化硫耐电强度为同一压力下氮气的2.5倍,击穿电压是空气的2.5倍,灭弧能力是空气的100倍,是一种优于空气和油之间的新-代超高压绝缘介质材料。 六氟化硫以其良好的绝缘性能和灭弧性能,在…

解决ts报错:类型“entry”上不存在属性“$AppTools”

uniapp ts 项目&#xff0c;已经将AppTools挂在了vue的原型上&#xff0c;但是在vue页面使用时报错&#xff0c;如图&#xff1a; 解决&#xff1a; 在项目根目录下的tsconfig.json文件添加如下配置&#xff1a; "include": ["src/**/*"],这样报错就消失…

使用移动云短信服务发送普通短信与模板短信

今天使用到了用移动云短信服务发送短信功能,顺便记录下 apid,secretKey和集团名称分别为如下图用户名,密码,所属分组 package com.keyou.proj.authentication.service.utils;import cn.hutool.crypto.SecureUtil; import cn.hutool.http.HttpRequest; import cn.hutool.json.J…

Vue.js+SpringBoot开发天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

JuiceSSH结合Cpolar实现公网远程SSH访问内网Linux系统

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

【Python】新手入门(8):什么是迭代?迭代的作用是什么?

【Python】新手入门&#xff08;8&#xff09;&#xff1a;什么是迭代&#xff1f;迭代有什么应用&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】…

SpringBoot集成ElasticSearch(ES)

ElasticSearch环境搭建 采用docker-compose搭建&#xff0c;具体配置如下&#xff1a; version: 3# 网桥es -> 方便相互通讯 networks:es:services:elasticsearch:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/elasticsearch:7.14.1 # 原镜像elasticsearch:7.…

基于Mindspore,通过Resnet50迁移学习实现猫十二分类

使用平台介绍 使用平台&#xff1a;启智AI协作平台 使用数据集&#xff1a;百度猫十二分类 数据集介绍 有cat_12_train和cat_12_test和train_list.txt train_list.txt内有每张图片所对应的标签 Minspore部分操作科普 数据集加载 Mindspore加载图片数据集就直接调整成这种…

什么?!你居然连个内存泄漏都排查不出来

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 在日常的业务开发中&#xff0c;偶尔会出现内存泄漏的情况&#xff0c;那么我们该怎么排查呢&#xff1f;现在跟着文章一起学习下吧~ 使用Chrome devTools查看内存情况 打开Chrome的无痕模式&#xff0c;以屏蔽Ch…

k个一组反转链表

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution { public:ListNode* reverseKGroup(ListNode* head, int k) {if(k 1) return head;//特殊情况ListNode *cur head;for(int i 1; i < k; i){if(cur nullptr ||cur->nex…

Seurat 中的数据可视化方法

本文[1]将使用从 2,700 PBMC 教程计算的 Seurat 对象来演示 Seurat 中的可视化技术。您可以从 SeuratData[2] 下载此数据集。 SeuratData::InstallData("pbmc3k")library(Seurat)library(SeuratData)library(ggplot2)library(patchwork)pbmc3k.final <- LoadData(…

【wine】解决 0024:fixme:msctf:KeystrokeMgr_TestKeyUp STUB:(00A3D508)

故障日志 0024:fixme:msctf:KeystrokeMgr_TestKeyUp STUB:(00A3D508) AI分析 这些消息表示Wine对IE内核组件以及IME&#xff08;Input Method Editor&#xff0c;输入法编辑器&#xff09;的支持不完全。特别是涉及文本输入、拖放事件、属性变化通知等功能。 解决 winetrick…