Android 性能测试实践(一)

来源:互联网 发布:淘宝旺旺卖家版 千牛 编辑:程序博客网 时间:2024/04/28 02:01

转载地址:http://testerhome.com/topics/2572

前言:

前段时间花了两周的时间做了一个基于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
ative和dalvik,dalvik就是我们平常说的java堆,我们创建的对象是在这里面分配的。
bitmap是直接在native上分配的,对于内存的限制是 native+dalvik 不能超过最大限制。
android程序内存一般限制在16M,当然也有24M的。

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去监控的时候用到的,轻便简单)

private void GetMemory() {        final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);        ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();       activityManager.getMemoryInfo(info);        Log.i(tag,"系统剩余内存:"+(info.availMem >> 10)+"k");       Log.i(tag,"系统是否处于低内存运行:"+info.lowMemory);    Log.i(tag,"当系统剩余内存低于"+info.threshold+"时就看成低内存运行");}

availMem:表示系统剩余内存

lowMemory:它是boolean值,表示系统是否处于低内存运行

hreshold:它表示当系统剩余内存低于好多时就看成低内存运行

我用过以上三种最多,其实Top 也可以 还有很多方法都可以。

adb shell top  

内存拿到后怎么去用呢?

这里我用的方法是用java封装Adb shell dumpsys meminfo再用字符串截取 打印的方式

      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 ;      }      }

截取好之后呢 可以跟 其他的一些系统资源值拼在一起打印出来:

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

未完待续


0 0
原创粉丝点击