Python获取android设备cpu和内存占用情况


Posted in Python onNovember 15, 2020

功能:获取android设备中某一个app的cpu和内存

环境:python和adb

使用方法:使用adb连接android设备,打开将要测试的app,执行cpu/内存代码

cpu获取代码如下:(输入参数为脚本执行时间)

# coding:utf-8
'''
获取系统total cpu
'''
import os, csv
import time
import csv
import numpy as np
from matplotlib import pyplot as plt

cpu_list = []
time_list = []
app_list = []
lines = []
package_name = []


# 读取进程名称(包名)
def get_applist():
  global package_name
  with open('config/director.txt', encoding='utf-8', mode='r') as f:
    lines_all = f.readlines()
    for appname in lines_all:
      package_name1 = appname
      appname_new = appname[0:15]
      package_name.append(package_name1)
      lines.append(appname_new)
    for line in lines:
      app_list.append(line.strip())


# 获取cpu数值
def get_cpu():
  global filename
  with open(filename, encoding="utf-8", mode="r") as f:
    lines = f.readlines()
    for appname in app_list:
      for lis in lines:
        # 适配低版本手机
        if appname in lis and '%' in lis:
          now = time.strftime("%H:%M:%S", time.localtime())
          time_list.append(now)
          cpu_1 = lis.split('%')[0]
          cpu_2 = cpu_1.split(' ')
          # print(cpu_2)
          cpu = cpu_2[len(cpu_2) - 1]
          print(cpu, now)
          cpu_list.append(cpu)
          break
        # 适配高版本手机
        elif appname in lis:
          now = time.strftime("%H:%M:%S", time.localtime())
          time_list.append(now)
          cpu1 = lis.split(' ')
          # print(cpu1)
          cpu2 = list(set(cpu1))
          cpu2.sort(key=cpu1.index)
          cpu_h = cpu2[len(cpu2) - 4]
          print(cpu_h, now)
          cpu_list.append(cpu_h)
          break
        else:
          pass


# csv头部
def write_head():
  headers = ['name:']
  headers.append(app_list[0])
  headers.append('init_cpu')
  with open('log_su/cpuinfo.csv', 'w+', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=headers)
    writer.writeheader()


# 将数值写入csv,用于绘图时读取
def write_report():
  # headers = ['name', 'aaa', 'init_cpu']
  with open('log_su/cpuinfo.csv', 'a+', newline='') as csvfile:
    writer = csv.writer(csvfile)
    for key in cpu_list:
      writer.writerow([' ', ' ', key])


# 绘制折线图,生成测试报告
def mapping():
  filename = 'log_su/cpuinfo.csv'
  with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    highs = []
    for row in reader:
      high = row[2]
      highs.append(high)
    # print(highs)

  wights = time_list
  highs_float = list(map(float, highs))
  # print(f"****{highs}")
  print(f"CPU值:{highs_float}")
  # 输出平均值
  total = 0
  for value in highs_float:
    total += value
  average = round(total/len(highs_float), 2)
  print(f"CPU平均值:{average}")

  #输出最低值和最高值
  highs_hl = sorted(highs_float)
  print(f"CPU最低值:{highs_hl[0]}")
  print(f"CPU最高值:{highs_hl[len(highs_hl)-1]}")

  # 根据数据绘制图形
  plt.figure(figsize=(11, 4), dpi=600)
  # 生成网格
  # plt.grid()
  plt.grid(axis="y")
  # 折线图
  if package_name[0] == 'com.oneapp.max.security.pro.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="PPP")
  elif package_name[0] == 'com.oneapp.max.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Opt1.6.1")
  elif package_name[0] == 'com.boost.clean.coin.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Fastclear")
  elif package_name[0] == 'com.walk.sports.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Walk")
  elif package_name[0] == 'com.diamond.coin.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Amber")
  elif package_name[0] == 'com.oneapp.max.cleaner.booster.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Space")
  else:
    plt.plot(wights, highs_float, "c-", linewidth=1, label=package_name[0])
  # 坐标轴范围
  # plt.ylim(300, 400)
  # plt.xlim(0, 10)

  plt.xlabel('time(H:Min:S)', fontsize=16)
  plt.ylabel("cpu_realtime(%)", fontsize=16)
  plt.title("cpu real time line chart", fontsize=24)
  plt.legend()

  # 横坐标显示间隔
  if len(wights) <= 15:
    pass
  else:
    t = int(len(wights) / 15)
    plt.xticks(range(0, len(wights), t))

  # 纵坐标显示间隔
  # plt.yticks(range(100, 300, 10))

  # 旋转日期
  plt.gcf().autofmt_xdate()

  # 展示每个坐标
  # for a, b in zip(wights, highs_float):
  #   plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=8)

  # plt.show()

  time_now = time.strftime("%m%d-%H:%M:%S", time.localtime())
  path = "report/" + time_now
  plt.savefig(path)


