最近公司有针对应用的新老版本做启动时间的耗时对比。出于好奇研究了一下~
环境准备:
adb
模拟机
Python3
pycharm(没有要求)
具体步骤:
1.在cmd内输入adb命令 adb shell dumpsys window | findstr mCurrentFocus 获取待测应用的包名和主活动名
框出来的部分就是我们想要需要的包名和Activity
2.在cmd中分别输入下面这个几个命令,对应的是冷启动与热启动,会看到如下的结果:
有三种时间的显示,这里只关心TotalTime就可以了。
*TotalTime:表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用Activity pause的耗时
利用python脚本实现冷/热启动的时间
解决的思路
- 创建一个APP类,进行APP相关操作,其中包含冷/热启动APP,冷/热关闭APP,获取冷/热启动时间
- 创建一个Controller类,主要实现多次启动/关闭APP,获取时间戳
import os
import re
import time
class MobileQQTest(object):
def __init__(self, num):
self.data = []
self.num = num
self.app = 'com.ygkj.chelaile.standard'
self.activity = 'dev.xesam.chelaile.app.module.PanelHostActivity'
def check_devices(self):
'''检查设备是否连接成功,如果成功返回True,否则返回False'''
try:
deviceInfo = os.popen('adb devices').read()
if 'device' in deviceInfo.split('\n')[1]:
print('=' * 21, '已连接设备,开始测试', '=' * 21)
print(self.deviceInfo())
return True
else:
return False
except Exception as e:
print(e)
def deviceInfo(self):
'''获取设备基础信息(如:厂商、型号、系统版本)'''
deviceName = os.popen('adb shell getprop ro.product.model').read()
platformVersion = os.popen('adb shell getprop ro.build.version.release').read()
producer = os.popen('adb shell getprop ro.product.brand').read()
return "手机型号:%s %s,系统版本:Android %s" % (
producer.replace('\n', ''), deviceName.replace('\n', ''), platformVersion.replace('\n', ''))
def start_adb(self):
'''运行adb命令,并记录启动耗时'''
start = 'adb shell am start -W %s/%s' % (self.app, self.activity)
data = re.findall(r'.*ThisTime: (.*?)TotalTime:(.*?)WaitTime: (.*?)Complete',
os.popen(start).read().replace('\n', ''))
if len(data) == 0:
print("adb命令执行出错,数据为空")
else:
self.data.append(int(data[0][0]))
return data
def stop_adb(self):
'''结束程序运行'''
stop = 'adb shell am force-stop %s' % self.app
os.popen(stop)
def run_test_cold(self):
'''app 冷启动耗时测试'''
self.data.clear()
if self.check_devices() == True:
self.stop_adb()
for i in range(self.num):
print('=' * 20, '冷启动测试:第%d次运行' % (i + 1), '=' * 20)
self.stop_adb()
time.sleep(3)
test = self.start_adb()
print("ThisTime:%s,TotalTime:%s,WaitTime:%s" % (test[0][0], test[0][1], test[0][2]))
time.sleep(3)
self.stop_adb()
print ('\n冷启动%s次平均耗时为:%s' % (len(self.data), sum(self.data) / len(self.data)))
else:
print("未连接安卓设备,请连接设备(3秒后重试)")
while True:
time.sleep(3)
self.run_test_cold()
def run_test_hot(self):
'''app 热启动耗时测试'''
self.data.clear()
if self.check_devices() == True:
os.popen('adb shell am start -W %s/%s' % (self.app, self.activity))
time.sleep(3)
for i in range(self.num):
print('=' * 20, '热启动测试:第%d次运行' % (i + 1), '=' * 20)
os.popen('adb shell input keyevent 3')
time.sleep(3)
test = self.start_adb()
time.sleep(3)
print("ThisTime:%s,TotalTime:%s,WaitTime:%s" % (test[0][0], test[0][1], test[0][2]))
self.stop_adb()
print('\n热启动%s次平均耗时为:%s' % (len(self.data), sum(self.data) / len(self.data)))
else:
print("未连接安卓设备,请连接设备(3秒后重试)")
while True:
time.sleep(3)
self.run_test_hot()
if __name__ == '__main__':
apptest = MobileQQTest(5)
apptest.run_test_cold()
apptest.run_test_hot()
部分运行结果如图所示:
注:
MobileQQTest(5) 代表运行5次
最后取平均值
单位:毫秒