前言:
前段时间花了两周的时间做了一个基于 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 去监控的时候用到的,轻便简单)
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
未完待续
欢迎一起交流,一起进步 可以关注我的微信公众号:“测试开发进阶” - 点我关注