Android 应用性能测试——内存篇

android studio 下载 | 2018-11-23 19:00

【一、前言】

之前小编在Android应用的性能测试学习过程中没有系统的整理和总结,项目版本迭代,让小编觉得,性能测试与优化知识整理的必要性。因工作接触的性能测试有限,谨以此篇抛砖引玉,希望能给大家一些微薄的帮助。

【二、测试流程】

1 、测试场景

通常有两类,一类是当前有新开发或者改动的某项功能,需要对该功能进行性能测试;另一类是整体性能,考察应用的常见场景,在综合使用情况下的性能指标。

在各类场景中,经常作为测试重点的有:

(1).   包含了图片显示的界面;

(2).   网络传输大量数据;

(3).   需要缓存数据的场景。

2、场景转换成用例

选取了测试场景后,用例设计也要考虑内存测试的特点,一些常见的方式是:

(1).   结合场景比较操作前后或者不同版本的内存变化;

(2).   显示多张图片的前台进程;

(3).   多个场景来回切换;

(4).   长时间运行进程的内存增长。

3 、执行

由于GC和广播机制的存在,应用内存通常都在不停的波动,执行时需要考虑到这种情况。在采集数据的时候,需要多次采集并计算平均值。

【三、测试方法】

1、dumpsys meminfo <package name | pid> 命令

Android里最常用于观察进程内存的方法就是dumpsys meminfo <package name | pid> 命令。

Android程序内存被分为2部分:Native和Dalvik,Dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的,而bitmap是直接在Native上分配的,对于内存的限制是Native+ Dalvik不能超过最大限制,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。很多数时候,发生OOM都是在做一些跟图片相关的操作。

左边Pss列的数据标识进程各部分对真实物理内存的消耗,左下角的TOTAL值就是我们在各种管理工具里面看到的应用内存消耗。而Android Studio等工具里显示的内存值,在这里是Dalvik Heap Alloc部分。Size是需要的内存,而Alloc是分配了的内存。

内存的主要组成索引

(1).   Native Heap:Native代码分配的内存,虚拟机和Android框架本身也会分配;

(2).   Dalvik Heap:Java代码分配的对象;

(3).   Dalvik Other:类的数据结构和索引;

(4).   so mmap:Native代码和常量;

(5).   dex mmap:Java代码和常量;(dex mmap在Android应用中的作用是映射classes.dex文件)

2、adb shell top命令

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)

PSS - Proportional SetSize 实际使用的物理内存(比例分配共享库占用的内存)

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

一般来说内存占用大小有如下规律:VSS >= RSS >= PSS>= USS

3、共享内存机制

Android系统是基于Linux内核的,因此底层的内存分配和共享机制与Linux基本先相同。一个运行的Android应用进程会包含以下几个部分:

Dalvik虚拟机代码(共享内存);

应用框架的代码(共享内存);

应用框架的资源(共享内存);

应用框架的so库(共享内存);

应用的代码(私有内存);

应用的资源(私有内存);

应用的so库(私有内存);

堆内存,其他部分(共有/私有);

Dalvik Pss 内存=私有内存Private Dirty +(共享内存Shared Dirty/共享的进程数)

4、多进程应用

Pss标识进程实际使用的物理内存,是由私有内存加上按比例分担计算的各进程共享内存得到的值。如果系统中所有进程的Pss相加,所得和即为系统占用内存的总和。但要注意,进程的Pss并不代表进程结束后系统能够回收的内存大小。

当一个进程结束后,他所占用的共享库内存将会被其他仍然使用该共享内存库的进程所分担,共享库消耗的物理内存并不会减少。对于多进程应用来说,由多个进程之间会共享很多内容,包括代码、资源、so库等。我们在统计多进程的应用内存和进行优化时,需要综合考虑。

5、内存工具(总结)

(1).   Android Studio/Memory Monitor:观察Dalvik内存;

(2).   dumpsys meminfo:观察整体内存;

(3).   smaps:观察整体内存的详细组成;

(4).   Eclipse Memory Analyzer:详细分析Dalvik内存;

【四、测试应用】

测试场景:导航场景下性能(cpu、内存指标)(某距离级别);

测试版本:N、N+1;

选择机型:华为mate9 系统Android 7.0 内存4G

其他条件:

a)  无离线地图、导航包;

b)  无缓存;(每次数据记录都是清除缓存,清除本地目录文件)

c)  其他外界应用,全部一致;

本次数据分析结论(测试M次的数据均值):

内存占用均值(M)

a)  N+1版本较N版本,cpu占用****;

b)  N+1版本较N版本,内存占用****;

开始导航时,利用top命令,开始记录com.sogou.**.***.***应用性能数据,记录时间、间隔相同;

绘制数据曲线