APP性能测试中如何获取CPU和PSS数据

来源:互联网 发布:如何整理mac文件 编辑:程序博客网 时间:2024/05/19 02:02

本人在最近手机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();// 此处有依赖关系,先关闭errorReadererrorInput.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