51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 2028|回复: 5
打印 上一主题 下一主题

[转贴] Android 性能测试实践 (一)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-22 11:04:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前言:
前段时间花了两周的时间做了一个基于Android 客户端的性能测试现在分享给大家,希望对大家有所帮助!
Look-Look
1,既然是基于Android客户端的性能测试那就与后台的一些API、数据接口要区分开来~!
2,Android的性能测试能其实包括很多很多的测试项比如:资源消耗,内存泄露,电量功耗,启动耗时,渲染等等....
怎么去做?
1,采集数据 :采集的数据包括:内存、cpu、电量功耗、hprof(内存泄露分析文件)、响应时间等等。。。。
2,设计场景 :搞定数据的采集后配合一些固定的场景来收集一些数据(最好多取几次而且每次配合不同的设备看平均值)作为最后的对比分析
3,结果分析 :拿到数据后分析哪些模块的数据异常再去Check code定位问题的原因
好吧下面慢慢跟大家详细的说吧!
先写下内存篇
内存的采集:
Android的内存的采集这边介绍三种方式:
1,通过Dumpsys 来取值
adb shell dumpsys meminfo
这里可以看到当前所有进程的内存信息!
如果你要看详细的内存:
adb shell  dumpsys  meminfo  pakagename or Pid
看其中的Size 可以发现 Native Heap  和Dalvik Heap 占据了Heap Size
dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的。
对于内存的限制 这里纠正一下:是 dalvik heap不能超过最大限制,跟Native heap没有关系!
最大限制查看:
#查看单个应用程序最大内存限制 adb shell getprop|grep heapgrowthlimit得到结果:
|[dalvik.vm.heapgrowthlimit]: [96m]这个96M是单个程序限制最大内存,而meminfo 里面的dalvik  heap size 的最大值若果超出了96m 那就很可能会发生OOM
dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvik heap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后应用dalvik heap 达到heapsize的时候才会出现OOM!
注:设备的不一样 最大内存限制也可能不一样
现在大多数手机 的android程序内存一般限制在96M以上甚至更高,也可能更低。
3,用/system/xbin/procrank工具 来取值很直观
adb shell procrank
VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
USS 是针对某个进程开始有可疑内存泄露的情况, 是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放!
3,使用ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(这个方法是写一个简单的app去监控的时候用到的,轻便简单)
  1. private void GetMemory() {   

  2.     final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);   

  3.     ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();   

  4.     activityManager.getMemoryInfo(info);   

  5.     Log.i(tag,"系统剩余内存:"+(info.availMem >> 10)+"k");   

  6.     Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);

  7.     Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");

  8. }

复制代码
availMem:表示系统剩余内存
lowMemory:它是boolean值,表示系统是否处于低内存运行
hreshold:它表示当系统剩余内存低于好多时就看成低内存运行
我用过以上三种最多,其实Top  也可以 还有很多方法都可以。
adb shell top  内存拿到后怎么去用呢?
这里我用的方法是用java封装Adb shell  dumpsys meminfo再用字符串截取 打印的方式

  1. public static String GetMemory(String packageName) throws IOException, InterruptedException {

  2.     String str3=null;
  3.       Runtime runtime = Runtime.getRuntime();
  4.       Process proc = runtime.exec("adb shell dumpsys meminfo "+packageName);
  5.       try {

  6.           if (proc.waitFor() != 0) {
  7.               System.err.println("exit value = " + proc.exitValue());
  8.           }
  9.           BufferedReader in = new BufferedReader(new InputStreamReader(
  10.                   proc.getInputStream()));
  11.           StringBuffer stringBuffer = new StringBuffer();
  12.           String line = null;
  13.           while ((line = in.readLine()) != null) {
  14.               stringBuffer.append(line+" ");

  15.           }
  16.           String str1=stringBuffer.toString();
  17.           String str2=str1.substring(str1.indexOf("Objects")-60,str1.indexOf("Objects"));     
  18.           str3=str2.substring(0,10);
  19.           str3.trim();
  20.       } catch (InterruptedException e) {
  21.           System.err.println(e);
  22.       }finally{
  23.           try {
  24.               proc.destroy();
  25.           } catch (Exception e2) {
  26.           }
  27.       }
  28.     return str3 ;
  29. }

  30. }<code></code>
复制代码
截取好之后呢 可以跟 其他的一些系统资源值拼在一起打印出来:

拿到这些值之后可以配合手工或自动化来做数据收集,你会看到有些步骤内存占用很高或者Cpu消耗也会较高,这样你就可以去check一下 关于这个步骤相关 的Code
未完待续

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

推荐
 楼主| 发表于 2017-6-22 11:27:01 | 只看该作者
巴黎的灯光下 发表于 2017-6-22 11:20
我纠正一些说法。
关于单个应用占用量的问题。应该先通过如下的手段进行查看。

补充得到位
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

2#
发表于 2017-6-22 11:20:39 | 只看该作者


我纠正一些说法。
关于单个应用占用量的问题。应该先通过如下的手段进行查看。

#查看单个应用程序最大内存限制
adb shell getprop|grep heapgrowthlimit
|[dalvik.vm.heapgrowthlimit]: [96m]

#应用启动后分配的初始内存
adb shell getprop|grep dalvik.vm.heapstartsize
|[dalvik.vm.heapstartsize]: [8m]

#单个java虚拟机最大的内存限制
adb shell getprop|grep dalvik.vm.heapsize
|[dalvik.vm.heapsize]: [384m]

关于四个内存占用量

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

    USS 是针对某个进程开始有可疑内存泄露的情况, 是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放!
    没错。不过USS需要通过root的手机。一般没有root的手机我们可以获取PSS。而PSS的话可以通过如下命令来获取

adb shell dumpsys meminfo <Package Name>|grep TOTAL

回复 支持 反对

使用道具 举报

该用户从未签到

4#
 楼主| 发表于 2017-6-22 11:27:07 | 只看该作者
巴黎的灯光下 发表于 2017-6-22 11:20
我纠正一些说法。
关于单个应用占用量的问题。应该先通过如下的手段进行查看。

补充得到位
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2017-6-22 11:47:40 | 只看该作者
谢谢楼主分享
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-4-26 22:04 , Processed in 0.072753 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表