跟踪Android中应用程序的长期CPU使用情况

时间:2011-10-24 09:06:53

标签: android

在一周的时间里,我有什么方法可以查看每个应用程序使用多少CPU?我能想到的唯一方法是反复解析顶部输出,但这似乎不是最有效的方法。还有更好的方法吗?

添加一些上下文,基本上是手机上SDK的traceview功能:http://developer.android.com/guide/developing/debugging/debugging-tracing.html

3 个答案:

答案 0 :(得分:0)

我们解析了顶级输出,想不到更好的方法。我们需要监控所有应用程序,只有当您需要有关自己的信息时,跟踪才有用,因为您必须向应用程序添加跟踪代码才能使用它。

该应用程序每秒运行一次,消耗5%的CPU,聚合值,将值写入日志文件,并在屏幕上显示结果。

不幸的是,代码尚未打开。

答案 1 :(得分:0)

在这段时间内,您面临监控过程的一个问题是,在这段时间内,它们几乎肯定会被摧毁并创建很多次 - 这使得很难获得有用的数据。

如果您不是“重新发明轮子”类型 - 流行的SystemPanel应用程序的免费版本显示每个进程使用了​​多少CPU时间(以及在什么时间段内) - 完整版本显然提供了两者的详细历史记录CPU和内存使用情况。

答案 2 :(得分:-1)

您可以使用Debug类来监控流程


或使用此函数计算CPU使用率

使用/proc/stat/获取总CPU使用率(适用于所有CPU)。对于每个进程的使用

private float readCpuUsage(int pid) {
    try {
        RandomAccessFile reader = new RandomAccessFile("/proc/" + pid + "/stat", "r");
        String load = reader.readLine();

        String[] toks = load.split(" ");

        long idle1 = Long.parseLong(toks[5]);
        long cpu1 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
              + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

        try {
            Thread.sleep(360);
        } catch (Exception e) {}

        reader.seek(0);
        load = reader.readLine();
        reader.close();

        toks = load.split(" ");

        long idle2 = Long.parseLong(toks[5]);
        long cpu2 = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])
            + Long.parseLong(toks[6]) + Long.parseLong(toks[7]) + Long.parseLong(toks[8]);

        return (float)(cpu2 - cpu1) / ((cpu2 + idle2) - (cpu1 + idle1));

    } catch (IOException ex) {
        ex.printStackTrace();
    }

    return 0;
} 

source


获取正在运行的进程列表

ActivityManager mgr = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> allTasks = mgr.getRunningTasks(showLimit);
/* Loop through all tasks returned. */
for (ActivityManager.RunningTaskInfo aTask : allTasks) 
{                  
    Log.i("MyApp", "Task: " + aTask.baseActivity.getClassName()); 
}