移动性能测试 共享一个我自己收藏的移动性能测试工具--安测试

梁慧玲 · 2015年08月31日 · 最后由 renmh 回复于 2016年05月13日 · 4111 次阅读

最近在看 testerhome 上的移动性能测试的文章,看完了突然想到我去年用的一个工具安测试,使用特别简单

打开指定被测应用
选择要测的性能
然后启动
接着就手动点要测试的应用

测试结束后被测应用的电量、cpu、内存和流量都会生成一个曲线图,如下图所示

网上好像找不到了,我共享一个安测试的下载地址
链接: http://pan.baidu.com/s/1hq3y8io 密码: mpx2

分享结束,希望对大家测试有帮助

共收到 13 条回复 时间 点赞

感谢分享啊

能不能详情介绍下?工作原理是什么?是你自己写的,还是第三方的?

#2 楼 @284772894 是第三方的,具体原理这些的我不是很懂,我觉得应该跟 testly 分享的文章中说到的原理是一样的,论坛里有他的文章你可以看看

感谢楼主

楼主太好了 这个很有用啊 感谢!

百度 MTC 上也可以下载类似工具,一样的功能

楼楼工具挺好用,我也借楼分享下自己写的一个监测 Cpu、内存的 app 小 demo。

1.内存计算方式
    public static void getMemoryForPid(Context context,int pid,String fileName) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        int[] pids = {pid,};
        MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(pids);
        ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo();
        am.getMemoryInfo(outInfo);
        long availMem = outInfo.availMem;
        long  totalMem = outInfo.totalMem;
        Utils.writeLog(fileName,"TotalPss:" + Utils.convertFileSize(memoryInfos[0].getTotalPss()) , true);
        Utils.writeLog(fileName,"TotalPrivateDirty:" + Utils.convertFileSize(memoryInfos[0].getTotalPrivateDirty()), true);
        Utils.writeLog(fileName,"TotalSharedDirty:" + Utils.convertFileSize(memoryInfos[0].getTotalSharedDirty()), true);   
}

2.Cpu 使用率,计划调用 com.android.internal.os.ProcessCpuTracker.getCpuTimeForPid(int pid) 获取线程 CpuTime,没有反射出来,就把这个方法摘出来了;系统 CpuTime 参照 com.android.internal.os.ProcessCpuTracker.update().

    public static long getCpuTimeForPid(int pid) {
        final String statFile = "/proc/" + pid + "/stat";
        final long[] statsData = new long[4];
        try {
            Class process = Class.forName("android.os.Process");
            Method read = process.getMethod("readProcFile", String.class,int[].class,String[].class,long[].class,float[].class);                  
            if ((Boolean)read.invoke(process.newInstance(), statFile, PROCESS_STATS_FORMAT,null, statsData, null)) {
                long time = statsData[PROCESS_STAT_UTIME] + statsData[PROCESS_STAT_STIME];
                //Log.e("CpuTimeForPid", String.valueOf(time));
                return time;
              }
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }      
        return 0;
    }

    public static long getCpuTotalTime() {
        final long[] sysCpu = new long[7];
        try {
            Class process = Class.forName("android.os.Process");
            Method[] methods = process.getMethods();
            Method read = process.getMethod("readProcFile", String.class,int[].class,String[].class,long[].class,float[].class);                  
            if ((Boolean)read.invoke(process.newInstance(), "/proc/stat", SYSTEM_CPU_FORMAT,null, sysCpu, null)) {
                // Total user time is user + nice time.
                final long usertime = sysCpu[0]+sysCpu[1];
                // Total system time is simply system time.
                final long systemtime = sysCpu[2];
                // Total idle time is simply idle time.
                final long idletime = sysCpu[3];
                // Total irq time is iowait + irq + softirq time.
                final long iowaittime = sysCpu[4];
                final long irqtime = sysCpu[5];
                final long softirqtime = sysCpu[6];
                long totalTime = usertime + systemtime + idletime + irqtime + softirqtime;
                //Log.e("CpuTime", String.valueOf(totalTime));
                return totalTime;
            }
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return 0;   
    }

}

Cpu 使用率计算:按分钟 (60000) 采样 CpuTime,Cpu 使用率=(secPidCpuTime-firstPidCpuTime)/(secCpuTime-firstCpuTime)。
3.开启监测后按分钟写日志信息到 Sdcard;内存、Cpu 使用率采用 achartengine-1.1.0.jar 以折线图的形式显示。
手机型号 华为 P6 4.2.2
源码:https://github.com/wsjunjin/AndroidTest/tree/master
ps:第一次发长贴,有问题一起交流~

#7 楼 @mohu 可以直接贴源码,不要用截图。

@lihuazhang 好的,那我重新编辑下~

有没有类似的 iOS 的性能测试小工具

一堆性能测试帖,就这个看懂了。囧

想把生成的报告导出来,这个报告在什么目录下啊?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册