您的位置:首页 > 移动开发 > Android开发

Android 性能测试实践(一)

2015-05-20 14:36 417 查看
前言:

前段时间花了两周的时间做了一个基于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堆,我们创建的对象是在这里面分配的。

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

未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: