現在開発者向けのプレビュー状態にあるAndroid "L"では、電力消費の効率改善も1つの目的になっています。このためのプロジェクトが「Volta」(Voltaは電池を発明したイタリア人科学者の名前で電圧の単位Voltの語源にもなっています)です。アンドロイドの各バージョンの開発では、重点改良項目をプロジェクトと呼びます。Voltaは、Android "L"の重点開発項目のプロジェクトなのです。

ちなみにKitKatのときには、最低動作メモリを512メガバイトとすることが重点開発項目となっていて、Project Svelteと呼ばれました。Svelteは「すらりとした」女性を表す形容詞です。またJelly BeanにはProject Butter(パンに塗るバター)があって、これは、アニメーションを60フレーム毎秒で動作させることを目的にしていました。

システム側は、Googleが努力することで、消費電力を減らすことはある程度可能ですが、アプリケーション側が勝手に通信して、CPU時間を消費してしまうと、バッテリ寿命は長くなりません。このため、Project Voltaではアプリケーション側を消費電力を少なくできるように「開発可能」にすることも目標となりました。このためにAPIやツールが用意されたのです。

Googleによれば、消費電力を下げるためには、なるべく「怠ける」ことが必要だといいます。つまり、アイドル時間を連続して長くする努力が必要ということです。これは、なにもアンドロイドに限らず、Windowsなどの他のプラットフォームでも事情は同じです。Windowsも、タイマー割り込みのタイミングをずらすなどして、アイドル時間をなるべく長く連続するように内部的に処理をしています。このようにすることで、電力消費の大きなパーツ(CPUと通信回路、ディスプレイが消費電力の大半を使っています)の消費電力を下げることができるのです。たとえば、CPUは、アイドル時間が長ければ、消費電力の小さな状態に段階的になっていきます。また通信も、一時にフル帯域を使うことはないため、通信をできるだけ同時にすることで低消費電力の状態を長くできます。ディスプレイに関しては、ユーザーが使うためにあまり制御はできませんが、バックライトを自動調節すると、たとえば、背景を暗い画像にしておくと、消費電力を下げることができる場合があります。機種によっては、「エコモード」などで真っ黒の壁紙に切り替えるものがあります。

アプリケーションをなるべく怠けさせるためにGoogleが用意したAPIの1つが、「Scheduled Job」です。これは、周期的に実行するような処理の実行タイミングをアンドロイド側で制御できるようにするためのものです。アプリケーションは、スケジュールジョブとして周期的な処理を登録しておけば、アンドロイドがこれを勝手に実行してくれます(実行されるコード自体はアプリの中に置きます)。これにより、アンドロイドは複数の処理をまとめて実行するようなスケジューリングが可能になります。また、このAPIでは、「電源につながっているとき」などの条件を指定することも可能です。

Project Voltaのもう1つの成果は、アプリケーション実行時の電力消費状態などを記録する機能です。この記録を視覚的に表示させる「Battery Histrian」(バッテリ歴史家とでもいうのでしょうか)というツールです。

このツールを使うには、Android "L"をインストールしたNexus 5などにシェルで入り、バッテリ状態の記録を取るコマンドを実行し、その後、ログファイルをPCに転送して、PC側でBattery Histrianツールを起動します。結果は、HTMLファイルとして保存され、スクリプトが含まれているので、簡単な拡大縮小などはWebページ内で実行可能です。

ただし、グーグルのAndroid developersにある情報は古いので、以下に手順などを解説しておきます。まずは必要なものをそろえます。必要になるのはPython 2.7とBattery Histrianスクリプト、そしてAndroidのSDKです。SDKについては以前の記事を参考にしてください。今後のことを考えると単独でインストールするよりもAndroid Studioをインストールしたほうがいいかもしれません。SDKのインストールにはJDKが必要で、このあたり説明が煩雑になるので、ここでは手順は省略します。

■ Python 2.7
・64bit版
https://www.python.org/ftp/python/2.7.8/python-2.7.8.amd64.msi
・32bit版
https://www.python.org/ftp/python/2.7.8/python-2.7.8.msi

■ Historian(Pythonスクリプト)
https://github.com/google/battery-historian/blob/master/historian.py
※「Raw」のリンクで「リンク先を保存」を実行

バッテリ消費状態を記録するため、従来からあったdumpsys(システム関連情報の出力)コマンドが拡張されアンドロイドのシェル(adb shell)で「batterystats」サブコマンドが利用できるようになりました。使い方は、

dumpsys batterystats -h

でヘルプメッセージが出力されます。

まずは、以下のようにWindowsのコマンドプロンプトウィンドウで実行します。adb shellでシェルに入ってdumpsysコマンドを実行してもかまいません。adb shellに続けてシェルで実行するコマンドを直接指定することが可能です。

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

最初のコマンドは、batterystatsのログ記録の開始で、次のコマンド(--reset)は記録をクリア(ただし記録は止まらない)するものです。

その後、調査したいアプリを起動して動かして、バッテリ状態を記録させます。ある程度、操作したのち適当なタイミングで、Windowsのコマンドプロンプトで、以下のコマンドを実行してログを視覚化します。

adb shell dumpsys batterystats disable full-wake-history
adb.exe bugreport >bug.txt
python.exe historian.py bug.txt >report.html

最初のコマンドは、batterystatsの記録停止です。バッテリ状態のログ記録は停止させないとずっと記録が続きます。このため不要な場合には、このコマンドで停止させます。なお、このあと、--resetを使って記録のクリアと再開を行わせることも可能です。2つめのコマンドはdumpsysコマンドで開始したログファイルをbug.txtというファイルに保存する(リダイレクトする)ものです。このコマンドはかなり実行に時間がかかり数メガバイトのテキストが保存されます。次のコマンドは、pythonを使ってhistorian.pyを実行し、bug.txtを処理して結果をreport.htmlに書き込みます。できあがったreport.htmlをChromeで表示させると、さまざまな機能の稼働状態を視覚化したページが表示されます。こちらで試したところでは、IE11では、グラフ部分が表示されませんでしたが、Chromeではそのまま表示が可能でした。

このツールは、稼働中に記録を取り、アプリケーションの動作状態を確認するもので、ページ上の縦線がアンドロイド内で発生したさまざまなイベントが対応しています。マウスカーソルを合わせると簡単な解説が表示されます。本来、アプリケーション開発者向けのものなのですが、Android内部での動作を見るのにも利用できるでしょう。ただし、いまのところ、表示の見方についての解説はなく、左端に表示されているラベルなどからイベントの内容を推測するしかありません。たとえば、一番上の行に表示されているのは、バッテリ残量の動きで、1%ごとに青線が表示されています。なので、この間隔が短いところほど消費電力が高いことになります。現在は、Android "L"のプレビューでしか利用できないのですが、Android "L"が製品に搭載されたあとならば、バッテリ消費の異常などを確認するに利用することは可能でしょう。

battery historianで処理したアンドロイド内部の電源関連のイベント。短い縦棒が1つのイベントや測定結果に相当する。連続している部分も実際には、多数の縦棒からできている

関連リンク

連載バックナンバーはこちら