APP性能测试中如何获取CPU和PSS数据
2017-11-15 10:05
519 查看
本人在最近手机APP性能数据的过程中,又重新看了一些Android的内存相关知识,对之前写过的一篇APP性能的线程类的方法做了优化,总得来说,就是增加了PSS数据和增加了数据获取之后的数据整理工作。
获取PSS的方法原理是通过adb shell dumpsys命令获取到的,之前放弃了这个方法,因为内存数据太细分了,后来发现细分的更准确。这里没有统计Native Heap和Dalvik Heap,感觉统计数据的话并没有多大的必要。对这块也不是非常了解如果有不对的地方,还请指正。
方法如下:
/**
* 获取应用信息 利用Android系统dumpsys命令获取
* 命令能统计到java虚拟的堆内存和栈内存的使用情况
*
* @return 返回内存占用
*/
public int getMemResult() {
String cmd1 = Common.ADB_PATH + "adb shell dumpsys meminfo " + package_name;
int mem_result = 0;
try {
Process p = Runtime.getRuntime().exec(cmd1);// 通过runtime类执行cmd命令
// 正确输出流
InputStream input = p.getInputStream();// 创建并实例化输入字节流
BufferedReader reader = new BufferedReader(new InputStreamReader(input));// 先通过inputstreamreader进行流转化,在实例化bufferedreader,接收内容
String line = "";
while ((line = reader.readLine()) != null) {// 循环读取
if (line.startsWith(" TOTAL")) {
mem_result = getMemInfo(line);
}
}
reader.close();// 此处reader依赖于input,应先关闭
input.close();
// 错误输出流
InputStream errorInput = p.getErrorStream();// 创建并实例化输入字节流
BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));// 先通过inputstreamreader进行流转化,在实例化bufferedreader,接收内容
String eline = "";
while ((eline = errorReader.readLine()) != null) {// 循环读取
System.out.println(eline);// 输出
}
errorReader.close();// 此处有依赖关系,先关闭errorReader
errorInput.close();
} catch (IOException e) {
output("执行" + cmd1 + "失败!", e);
}
return mem_result;
}下面是增加的统计方法,主要是在每次新建进程的时候都会记录一个mark,统计方法写在结束线程的方法里:
public void stopRecord() {
AppLocalMySql.getInstance().ClearUpPerformaceData(mark);//整理数据
PerformanceThread.key = false;//结束线程
}
宣传一下自己的QQ群:
Tester终点站,群号:340964272
获取PSS的方法原理是通过adb shell dumpsys命令获取到的,之前放弃了这个方法,因为内存数据太细分了,后来发现细分的更准确。这里没有统计Native Heap和Dalvik Heap,感觉统计数据的话并没有多大的必要。对这块也不是非常了解如果有不对的地方,还请指正。
方法如下:
/**
* 获取应用信息 利用Android系统dumpsys命令获取
* 命令能统计到java虚拟的堆内存和栈内存的使用情况
*
* @return 返回内存占用
*/
public int getMemResult() {
String cmd1 = Common.ADB_PATH + "adb shell dumpsys meminfo " + package_name;
int mem_result = 0;
try {
Process p = Runtime.getRuntime().exec(cmd1);// 通过runtime类执行cmd命令
// 正确输出流
InputStream input = p.getInputStream();// 创建并实例化输入字节流
BufferedReader reader = new BufferedReader(new InputStreamReader(input));// 先通过inputstreamreader进行流转化,在实例化bufferedreader,接收内容
String line = "";
while ((line = reader.readLine()) != null) {// 循环读取
if (line.startsWith(" TOTAL")) {
mem_result = getMemInfo(line);
}
}
reader.close();// 此处reader依赖于input,应先关闭
input.close();
// 错误输出流
InputStream errorInput = p.getErrorStream();// 创建并实例化输入字节流
BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorInput));// 先通过inputstreamreader进行流转化,在实例化bufferedreader,接收内容
String eline = "";
while ((eline = errorReader.readLine()) != null) {// 循环读取
System.out.println(eline);// 输出
}
errorReader.close();// 此处有依赖关系,先关闭errorReader
errorInput.close();
} catch (IOException e) {
output("执行" + cmd1 + "失败!", e);
}
return mem_result;
}下面是增加的统计方法,主要是在每次新建进程的时候都会记录一个mark,统计方法写在结束线程的方法里:
public void stopRecord() {
AppLocalMySql.getInstance().ClearUpPerformaceData(mark);//整理数据
PerformanceThread.key = false;//结束线程
}
/** * 整理一次性能数据收集 * * @param mark * 统计mark */ public void ClearUpPerformaceData(int mark) { getConnection(); int cpu = 0, pss = 0, rss = 0, vss = 0, total = 0; String device = null, packages = null, test_name = null; try { if (!connection.isClosed()) { outputSuccess(); Statement statement = connection.createStatement(); String sql = "SELECT AVG(cpu),AVG(pss),AVG(rss),AVG(vss),COUNT(*),device,package,test_name FROM app_result WHERE mark = " + mark; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { cpu = resultSet.getInt(1); pss = resultSet.getInt(2); rss = resultSet.getInt(3); vss = resultSet.getInt(4); total = resultSet.getInt(5); device = resultSet.getString("device"); packages = resultSet.getString("package"); test_name = resultSet.getString("test_name"); } String sql2 = "INSERT INTO app_report (mark,test_name,package,device,cpu,pss,rss,vss,total) VALUES (" + mark + ",'" + test_name + "','" + packages + "','" + device + "'," + cpu + "," + pss + "," + rss + "," + vss + "," + total + ")"; statement.executeUpdate(sql2); statement.close(); connection.close(); } } catch (SQLException e) { output("统计方法出错!", e); } }
宣传一下自己的QQ群:
Tester终点站,群号:340964272
相关文章推荐
- 如何获取手机性能测试数据FPS
- 如何准备性能测试数据
- HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较
- ios端app性能测试(cpu/内存/耗电)
- 如何编程获取Windows NT的性能数据
- android app如何从数据库中获取需要的数据?
- 转:如何准备性能测试数据
- 网络游戏之性能测试规划(二)——如何建立有效的基准数据及环境(拟稿)
- iOS开发 - app性能测试(cpu/内存/耗电)
- 【软件性能测试-LoadRunner实战技能 1】== 如何利用LoadRunner制造测试数据
- 转jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用
- jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用
- (原创)如何在性能测试中自动生成并获取Oracle AWR报告
- 如何在没有导入excel的情况下获取excel中的测试数据
- HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较
- 如何采用Python zabbix_api 获取性能数据
- android手机如何获取某APP的页面耗时数据(命令行方式)
- android app性能测试工具GT源码获取以及部署
- 如何在性能测试中自动生成并获取Oracle AWR报告