Android客户端性能测试——内存

发表于:2018-4-12 16:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:李子园的梦想    来源:51testing软件测试网采编

分享:
  前言:
  1.该内容为APP应用客户端的性能测试,未涉及后台,所以并非针对API或数据接口
  2.测试的目标项:资源消耗、内存泄露、电量功耗、响应时间
  3.客户端的性能指标:内存、CPU、流量
  4.本系列主要是讲述 如何获取安卓APP应用的性能指标,并简单分析,定位问题
  一、查看 内存 指标:
  准备工作:
  (1).进入装有测试APP手机的 “开发人员选项” 并打开“USB调试模式”
  (2).使用数据线将手机设备与电脑设备连接,可装PP助手进行接入
  (3).手机打开待测APP,即打开进程
  1.命令行查看内存数据:
  (1).打开cmd
  (2). 获取设备列表:输入 adb devices(预先安装adb驱动、若报错,拔掉重新连接手机)
  (3).进入该设备的shell环境:输入:adb -s C7R6T16722004661 shell  (若只有一台设备,可直接 adb shell ,多台必须加设备序列号C7R6T16722004661)
  (4).查找进程:输入ps (模糊查找)    寻找对应待测应用包名,并记录下其的pid(进程ID):30017,
  若知道明确的包名,可直接准确查找 ps |grep com.hundsun.stockwinner.grzq

  (5).查询内存信息:
  可通过两种方式获取:
  a.通过 “ dumpsys meminfo  包名/pid ” 命令获取,输入:dumpsys meminfo 30017
  Pss Total :实际使用的物理内存
  private dirty:私有驻留内存
  Heap Size:    占用总内存(Heap  堆)(扩展:进程内存空间是虚拟内存,区分于物理内存,进程无法直接操作物理内存RAM。必要时,操作系统对其进行映射,使进程能应用到物理内存)
  Heap Alloc:   分配内存
  Heap Free:   空闲内存
  native process和java process占据内存的大小(扩展:c++申请的内存为native process,java申请的内存:java process)
  内存大小:native process:13004
                      dalvik process:10448
  注:因为Android系统对dalvik的vm heapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定)
  查看单个应用最大内存限制,输入命令:getprop|grep heapgrowthlimit  得到结果该机型为192M。dalvik process 超过就会抛OOM异常
  b.可直接通过:procrank 。
  手机中的sh是经过精简过的,有些手机可能没有 procrank 命令,可以使用genymotion模拟器,或是自己安装procrank命令。
  (我也没这个命令,没有装好,这部分内容未操作,为网络直接获取)
  VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)——是单个进程全部可访问的地址空间
  RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存)——单个进程实际占用的内存大小,不是精确描述
  PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)——对于系统中的整体内存使用是一个很好的描述
  USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)——单个进程的全部私有内存大小,亦即全部被该进程独占的内存大小。
  一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS。
  USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字
  2.代码获取内存数据:
  java调用Adb shell dumpsys meminfo再用字符串截取方式获取内存,可对其数据进行返回打印,实现监控。
  传入参数为:应用包名,这个不可变。
  [java] view plain copy
  package com.hss.performanceTest;  
  /** 
   * from hss 
   * data:2017/9/8 
   * project:getMemory 
   */  
  import java.io.BufferedReader;  
  import java.io.IOException;  
  import java.io.InputStreamReader;  
    
  public class getMemory {  
    
      public static String GetMemory(String packageName) throws IOException, InterruptedException {  
    
          String str3=null;  
            Runtime runtime = Runtime.getRuntime();  
            Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName);  
            try {  
    
                if (proc.waitFor() != 0) {  
                    System.err.println("exit value = " + proc.exitValue());  
                }  
                BufferedReader in = new BufferedReader(new InputStreamReader(  
                        proc.getInputStream()));  
                StringBuffer stringBuffer = new StringBuffer();  
                String line = null;  
                while ((line = in.readLine()) != null) {  
                    stringBuffer.append(line+" ");  
    
                }  
                String str1=stringBuffer.toString();  
                String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));       
                str3=str2.substring(0,10);  
                str3.trim();  
            } catch (InterruptedException e) {  
                System.err.println(e);  
            }finally{  
                try {  
                    proc.destroy();  
                } catch (Exception e2) {  
                }  
            }  
          return str3 ;  
      }  
      public static void main(String args[]) {  
            
          System.out.println("开始运行...");  
          try {  
              String resurt = getMemory.GetMemory("com.hundsun.stockwinner.sxzq");  
              System.out.println("山西证券的内存:"+resurt);  
          } catch (IOException e) {  
              // TODO Auto-generated catch block  
              e.printStackTrace();  
          } catch (InterruptedException e) {  
              // TODO Auto-generated catch block  
              e.printStackTrace();  
          }               
      }   
        
  }
  
  运行截图:


上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号