位置情報を正確にトラッキングする技術 in Android — 第4回 バッテリー消費について
前回まで3回にわたって位置情報トラッキングエンジンを作ってきましたが、今回はそのサンプルアプリのバッテリー消費を見ていきたいと思います。
本ブログはJavaのコードで説明していますがこのたびKotlin版のコードを公開しました。こちらもご参考ください!
サンプルアプリを使って、の私の通勤経路(5〜6km)を自転車で移動する間トラッキングをしてみました。
使ったのはNexus 6pとNexus 6、5〜6kmの距離を30分ほどかけて移動しました。
結果は上のように2%〜4%の消費量でした。このまま42kmを走った場合、また5時間走った場合の値も算出して見ましたが、最大で36.6%とフルマランソンを走っても問題ない消費量でした。
(ちなみに5時間というのは女性のフルマラソンの平均タイムです)
今回は位置情報を取得する毎にフィルターを通してArrayListに位置情報を格納するというだけの処理をしていますが、位置情報を取得するたびに行う処理が多い場合(ファイルへの書き込みやサーバーアクセスなど)は消費量が変わってくるので自分のアプリに組み込んだ後に測定し、長距離のトラッキングに耐えられるかテストする必要があるでしょう。
サンプルには下のようにバッテリー消費を測定するコードも入れてあり、ストップボタンを押すとCSVファイルにバッテリー消費量や移動距離など上のグラフに必要な情報を記録するようになっているので参考にしてみてください。
registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
CSVは下のファイルパスの下に生成されますので、adb shellで一度端末に入ってからファイル名を確認し、その後adb pullで抜き出してください。
/sdcard/Android/data/com.goldrushcomputing.androidlocationstarterkit/files
バッテリー残量を意識した設計
位置情報取得時の処理が重かったり、42km以上走るユーザーをターゲットにしたアプリ(トレイルランなど)を作る場合でバッテリー消費量が増える場合はバッテリー残量を意識して消費量を動的にコントロールする必要があります。
方針としては下の2つが考えられます。
- バッテリー残量によってCriteriaを変える
2. 位置情報を受け取ってからの処理に負荷が多い場合(サーバーへの送信など)は、Minimum DistanceとMinimum Timeの値を大きくする。
①はバッテリーが少なってきたらLocationMangerに設定するCriteriaを変えるという方法です。AccuracyやPowerRequirementをFineやHightから落として消費量を抑えます。
②は、Minimum DistanceとMinimum Timeの値を大きくして位置情報のアップデートが呼ばれる頻度を落とします。こうすることで位置情報取得時にonLocationChanged内で実行される処理の実行頻度を落としてバッテリー消費量を抑えます。
Minimum DistanceとMinimum Timeの値を大きくしてもGPSチップの消費電力は変わらない
②に関して注意しておくことは、Minimum DistanceとMinimum Timeの値を大きするとGPSチップ自体が取得間隔を空けているようにイメージしそうですがGPSチップ自体は位置情報を取り続けており、あくまでonLocationChangedを呼ぶ間隔を調整しているだけです。
チップ自体の消費量はCriteriaで決まり、Minimum Distance/Timeでは変わらないということを覚えておいてください。
実際にMinimum Distanceが1mのものと5mのものを同じ機種で実行して5kmほどトラッキングして見ると、差がないことがわかります。グラフで上のデータはMinimum Distance 1mで、取得された位置情報の数も2倍以上の1349個ですが、消費量は2%と5m間隔の時より少なくなっています。
(少なくなっている原因ですが、消費量の小数点以下の%値が取得できないため、四捨五入か切り捨てによって差が1%に見えているということと、あとはAndroid OSのその外の処理などが原因していると思います。今後サンプル数を増やしてもう少し検証して見たいと思います。)
ここまでの第4回までで位置情報を正確にトラッキングする実用的なエンジンの作り方について必要なステップは全て説明してきました。
あとはみなさんのアプリのニーズに合わせてフィルターの閾値を少しチューニングしたり取得間隔を空けるなどして自分のアプリに最適なトラッキングエンジンを作ってみてください。
もしうまく動かないユースケースや悪条件などあればフィードバックいただけたらと思います。
位置情報トラッキング機能開発(iOS, Android)に関する質問や、開発のご相談などはこちらにご連絡いただければと思います。
@mizutory
mizutori@goldrushcomputing.com