android app 测试方法,Android App常用性能指标测试方法
获取应用的包名和activity
使用命令adb logcat|findstr START
手机成功连接电脑,确认adb devices成功,使用命令 adb logcat|findstr START.打开对应的APP,如图标红为对应app的包名和启动activity
adb logcat | findstr START
I/ActivityManager( 785): START u0 {act=android.intent.action.MAIN cat=[android.
intent.category.LAUNCHER] flg=0x10200000 cmp=com.xxx.ordersystem/.activity.We
lcomeActivity bnds=[540,960][798,1248]} from uid 10015 on display 0 from pid 177
4
使用aapt工具获取
使用.apk的包,在android sdk/build-tools的aapt.exe文件夹目录下,执行命令aapt dump badging xxx.apk,如图所示标红的为对应app的包名和启动activity
aapt dump badging xxx.apk
package: name='com.xxx.ordersystem' versionCode='123' versionName='1.6.0'
sdkVersion:'14'
launchable-activity: name='com.xxx.ordersystem.activity.WelcomeActivity' lab
el='' icon=''
启动时间
冷启动
每次杀掉应用进程启动
启动app命令
adb shell am start -W -n package/activity
Starting: Intent { cmp=com.xxx.ordersystem/.activity.WelcomeActivity }
Status: ok
Activity: com.xxx.ordersystem/.activity.WelcomeActivity
ThisTime: 317
TotalTime: 317
WaitTime: 326
Complete
ThisTime的值为启动时间
停止app命令
adb shell am force-stop package
热启动
每次从后台启动应用
启动app命令
adb shell am start -W -n package/activity
停止app命令
adb shell input keyevent 3
编写Python脚本自动获取启动时间
可以有两种方式
使用adb shell am start -W -n package/activity命令中的this time的值作为启动时间
运行启动命令前后分别加上时间戳,通过计算两个时间戳的差值做为启动时间
脚本如下:
import os
import time
import csv
class App:
def __init__(self):
self.package = 'com.xxx.xxx'
self.activity = '/.xxx.xxxActivity'
self.content = ''
self.start_time = None
def launch_app(self):
"启动app"
cmd = r'adb shell am start -W -n {package}{activity}'.format(package=self.package,
activity=self.activity)
self.content = os.popen(cmd).readlines()
def stop_app(self):
'停止app'
# cmd = r'adb shell am force-stop {}'.format(self.package) # 冷启动杀进程
cmd = r'adb shell input keyevent 3' #热启动返回
os.popen(cmd)
def get_launch_time(self):
"得到启动时间"
for i in self.content:
if i.startswith('ThisTime'):
self.start_time = i.split(':')[1].strip()
break
return self.start_time
class Controller:
def __init__(self, count):
self.app = App()
self.count = count
self.data = [('timestramp', 'start_time')]
def test_process(self):
"单次运行"
self.app.launch_app()
time.sleep(5)
starttime, ctime = self.app.get_launch_time(), time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
self.app.stop_app()
time.sleep(3)
self.data.append((ctime, starttime))
def run(self):
"执行入口"
for i in range(self.count):
self.test_process()
self.save_date()
def save_date(self):
"保存数据"
csvfile = open('start_time1.csv', 'w')
writer = csv.writer(csvfile)
writer.writerows(self.data)
csvfile.close()
if __name__ == '__main__':
p = Controller(10)
p.run()
cpu
获取cpu数据命令
adb shell dumpsys cpuinfo | findstr "packagename TOTAL"
30% 14862/com.xxx.xxx: 29% user + 0.7% kernel / faults: 4976 minor
4.5% TOTAL: 4.1% user + 0.4% kernel + 0% softirq
这里表示:当前cpu的总占用为4.5%, com.xxx.xxx的cpu占用为4.5% * 30%
流量
获取流量数据
获取app的pid
adb shell ps | findstr com.xxx.ordersystem
USER PID PPID VSIZE RSS WCHAN PC NAME
u0_a592 24393 360 2291360 174244 ffffffff 00000000 S com.xxx.ordersystem
24393为应用的PID
获取流量数据命令
adb shell cat /proc/PID/net/dev
adb shell cat /proc/24393/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packe
ts errs drop fifo colls carrier compressed
ifb0: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
ccmni1: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
lo: 20395732 183421 0 0 0 0 0 0 20395732 183
421 0 0 0 0 0 0
tunl0: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
ccmni0: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
sit0: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
wlan0: 1230072037 4221335 0 236 0 0 0 0 45807333 5
91022 971 0 0 0 0 0
ifb1: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
ccmni2: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
ip6tnl0: 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
p2p0: 0 0 0 0 0 0 0 0 168
2 0 0 0 0 0 0
wlan0中的Receive和transmit之和为当前流量数据,运行app一段时间后再次获取流量数据,计算差值即可得到当前时间段内的流量消耗值
电量
获取电量数据
切换非充电状态
adb shell dumpsys battery set status 1
status 2为充电状态,非2即为非充电状态
获取电量信息
adb shell dumpsys battery
Current Battery Service state:
(UPDATES STOPPED -- use 'reset' to restart)
AC powered: false
USB powered: true
Wireless powered: false
status: 1
health: 2
present: true
level: 32
scale: 100
voltage: 3819
temperature: 218
technology: Li-poly
level值为电量信息
内存
获取内存数据
adb shell top | findstr package
adb shell top -d 1 | findstr com.xxx.xxx # -d 刷新间隔时间 1s
PID PR CPU% S #THR VSS RSS PCY UID Name
14862 5 5% S 56 2404772K 176380K tv u0_a149 com.xxx.xxx
14862 5 4% S 56 2404772K 166136K tv u0_a149 com.xxx.xxx
VSS - Virtual Set Size 虚拟耗用内存,单个进程全部可访问的地址空间
RSS - Resident Set Size 实际使用物理内存,单个进程实际占用的内存大小
关注这两个值变化即可
FPS和过度渲染
FPS 是每秒传输的帧数,每秒传输的帧数越多,则画面看起来越流畅,一般定义60帧/s为流畅,即每帧执行时间为16ms,每帧执行时间大于16ms即为卡顿
设置-开发者选项-GPU呈现模式分析-在屏幕上显示为条形图
打开应用app会看到有一条绿线,为FPS基准值,即16ms,每个柱形条为每一帧的绘图耗时,高于绿线即表示这一帧执行时间大于16ms,低于绿线表示这一帧绘图耗时小于16ms,当有大部分柱形图高于路线时,表示出现了卡顿
使用命令获取fps信息
adb shell dumpsys gfxinfo 'com.xxx.ordersystem' > fps.txt
查看fps.txt下的Profile data in ms中的数据,将其放到excel中使用柱状图查看
fps.png
过度渲染描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次
设置-调试GPU过度绘制-显示过度绘制区域
打开应用app,会看到页面出现不同的颜色,颜色越深表示当前位置层数过度,可能存在过度绘制
android app 测试方法,Android App常用性能指标测试方法相关推荐
- android app crash测试,APP常见崩溃原因和测试方法整理
测试过APP的人都应该发现,app崩溃是一类非常常见的问题,很多时候还是致命性的,这就要求我们测试人员要尽最大可能去找出软件当中的缺陷,减少app崩溃出现的概率,这里我将收集到的关于针对APP崩溃测试 ...
- Android (VTS) 的概念、作用及测试方法
转载自:[http://blog.csdn.net/qidi_huang/article/details/76653677] Android Vendor Test Suite (VTS) 的概念.作 ...
- APP测试内容 -- 流量测试常见测试方法
APP测试内容 -- 流量测试常见测试方法 大部分摘自:https://blog.csdn.net/baidu_21833433/article/details/63255182#commentBox ...
- Android Material Design TabLayout属性app:tabMode和app: tabGravity
Android Material Design TabLayout属性app:tabMode和app: tabGravity Android Material Design 中的TabLayout有两 ...
- android重复拉起app首页_Android进程管理:Framework层概念
前情回顾 RickAi,公众号:安卓尖端技术研究Android进程管理:从Kernel到LowMemoryKiller 上一篇文章从Native角度讲解了Android进程管理的相关概念,本文将继续从 ...
- java安卓app开发教程_[Android教程] Cordova开发App入门(一)创建android项目
前言 Apache Cordova是一个开源的移动开发框架.允许使用标准的web技术-HTML5,CSS3和JavaScript做跨平台开发. 应用在每个平台的具体执行被封装了起来,并依靠符合标准的A ...
- Android 组件化开源 app -开眼短视频(OpenEyes)
Android-MvvmComponent-App 项目地址:darryrzhong/Android-MvvmComponent-App 简介: Android 组件化开源 app -开眼短视频(O ...
- android获取其他app布局,Android Studio查看其它APP的布局结构
概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 (2)运行Android Studio,打开 ...
- Unity程序在VR一体机(Android)上卡死(闪退)后怎么办?——用adb查看android上某Unity app的debug信息
一.之前面临的困境 Unity的程序build到android一体机后,仿佛进入了一个黑箱子,你既看不到脚本的debug报错信息,也看不到任务管理器里的内存和CPU使用情况?如果黑屏.闪屏.花屏怎么办 ...
最新文章
- 网络流Dinic cur当前弧优化
- mysql一对多前端实现_MySQL实现一对多查询的代码示例
- MyBatis 实际使用案例-mappers
- [置顶] ibatis做分页
- Flume 1.7 源码分析(一)源码编译
- ROS——不同版本间ROS进行通信
- HTML div 滚动条样式设计
- Modularity(模块化-UMD通用模式)
- 云上自动化 vs 云上编排
- 类继承和初始化类的执行顺序
- Dart的数据库操作
- 遵义微红科技社群直播分销系统精选最具市场营销的功能点
- 用 Python 创建属于自己的网易云音乐
- 【手写汉字识别】基于深度学习的脱机手写汉字识别技术研究
- 一个女大学生骂她男朋友的话,厉害,没一个脏字
- Beam Search与Prefix Beam Search的理解与python实现
- O_DIRECT打开文件失败
- 智能CAN总线隔离中继器
- H.264学习网站及资源(不定时更新)
- UDP的epoll并发框架-UDP Listener解决OpenUOM的并发问题
热门文章
- mysql 修改字段为unqu_Quelqu'un m'a dit_群星_高音质在线试听_Quelqu'un m'a dit歌词|歌曲下载_酷狗音乐...
- 表单类型 多媒体与css3初始
- 手机html特效菊花的彩铅画,小菊花彩铅画步骤_适合新手临摹的彩铅画菊花
- 2022年第十三届蓝桥杯大赛湖南中医药大学第2场选拔赛(部分总结)
- 微信小程序改变手机电量,头部通知的颜色
- javaScript 时间 向上取整
- HTTP协议中的长连接和短连接(keep-alive状态)
- Linux查看磁盘槽位
- Twemproxy简介
- 网站关键词排名下降怎么办?