1

我正在尝试编写一个小代码来转储我的 android 应用程序的 CPU 利用率(过去 10 秒内使用的 CPU 百分比并每 10 秒转储一次)。

现在假设手机中有 2 个或 4 个内核。如何有效地转储应用程序使用的 % cpu。我用谷歌搜索了一些 top 命令的示例,但我不确定如何使用 top 命令的数据来显示多核和过去 10 秒内的 cpu 利用率。

我添加了以下代码:但我总是在buf. exec返回有效结果中使用ls命令而不是使用top. 我是否需要在 mainfest 中获得一些权限才能执行 top 命令...

    String str = new String();
    str = "top -l1";
    Process p;
    p = Runtime.getRuntime().exec(str);
    BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    /* Skip 6 lines */
    int count = 0;
    char[] buf= new char[10240];
     bri.read(buf);
     Log.e("TEST", new String(buf));
4

2 回答 2

0

我不是很熟悉top,但这个问题似乎表明有一种方法可以从单个核心收集数据。

无论如何,我建议您改用Dumpsys 工具,它更有趣,因为它可以为您提供 CPU 利用率,而不管内核数量如何。例如,命令:

adb shell dumpsys cpuinfo

将给出以下形式的输出:

Load: 0.08 / 0.4 / 0.64
CPU usage from 42816ms to 34683ms ago:
system_server: 1% = 1% user + 0% kernel / faults: 16 minor
kdebuglog.sh: 0% = 0% user + 0% kernel / faults: 160 minor
tiwlan_wq: 0% = 0% user + 0% kernel
usb_mass_storag: 0% = 0% user + 0% kernel
pvr_workqueue: 0% = 0% user + 0% kernel
+sleep: 0% = 0% user + 0% kernel
+sleep: 0% = 0% user + 0% kernel
TOTAL: 6% = 1% user + 3% kernel + 0% irq

查看这个 SO 答案,了解有关如何使用 Dumpsys 的更多详细信息:什么是 Android ADB shell“dumpsys”工具,它有什么好处?

于 2013-06-09T10:39:33.680 回答
0

对于遇到此问题以解决此问题的任何人,我将发布有关如何从“top”命令获取 cpu 使用值的解决方案

private String getCpuUsage()
    {
        ArrayList<String> list = new ArrayList<String>();
        String cpuUsageValue = "";

        Process p = null;
        try {

            p = Runtime.getRuntime().exec(new String[] { "sh", "-c", "top -n 1 | grep " + appProcessName }); //appProcessName is com.example.app

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        int i =0;
        String line = "";
        try {

            line = reader.readLine();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        //while(line != null)
        if(line != null)
        {

            //11203  0   0% S    13 901560K  43528K  fg u0_a141  com.example.app

            String lineOuput[] = line.split(" ");
            cpuUsageValue = lineOuput[5].trim();
            //[19472, , 0, , , 0%, S, , , , 15, 904664K, , 44148K, , fg, u0_a141, , com.example.app]

            Log.i(TAG, "cpu usage value : " + cpuUsageValue);

            list.add(line);
            try {
                line = reader.readLine();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            i++;
        }
        else
        {
            Log.i(TAG, "command line is null");

        }

        return cpuUsageValue;


    }
于 2015-03-10T10:17:57.153 回答