Android性能测试——应用内存测试
一、通过top获取内存值,生成内存趋势
1.如何获取内存的值,可以参考本人之前写的文章https://blog.csdn.net/zly_ir/article/details/105707618
2.在了解如何获取内存值得基础上,我们可以在测试应用的过程中,全程记录应用的内存使用情况,写入文件中,如使用如下指令:
#1秒输出一次top使用情况,输出使用量排名前5的应用的情况
adb shell top -d 1 > D:\DailyWork\top.log
如在测试过程中,记录的top文件内容结果如下
可以将需要的内容用脚本处理出来,比如,抽取出com.android.systemui的cpu和RSS使用量,以python脚本为例:
def process_log(self):
"""
处理输入的日志
:return: 是否处理成功
"""
try:
process_name = 'com.android.systemui'
with open('D:/DailyWork/top.log', 'r+', encoding='utf-8', errors='ignore') as f:
file_director = 'D:/DailyWork/result/'
if not os.path.isdir(file_director):
os.makedirs(file_director)
try:
f_memory = open(file_director + '/' + process_name + '.mem.txt', 'w+')
f_cpu = open(file_director + '/' + process_name + '.cpu.txt', 'w+')
# 控制应用的
system_mem_cpu_line_number = 0
process_mem_cpu_line_number = 0
# 按行读文件,遇到相应应用的信息,则进行处理
for line in f.readlines():
if ('User' in line) and ('System' in line):
system_mem_cpu_line_number = system_mem_cpu_line_number + 1
if process_name in line:
process_mem_cpu_line_number = process_mem_cpu_line_number + 1
while process_mem_cpu_line_number < system_mem_cpu_line_number:
process_mem_cpu_line_number = process_mem_cpu_line_number + 1
f_cpu.write('0\n')
f_memory.write('0\n')
tmp = line.split()
f_cpu.write(self.replace_str(tmp[2]) + '\n') # cpu值的位置可以自行确定,不一定是第二列
f_memory.write(self.replace_str(tmp[6]) + '\n')
# 如果进程从未启动,也写入0值至文件夹
while process_mem_cpu_line_number < system_mem_cpu_line_number:
process_mem_cpu_line_number = process_mem_cpu_line_number + 1
f_cpu.write('0\n')
f_memory.write('0\n')
f_memory.flush()
f_memory.close()
f_cpu.flush()
f_cpu.close()
except IOError as err:
print("File write error:" + str(err))
return False
except IOError as err:
print('File read error:' + str(err))
return False
return True
处理后得到内存的值如下:
得到值就可以自己放excel里生成趋势图,观察内存使用情况,或者使用python脚本生成趋势图
import matplotlib
# 画折线图
def draw_line_img(xlabel, ylabel, xticks, y_tuple_list, img_path, figure_size):
plot.figure(figsize=figure_size, frameon=False)
plot.xlabel(xlabel)
plot.ylabel(ylabel)
for label, y_list, line_color in y_tuple_list:
plot.plot(tuple(range(len(xticks))), y_list, line_color, label=label)
plot.legend(fontsize=10)
plot.margins(0.08)
plot.savefig(img_path)
plot.close()
x_mem = []
y_mem = []
with open('D:/DailyWork/result/com.android.systemui.mem.txt', 'r+', encoding='utf-8', errors='ignore') as f:
x_index = 0
for line in f.readlines():
x_index = x_index + 1
x_mem.append(x_index)
y_mem.append(float(line) / 1024) # 转换成MB
draw_line_img(u'时间轴', u'Mem使用情况(MB)', x_mem, [("MEM", y_mem, 'lightskyblue')], "D:/DailyWork/result/mem_line.png", (15, 5))
生成的折线图如下:
从折线图中可以初步断定是否有明显的内存泄露发生。
对于疑似的内存泄露,可以使用leakCanary进行检测,关于leakCanary的使用,会在后续的文章进行介绍。
二、通过Android Studio的Android Profiler获取实时内存值
实时的内存和cpu测试,可以通过Android Studio工具获取实时的内存使用情况。
打开Android Studio,在导航栏找到view,然后找到Android Profiler即可打开。设备连接上电脑后即可开始获取实时的内存使用情况。
关于Android Profiler的使用,参考Android studio 开发文档: https://developer.android.com/studio/profile/memory-profiler