背景
  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、查看单个应用的内存占有量的情况,通常用如下手段查看