# 自动识别当前需检测的
def name_app():
  cmd = 'adb shell dumpsys window | grep mCurrentFocus > log_su/name_info.csv'
  os.system(cmd)
  with open('log_su/name_info.csv', encoding='utf-8', mode='r') as f:
    lines = f.readlines()
    for line in lines:
      if 'mCurrentFocus' in line:
        name1 = line.split('/')[0].split(' ')
        name = name1[len(name1) - 1]

  with open('config/director.txt', encoding='utf-8', mode='w') as f_name:
    text = name
    f_name.write(text)
  print(f"将要监测的包名为:{text}")

#控制监测时间
def time_control():
  global filename
  while True:
    end_time = time.time()
    if (end_time - start_time)/60 >= tol_time:  #分钟
    # if end_time - start_time >= tol_time: # 秒
      break

    time.sleep(1)
    adb = "adb shell top -n 1 > log_su/adb_info.csv"
    d = os.system(adb)
    filename = "log_su/adb_info.csv"
    get_cpu()


if __name__ == "__main__":
  name_app()
  tol_time = int(input("请输入脚本执行时间(分钟):"))
  start_time = time.time()
  get_applist()
  write_head()
  time_control()
  write_report()
  mapping()

会在.py文件同级目录下生成3个文件夹,config、log_su、report,其中运行结果在report中

结果以是生成折线图,看起来直观,如下:

Python获取android设备cpu和内存占用情况

这里我解释下,cpu占比是adb获取的实时占比,但是满值并不一定是100%,比如这张图,用的是一个八核的手机,所以CPU满值是800%

内存获取代码如下:(输入参数为脚本执行时间)

# coding:utf-8
'''
获取系统total memory
'''
import os, csv
import time
import csv
import numpy as np
from matplotlib import pyplot as plt

mem_dict = {}
time_list = []
app_list = []
package_name = []
t = 0
def get_applist():
  global package_name
  with open('config/director.txt', encoding='utf-8', mode='r') as f:
    lines = f.readlines()
    for line in lines:
      package_name1 = line
      package_name.append(package_name1)
      app_list.append(line.strip())


def get_mem():
  global filename
  with open(filename, encoding="utf-8", mode="r") as f:
    lines = f.readlines()
    start_flag = False
    for appname in app_list:
      for line in lines:
        if "Total PSS by OOM adjustment" in line:
          break
        if appname in line and 'pid' in line and 'kB' in line:
          mem_v = line.strip().split(':')[0].replace('kB', '').replace(',', '')
          line_name = line.split(':')[1].split('(')[0].strip()
          if line_name in appname:
            mem_v = round(float(mem_v) / 1024, 2)
            mem_dict[appname] = mem_v
            now_v = time.strftime("%H:%M:%S", time.localtime())
            # now_int = int(now_v)
            time_list.append(now_v)
            print(mem_v, now_v)
            break
        elif appname in line and 'pid' in line and 'K' in line:
          mem_v = line.strip().split(':')[0].replace('K', '').replace(',', '')
          line_name = line.split(':')[1].split('(')[0].strip()
          if line_name in appname:
            mem_v = round(float(mem_v) / 1024, 2)
            mem_dict[appname] = mem_v
            now_v = time.strftime("%H:%M:%S", time.localtime())
            # now_int = int(now_v)
            time_list.append(now_v)
            print(mem_v, now_v)
            break

def write_head():
  headers = ['name:']
  headers.append(app_list[0])
  headers.append('init_mem')
  with open('log_su/meminfo.csv', 'w+', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=headers)
    writer.writeheader()

def write_report():
  headers = ['name','aaa', 'init_mem']
  with open('log_su/meminfo.csv', 'a+', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=headers)
    for key in mem_dict:
      writer.writerow({'init_mem': mem_dict[key]})


