Android 性能测试实践(一)

前言: java

前段时间花了两周的时间作了一个基于Android 客户端的性能测试如今分享给你们,但愿对你们有所帮助! android

Look-Look shell

1,既然是基于Android客户端的性能测试那就与后台的一些API、数据接口要区分开来~!
2,Android的性能测试能其实包括不少不少的测试项好比:资源消耗,内存泄露,电量功耗,启动耗时,渲染等等.... app

怎么去作?
1,采集数据 :采集的数据包括:内存、cpu、电量功耗、hprof(内存泄露分析文件)、响应时间等等。。。。
2,设计场景 :搞定数据的采集后配合一些固定的场景来收集一些数据(最好多取几回并且每次配合不一样的设备看平均值)做为最后的对比分析
3,结果分析 :拿到数据后分析哪些模块的数据异常再去Check code定位问题的缘由 ide

好吧下面慢慢跟你们详细的说吧! 工具

先写下内存篇 性能

内存的采集: 测试

Android的内存的采集这边介绍三种方式: spa

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

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

相关文章
相关标签/搜索