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 相关文章推荐
sqlalchemy对象转dict的示例
Apr 22 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
浅谈Python Opencv中gamma变换的使用详解
Apr 02 Python
Django如何防止定时任务并发浅析
May 14 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
Jul 09 Python
python3使用GUI统计代码量
Sep 18 Python
Python OpenCV读取中文路径图像的方法
Jul 02 Python
Python3如何使用多线程升程序运行速度
Aug 11 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
Python使用scapy模块发包收包
May 07 Python
pytorch中Schedule与warmup_steps的用法说明
May 24 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP批量获取网页中所有固定种子链接的方法
2016/11/18 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
js querySelector() 使用方法
2016/12/21 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
js闭包学习心得总结
2018/04/17 Javascript
vue.js 双层嵌套for遍历的方法详解, 类似php foreach()
2018/09/07 Javascript
JavaScript中ES6规范中let和const的用法和区别
2020/08/06 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
python格式化字符串实例总结
2014/09/28 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
CSS3 渐变(Gradients)之CSS3 径向渐变
2016/07/08 HTML / CSS
服装公司总经理岗位职责
2013/11/30 职场文书
运动会入场词60字
2014/02/15 职场文书
党员公开承诺书
2014/03/25 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
值班管理制度范本
2015/08/06 职场文书
养成教育工作总结
2015/08/13 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书
python文件与路径操作神器 pathlib
2022/04/01 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA
SQLServer常见数学函数梳理总结
2022/08/05 MySQL