未処分利益

日記 メモ 映画 小説 感想 読書 Android iOS

AndroidのCPU使用率取得方法

メモとして記録。

AndroidにはCPU使用率の取得APIが存在しません。
しかし、GooglePlay上にはCPU使用率を取得するアプリが存在しています。
これらのアプリは、どのようにしてCPU使用率を取得しているんだろう?
ということで、調べてみました。

Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)

Androidを支える技術〈II〉──真のマルチタスクに挑んだモバイルOSの心臓部 (WEB+DB PRESS plus)

結論: /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

意外に簡単。