使用 top 测量 Android 应用程序中的 CPU 负载

tva*_*ven 6 android cpu-usage

我正在尝试使用top命令收集 Android 应用程序的 CPU 负载信息。虽然下面的代码提供了预期的输出,但顶部间隔应以(默认)3 秒的间隔更新其读数。然而,从 BufferedReader 读取时,每 3 秒会记录相同的输出。如果我将进程的运行时间包含在顶部的输出中,它也不会改变。所以看起来我只是一遍又一遍地获得每个间隔第一次运行的输出。

更新:看来上述问题只能在模拟器上重现。在物理设备上,顶部更新的 CPU 读数会在每个时间间隔内正确更新。

我尝试的另一件事是让 top 仅运行一次并收集该输出。虽然这有效,但启动 top 命令的开销看起来会扭曲读数。

我也很惊讶我没有找到现成的代码。既然对 /proc 目录的访问已受到限制,是否有更好的方法来检查应用程序的 CPU 负载?ps命令还提供 cpu 负载,但这提供了进程整个生命周期内运行所用时间的百分比,这是一个不太有用的值。

private void startCollecting() {
        Thread thread = new Thread() {
            @Override
            public void run() {
                try {
                    ProcessBuilder builder = new ProcessBuilder("top", "-q", "-oCMDLINE,%CPU", "-s2", "-b");
                    Process process = builder.start();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    String line;
                    while ((line = reader.readLine()) != null) {
                        Log.d(TAG, line);
                        processStatsLine(line);
                    }
                    reader.close();
                    BufferedReader err_reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                    while ((line = err_reader.readLine()) != null) {
                        Log.e(TAG, line);
                    }
                    process.waitFor();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        thread.start();
    }
Run Code Online (Sandbox Code Playgroud)