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批量提交沙箱问题实例
Oct 08 Python
Python中decorator使用实例
Apr 14 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
Python引用模块和查找模块路径
Mar 17 Python
Python进程间通信之共享内存详解
Oct 30 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python微医挂号网医生数据抓取
Jan 24 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
Pyecharts绘制全球流向图的示例代码
Jan 08 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
python+opencv实现车道线检测
Feb 19 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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
Terran兵种对照表
2020/03/14 星际争霸
1.PHP简介
2006/10/09 PHP
PHP面向对象中new self()与 new static()的区别浅析
2017/08/17 PHP
PHP工厂模式简单实现方法示例
2018/05/23 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
详解JavaScript函数
2015/12/01 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
vue如何判断dom的class
2018/04/26 Javascript
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
python实现在windows服务中新建进程的方法
2015/06/30 Python
python并发编程之多进程、多线程、异步和协程详解
2016/10/28 Python
简单谈谈Python中的闭包
2016/11/30 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
Python实现钉钉发送报警消息的方法
2019/02/20 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
个人生活学习自我评价范文
2013/11/26 职场文书
护士实习鉴定范文
2013/12/22 职场文书
化工专业大学生职业生涯规划书
2014/01/14 职场文书
《夜晚的实验》教学反思
2014/02/19 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
先进集体申报材料
2014/12/25 职场文书
布达拉宫导游词
2015/02/02 职场文书
诚信考试主题班会
2015/08/17 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
Spring中的@Transactional的工作原理
2022/06/05 Java/Android