使用python自动化测试,如何脚本监控android设备上指定app的cpu和内存呢?
最近正好自己用python写了一个小工具,获取android的一些性能指标,看是否能在做UI自动化的同时验证一下app的性能,封装了一些提取参数的方法仅供参考,里面包含了这几项,都是通过用adb命令来实现,下面说以下整个工具的运作流程。
相关库准备:
-
wx-----------------wxpython用来产生图形界面
-
gevent-------------线程
-
time---------------时间相关模块
-
re-----------------正则表达式操作
-
multiprocessing----多进程
-
os-----------------处理文件和目录
-
threading----------操作线程

第一步:获取设备和app的基础参数
1、检查设备是否存在
def get_devices(self):
devices = []
result = subprocess.Popen("adb devices", shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
if len(result) - 2 == 1:
for line in result[1:]:
devices.append(line.strip().decode())
return devices[0].split()[0]
else:
return 'No device found'
2、获取packagename
def getpackagename(self):
pattern = re.compile(r"[a-zA-Z0-9.]+/.[a-zA-Z0-9.]+")
package = subprocess.Popen("adb shell dumpsys activity | findstr mFocusedActivity", shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.read()
package = (str(package))
packagename = pattern.findall(package)[0].split('/')[0]
return packagename
3、获取activity
def getactivity(self):
pattern = re.compile(r"[a-zA-Z0-9.]+/.[a-zA-Z0-9.]+")
package = subprocess.Popen("adb shell dumpsys activity | findstr mFocusedActivity", shell=True stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.read()
package = (str(package))
activity = pattern.findall(package)[0].split('/')[1]
print(activity)
return activity
第二步:设置定时时间
设置定时时间,多长时间间隔获取一次数据,并将数据动态展示在图形界面,也可以将数据存在Excle或做出图形更直观(打算后期实现)
第三步:通过基础参数拼接获取其他信息
1、获取内存
mem_list = []
def mem(self):
cmd = 'adb -s ' + self.get_devices() + ' shell dumpsys meminfo ' + self.getpackagename()
men_s = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
for info in men_s:
if len(info.split()) > 0 and info.split()[0].decode() == "TOTAL":
self.mem_list.append((int(info.split()[1].decode()) // 1024))
men_list = str(info.split()[1].decode())
return self.mem_list
2、获取cpu
cpu_list = []
def getcpu(self):
cmd = 'adb -s ' + self.get_devices() + ' shell top -n 1| findstr ' + self.getpackagename()
top_info = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stdout.readlines()
if len(top_info) >= 1:
self.cpu_list.append(int(top_info[0].split()[2][0:-1]))
return self.cpu_list
3、获取电量
def get_battery(self):
battery_cmd = "adb shell dumpsys battery"
batterys = []
battery_s = subprocess.Popen(battery_cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
battery= (battery_s[7].split())[1].decode()
return battery
4、获取温度
def get_temperature(self):
battery_cmd = "adb shell dumpsys battery"
battery_s = subprocess.Popen(battery_cmd, shell=True,stdout=subprocess.PIPE,
stderr=subprocess.PIPE).stdout.readlines()
temperature = str((int((battery_s[10].split())[1].decode())) * 0.1)
return temperature
5、启动时间
def get_startime(self):
starttime_cmd = "adb shell am start -W -n XXXactivity"#XXXactivity可以从getactivity获取
times = []
starttime_s = subprocess.Popen(starttime_cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.PIPE).stdout.readlines()
if (starttime_s[1].split())[1].decode() == 'ok':
statrtime = (starttime_s[5].split())[1].decode()
return statrtime
else:
return '启动计时失败'
上面的部分python代码缩进格式可能会有问题,引用的时候需要注意,现在已实现了提取数据和在图形界面展示的部分,至于上面为什么会引入进程和线程多个模块,是因为这块还没有考虑好要怎么实现。