最近正好自己用python写了一个小工具,获取android的一些性能指标,看是否能在做UI自动化的同时验证一下app的性能,封装了一些提取参数的方法仅供参考,里面包含了这几项,都是通过用adb命令来实现,下面说以下整个工具的运作流程。

相关库准备:

  1. wx-----------------wxpython用来产生图形界面

  2. gevent-------------线程

  3. time---------------时间相关模块

  4. re-----------------正则表达式操作

  5. multiprocessing----多进程

  6. os-----------------处理文件和目录

  7. threading----------操作线程

如何脚本监控android设备上指定app的cpu和内存

第一步:获取设备和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 '启动计时失败'

如何脚本监控android设备上指定app的cpu和内存

上面的部分python代码缩进格式可能会有问题,引用的时候需要注意,现在已实现了提取数据和在图形界面展示的部分,至于上面为什么会引入进程和线程多个模块,是因为这块还没有考虑好要怎么实现。