def mapping():
  filename = 'log_su/meminfo.csv'
  with open(filename) as f:
    reader = csv.reader(f)
    header_row = next(reader)
    highs = []
    for row in reader:
      high = row[2]
      highs.append(high)
    # print(highs)

  wights = time_list
  highs_float = list(map(float, highs))

  print(f"内存值:{highs_float}")

  # 输出平均值
  total = 0
  for value in highs_float:
    total += value
  average = round(total / len(highs_float), 2)
  print(f"内存平均值:{average}")

  # 输出最低值和最高值
  highs_hl = sorted(highs_float)
  print(f"内存最低值:{highs_hl[0]}")
  print(f"内存最高值:{highs_hl[len(highs_hl) - 1]}")

  # 根据数据绘制图形

  plt.figure(figsize=(11, 4), dpi=600)

  # 生成网格
  # plt.grid()
  plt.grid(axis="y")

  if package_name[0] == 'com.oneapp.max.security.pro.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="PPP")
  elif package_name[0] == 'com.oneapp.max.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Opt")
  elif package_name[0] == 'com.boost.clean.coin.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="fastclear")
  elif package_name[0] == 'com.walk.sports.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Walk")
  elif package_name[0] == 'com.diamond.coin.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Amber")
  elif package_name[0] == 'com.oneapp.max.cleaner.booster.cn':
    plt.plot(wights, highs_float, "c-", linewidth=1, label="Space")
  else:
    plt.plot(wights, highs_float, "c-", linewidth=1, label=package_name[0])
  # 坐标轴范围
  # plt.ylim(300, 400)
  # plt.xlim(0, 10)

  plt.xlabel('time(H:Min:S)', fontsize=16)
  plt.ylabel("Number (Mb)", fontsize=16)
  plt.title("meminfo", fontsize=24)
  plt.legend()

  # 横坐标显示间隔
  if len(wights) <= 15:
    pass
  else:
    t = int(len(wights) / 15)
    plt.xticks(range(0, len(wights), t))

  # 坐标刻度
  # my_y_ticks = np.arange(300, 400, 10)
  # my_x_ticks = np.arange(1, 10, 1)
  # plt.xticks(my_x_ticks)
  # plt.yticks(my_y_ticks)
  # plt.yticks(range(100, 300, 10))

  #旋转日期
  plt.gcf().autofmt_xdate()

  # 展示每个坐标
  # for a, b in zip(wights, highs_float):
  #   plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=8)

  # plt.show()

  time_now = time.strftime("%m%d-%H:%M:%S", time.localtime())
  path = "report/" + time_now
  plt.savefig(path)

def name_app():
  cmd = 'adb shell dumpsys window | grep mCurrentFocus > log_su/name_info.csv'
  os.system(cmd)
  with open('log_su/name_info.csv', encoding='utf-8', mode='r') as f:
    lines = f.readlines()
    for line in lines:
      if 'mCurrentFocus' in line:
        name1 = line.split('/')[0].split(' ')
        name = name1[len(name1) - 1]

  with open('config/director.txt', encoding='utf-8', mode='w') as f_name:
    text = name
    f_name.write(text)
  print(f"将要监测的包名为:{text}")

def time_control():
  global filename
  while True:
    end_time = time.time()
    if (end_time - start_time)/60 >= tol_time:  #分钟
    # if end_time - start_time >= tol_time:  #秒
      break
    # time.sleep(2)
    # filename = str(input("请输入文件名:"))
    adb = "adb shell dumpsys meminfo > log_su/adb_info.csv"
    d = os.system(adb)
    filename = "log_su/adb_info.csv"
    get_mem()
    write_report()

if __name__ == "__main__":
  name_app()
  tol_time = int(input("请输入脚本执行时间(分钟):"))
  start_time = time.time()
  get_applist()
  write_head()
  time_control()
  mapping()

会在.py文件同级目录下生成3个文件夹,config、log_su、report,其中运行结果在report中

生成的内存结果图如下:

Python获取android设备cpu和内存占用情况

到此这篇关于Python获取android设备cpu和内存占用情况的文章就介绍到这了,更多相关Python获取android设备内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解python如何调用C/C++底层库与互相传值
Aug 10 Python
pandas 对series和dataframe进行排序的实例
Jun 09 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
Jun 11 Python
python对日志进行处理的实例代码
Oct 06 Python
python reverse反转部分数组的实例
Dec 13 Python
python实现微信自动回复机器人功能
Jul 11 Python
学Python 3的理由和必要性
Nov 19 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
Python通过socketserver处理多个链接
Mar 18 Python
Python基于字典实现switch case函数调用
Jul 22 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
Python制作春联的示例代码
Jan 22 Python
Python __slots__的使用方法
Nov 15 #Python
Python descriptor(描述符)的实现
Nov 15 #Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 #Python
彻底解决Python包下载慢问题
Nov 15 #Python
Python eval函数原理及用法解析
Nov 14 #Python
Django怎么在admin后台注册数据库表
Nov 14 #Python
通过实例解析python and和or使用方法
Nov 14 #Python
You might like
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
jquery插件jbox使用iframe关闭问题
2009/02/09 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
JavaScript实现二维坐标点排序效果
2017/07/18 Javascript
浅谈pc端rem字体设置的问题
2017/08/03 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
python实现杨氏矩阵查找
2019/03/02 Python
python实现TCP文件传输
2020/03/20 Python
如何使用Pytorch搭建模型
2020/10/26 Python
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
领导调研接待方案
2014/02/27 职场文书
幼儿园秋游感想
2014/03/12 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
英语教学课后反思
2016/02/15 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
详解Python中的进程和线程
2021/06/23 Python
JavaScript的function函数详细介绍
2021/11/20 Javascript
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL