背景
Android客户端性能测试部分,通常是指客户端的安卓应用层面的性能测试,这里的关注点为应用的性能测试。
应用的性能测试通常包括多种测试,如:内存,cpu,GPU,耗电量,流量,启动时间等等,对于应用的性能测试,如启动时间,内存,cpu等测试通常是通过使用外部提供的第三方工具来辅助测试,如腾讯的GT,安测试等工具,这些工具都是通过基于调用android底层的一些api来获取测试所用的值;当然,也可以使用android自身提供的一套adb指令完成上述测试。而GPU,耗电量,流量等测试,用第三方工具进行测试获得数据就不那么准确了,通过会利用硬件工具来完成相关测试,下面对Android客户端app的几种内存测试方式进行简单整理。
性能测试之内存测试
内存测试主要是为了检测被测试应用在进行正常使用情况下,该应用消耗手机内存的情况,如果内存消耗过大就造成手机使用卡顿等现象,进而影响用户体验,甚至会影响日活数据和用户留存等情况。因此,通常情况下,移动端应用内存占用大小也是产品一个比较重要的关注点和测试重点。为了保证应用不占用过多的系统资源,且能够及时释放内存,保证整个系统的稳定性,关于内存测试需要引入几种概念:
1、 空闲状态:指打开应用后,点击home键让应用后台运行,此时应用处于的状态叫做空闲
2、 中等规格:对应用的操作时间的间隔长短不一,中等规格时间较长
3、 满规格:对应用的操作时间的间隔长短不一,满规格时间较短
测试时,可根据用户的操作习惯进而设置应用使用等级设置。下面是对几种内存测试方法进行整理,可根据不同的测试场景和需求,选择对应测试方案以便获取相对准确的内存数据。
目前存在的android的内存测试方法可以分为以下几类:
1、 使用Android自身提供的 ActivityManager.MemoryInfo() 方法获得,通过该方法获取某应用的内存信息。目前网易Emmagee,腾讯的GT等工具都是通过该方法实现某应用内存数据的获取,测试简单方便,安装app以后选中对应的应用即可开始测试,完成测试后即可在本地sd卡中保持一份性能测试的数据,可从里面获取内存信息。
2、 使用android提供adb指令集获取内存信息即adb shell dumpsys meminfo | grep packagename or pid 来获取
2.1、dumpsys获取内存数据
指令:adb shell dumpsys meminfo
通过上述指令可以查看所有应用的内存消耗情况
如果想查看某一应用或某一个进程的详细的内存信息,可用如下指令:
指令:adb shell dumpsys meminfo packagename or pid
从上面的Heap size类别中包含Native Heap和Dalvik Heap两部分Heap,其中dalvik就是平时说的java堆,我们创建的对象都在这里分配的。其中,dalvik heap不能超过最大限制,超过最大限制就会出现OOM;
2.2、查看单个应用程序最大内存限制的指令:
adb shell getprop | grep or findstr heapgrowthlimit
上述查看到的单个内存最大限制为128MB,而meminfo里面dalvik heap size的最大值如果超过了128M就可能出现OOM。dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvik heap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后,如果应用的dalvik heap 达到heapsize的时候才会出现OOM!另:设备不一样,最大内存的限制也可能不一样
C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中。这是因为Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定),可以通过adb shell getprop | grep dalvik.vm.heapgrowthlimit查看此值。
也就是说,程序发生OMM并不表示RAM不足,而是因为程序申请的java heap对象超过了dalvik vm heapgrowthlimit。也就是说,在RAM充足的情况下,也可能发生OOM
2.3、查看单个应用的内存占有量的情况,通常用如下手段查看
3、 使用android 提供的procrank获取即可
通过指令:adb shell procrank | grep packagename
通过adb shell procrank指令可以获取VSS,RSS,USS,PSS
VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
其中USS只能通过procrank获取,首先网上下载libpagemap.so, procmem, procrank,然后push到android手机中。有的root机自带这几个文件,不需要额外下载。
4、 通过ADT插件DDMS查看用内存MAT进行分析
利用DDMS的Heap可以很方便的查看app的内存占用情况,在app运行时,打开DDMS选项,在Devices下,可以看到正在运行的App,选择要查看内存的App,点击该条目,并选择Update Heap,如下图:
在Heap职工,选择Cause GC,可以查看应用的占用情况,具体如下图: