美文网首页
python系列:Android获取APP冷/热启动时间

python系列:Android获取APP冷/热启动时间

作者: work_zhangxt | 来源:发表于2020-04-22 16:41 被阅读0次

最近公司有针对应用的新老版本做启动时间的耗时对比。出于好奇研究了一下~
环境准备:
adb
模拟机
Python3
pycharm(没有要求)
具体步骤:
1.在cmd内输入adb命令 adb shell dumpsys window | findstr mCurrentFocus 获取待测应用的包名和主活动名


image.png

框出来的部分就是我们想要需要的包名和Activity
2.在cmd中分别输入下面这个几个命令,对应的是冷启动与热启动,会看到如下的结果:


image.png

有三种时间的显示,这里只关心TotalTime就可以了。
*TotalTime:表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用Activity pause的耗时
利用python脚本实现冷/热启动的时间
解决的思路

  1. 创建一个APP类,进行APP相关操作,其中包含冷/热启动APP,冷/热关闭APP,获取冷/热启动时间
  2. 创建一个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()

部分运行结果如图所示:

image.png

注:
MobileQQTest(5) 代表运行5次
最后取平均值
单位:毫秒

相关文章

网友评论

      本文标题:python系列:Android获取APP冷/热启动时间

      本文链接:https://www.haomeiwen.com/subject/cafwihtx.html