AndroidのCPU使用率取得方法
メモとして記録。
AndroidにはCPU使用率の取得APIが存在しません。
しかし、GooglePlay上にはCPU使用率を取得するアプリが存在しています。
これらのアプリは、どのようにしてCPU使用率を取得しているんだろう?
ということで、調べてみました。
Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)
- 作者: 有野和真
- 出版社/メーカー: 技術評論社
- 発売日: 2017/03/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
結論: /proc/statより、カーネル上の統計情報からCPUの占有時間情報を取得する。
// カーネル全体の統計情報を表示する String [] cmdArgs = {"/system/bin/cat","/proc/stat"}; String cpuLine = ""; StringBuffer cpuBuffer = new StringBuffer(); cmd = new ProcessBuilder(cmdArgs); try { Process process = cmd.start(); InputStream in = process.getInputStream(); // 統計情報より1024バイト分を読み込む // cpu user/nice/system/idle/iowait/irq/softirq/steal/の情報を取得する byte[] lineBytes = new byte[1024]; while(in.read(lineBytes) != -1 ) { cpuBuffer.append(new String(lineBytes)); } in.close(); }catch (IOException e) { } cpuLine = cpuBuffer.toString(); // 1024バイトより「cpu~cpu0」までの文字列を抽出 int start = cpuLine.indexOf("cpu"); int end = cpuLine.indexOf("cpu0"); cpuLine = cpuLine.substring(start, end); Log.i("CPU_VALUES_LINE",cpuLine); // 区切り文字を元に値をリスト化する(メソッドgetValues(target,regex)の実装は省略 List<String> values = getValues(cpuLine,"\\s");
結果はこんな感じ。
user | nice | system | idle | iowait | irq | softirq | steal |
48996 | 7173 | 43375 | 1723806 | 159 | 41 | 36 | 0 |
あとは、単位時間ごとに上記のデータを取得して、各CPU占有時間の差分から占有率(使用率)を計算すればいい。 /proc/statの占有時間は端末起動時からの総和時間になるので計算式は,差分に着目して以下の通り。
占有時間差分/各占有時間差分の総和 * 100
意外に簡単。