5分でわかるBatteryHistorianによるAndroidアプリの解析方法

モバイルファースト室の@tomorrowkey です。
Google I/O 2014で発表されたProject VoltaのBatteryHistorianについて調べました。

目次

  • 注意
  • Battery Historianってなに?
  • BatteryHistorianを使おう
  • 開発中のBatteryHistorianを使おう
  • 各項目の解説
  • まとめ
  • 参考

注意

この記事は2014年8月12日 現在 正式リリースされていない開発中のツールを解説しています。 正式リリース時にはツールの使い方や解析結果の見かたなどが変わる場合がありますので、ご注意ください。

Battery Historianってなに?

Google I/O 2014でProject Voltaが発表されました。 Project VoltaはAndroidアプリの電力消費の解析をするためのツールを作ったり、アプリの電力消費を抑えることなどをミッションとしたプロジェクトです。 詳しい文章はまだAPI Overviewくらいしかありません。

API Overview | Android Developers http://developer.android.com/preview/api-overview.html

Battery Historianはアプリの電力消費を解析するために開発されたツールで、pythonで書かれたスクリプトです。 以下の項目を時系列のグラフで知ることができます。

  • フォアグラウンドにいるアプリ
  • 通話
  • モバイルネットワーク
  • Wifi
  • Bluetooth
  • バッテリーステータス(バッテリーレベルなど)
  • バックグラウンド同期
  • スクリーンオン

BatteryHistorianを使おう

API Overviewによるとスクリプトは<android-sdk>/tools/historian.par に入っているらしいですが そこにはまだスクリプトは入っていません。 Google I/Oで発表された多くのツールやSDKはまだプレビュー版なので、まだSDKには入っていないようです。

開発中のBatteryHistorianを使おう

スクリプトは正式には公開されていませんが、GitHubに開発中のものがありました。

google/battery-historian https://github.com/google/battery-historian

コミットメッセージを見るに、開発中のものを定期的にGitHubに同期しているみたいです。 まだ正式リリースされているものではありませんが、試しに使ってみましょう。

まずはスクリプトを使うために手元にスクリプトをダウンロードします。

$ git clone git@github.com:google/battery-historian.git

より正確なwake lockの時間を取得するために以下のコマンドを実行します。 このコマンドはKitKat以降のAndroidで使えます。

$ adb shell dumpsys batterystats --enable full-wake-history

その後にリセットのコマンドを実行します。

$ adb shell dumpsys batterystats --reset

以上で、計測するための準備が整ったので、ここから計測したい操作をします。 アプリを開発しているのであればアプリを起動したり、ホームボタンを押してバックグラウンドにアプリを移動させたりしてみましょう。 USBを抜いても問題ないので、必要とあらばUSBケーブルを抜いて操作してもいいでしょう。

計測したい操作が終わったら、以下のコマンドを実行します。

$ adb bugreport > bugreport.txt

このコマンドの実行にはすこし時間がかかります。待ちましょう。 バグレポートの中にバッテリー情報や端末の使用状況が含まれています。 実行が終わったら、さきほどダウンロードしたスクリプトを使ってhtmlファイルに変換します。

$ ./historian.py bugreport.txt > report.html

出力されたhtmlファイルをブラウザで開くと、キーノートで見たような画面が表示されました。

f:id:tomorrowkey:20140812182214p:plain

各項目の解説

公式のドキュメントで詳しい説明はまだないので、見て分かる部分だけ見てみましょう。

battery_level

f:id:tomorrowkey:20140812182306p:plain

バッテリ残量を表します。 このグラフを見ると計測開始後1分23秒後に99%に変化したと読み取れます。

top

f:id:tomorrowkey:20140812182336p:plain

フォアグラウンドにいるアプリを表します。 アプリはapplication_idで表現されます。 起動している時間が短くてapplication_idが表示しきれていないアプリもありますが、カーソルを合わせると表示されます。

f:id:tomorrowkey:20140812182504p:plain

status

f:id:tomorrowkey:20140812182534p:plain

電源との接続状態を表します。 値の意味はBatteryManagerBATTERY_STATUS で始まる定数を参照してください。

health

f:id:tomorrowkey:20140812182600p:plain

バッテリーの状態を表します。 値の意味はBatteryManagerBATTERY_HEALTH で始まる定数を参照してください。

plug

f:id:tomorrowkey:20140812182806p:plain

接続している電源の種類を表します。 計測直後には何も接続されていませんでしたが、3分10秒経過した時にUSBに接続したようです。

f:id:tomorrowkey:20140812182846p:plain

statusと見比べると、同じタイミングで電源との接続状態が変わっていることが分かります。

wifi_full_lock

f:id:tomorrowkey:20140812182913p:plain

WiFiの接続状態を維持するためにロックを取得している期間を表します。 細かいですが何度かロックされているようですね。

screen

f:id:tomorrowkey:20140812183003p:plain

スクリーンがオンになっている期間を表します。 topと見比べると、アプリが起動している期間はスクリーンがオンになっています。 電話をしている最中は近接センサーによってスクリーンがオフになっている様子も分かります。

plugged

f:id:tomorrowkey:20140812183042p:plain

電源に接続されている期間を表します。 plugと比べるとたしかにUSBが接続された時から期間が始まっています。

data_conn

f:id:tomorrowkey:20140812183120p:plain モバイルネットワークの種類の切り替わりを表します。 最初はLTEで接続されていましたが、途中で圏外になり、またLTEが復活したようです。

phone_in_call

f:id:tomorrowkey:20140812183144p:plain 電話中の期間を表します。 topと比べるとdialer(電話アプリ)が同じ期間に立ち上がっていることが分かります。

wifi

f:id:tomorrowkey:20140812183222p:plain Wifiがオンになっている期間を表します。 今回の計測期間中はずっとオンだったので、帯がずっと伸びています。

signal_strength

f:id:tomorrowkey:20140812183401p:plain

モバイルネットワークの電波の強さの変化を表します。

sync

f:id:tomorrowkey:20140812183437p:plain 同期しているサービスとその期間を表します。 Google Calendarの同期が行われたようです。

wake_lock

f:id:tomorrowkey:20140812183519p:plain

Wake Lockが取得されている期間を表します。 最初と最後の長い帯は、スクリーンがオンだったため、スクリーンによってWake Lockが取得されていました。 間の2つはバックグラウンドサービスによるWake Lockの取得でした。

まとめ

BatteryHistorianはまだ開発中のツールですが、現時点でも詳しいデータがとれてなかなかおもしろいですね。 電池残量でなんかしらのアクションをするアプリや、複雑な条件で起動するサービスなどがある場合にとても役に立ちそうです。 名前からだけでは推測できないので何を表しているのかまだ分からない項目がありますが、正式リリース時にはより詳しいドキュメントが公開されると思いますので、それを待ちましょう。

参考

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('http://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/