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

功能:获取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和内存占用情况

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容