メモとして記録。
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
意外に簡単。