2022.10.06
Android バックグラウンド動作が制限される条件とは?
こんにちは。マルティスープ株式会社 モバイルチームです。
近年のスマートフォンアプリ開発において、バックグラウンド動作についての制限は次第に厳しくなっている傾向にあります。
Androidでバックグラウンド動作を行う際は Service または ForegroundService と呼ばれる仕組みを用いますが、比較的停止されにくいと言われるForegroundServiceでさえ、その動作が常に保障されているわけではありません。
アプリのバックグラウンド動作を積極的に停止する挙動はユーザーにとってはバッテリー持続時間の向上等のメリットをもたらしますが、開発者にとっては頭を悩ませる要因の一つとなっています。
位置情報を用いた業務効率化サービス”iField”を提供する弊社にとっても、これは取り組むべき課題の一つです。
iFieldアプリではスマートフォンで測位した位置情報を定期的にサーバーに送信するのですが、長い間端末がスリープ状態だと送信されなくなる時があり、そのことがサービスの質に影響を及ぼしています。
そこで今回は、検証用のアプリを作成して、Androidアプリのバックグラウンド動作が制限されるための条件について考察しました。
なお、今回の記事は仮説を立てるまでに留まっています。あらかじめご了承ください。
TL;DR
バックグラウンド動作を停止するかどうかの判断材料として下記を用いている可能性が高い
・バッテリー設定(最適化バッテリーの有効/無効など)
・充電中かそうでないか
・バックグラウンド処理の重さ
・モーションセンサーの状態
アプリの主要機能にバックグラウンド動作が関わっている場合は「電池の最適化」の無効化をユーザーに促す選択肢もある
検証用に作成したアプリ
今回の検証用に作成したアプリは以下のような動作を行います。
ForegroundService内で端末の位置を測位し、その結果をサーバーに送信します。
それと同時に、端末内にも測位した日時と測位結果をログとして残します。
サーバーは測位結果を受信すると、随時その内容をログとして残します。
バックグラウンド動作が制限なく行われている場合は、5〜10秒程度の間隔で測位結果が端末およびサーバーにログとして残り、またそれら2つのログの間で整合性が取れるはずです。
端末側のログにのみ測位結果が残っていた場合はネットワーク通信が、どちらにも測位結果が残っていなかった場合は位置測位が制限されたことになります[*1]。
今回の検証には下記の端末を使用しました。
ZenFone Live L1 (Android 8.0)
Pixel 5a (Android 11)
Pixel 6 (Android 12)
バッテリーに関する端末の設定
Androidはバッテリーの持ちを向上させるいくつかの仕組みと、それに応じた設定項目を備えています。
今回の検証では下記の設定項目を変えながら実験を行いました。
(ただし、後半の実験ではこれらの設定は固定することになります)
機種によっては電力消費を減らす独自の機能を備えているものもありますが、今回はAOSPに実装されている機能のみを考慮します。
電池の最適化
電池の最適化は端末にインストールされているアプリごとに設定できる項目で、これを有効にすると、そのアプリを操作していない時のバックグラウンド動作が一部保留されるようになります。
特に、充電中でなく画面がオフの状態で一定時間が過ぎると、端末はDozeモードとなり、次にDozeモードが解除されるまでアプリのネットワーク接続は保留されるとされています。
(“doze”は日本語で居眠りという意味です。)
今回の実験においては、電池の最適化を有効にすると、スリープ後一定時間経過で位置情報が送信されなくなることが予想されます。
自動調整バッテリー (Android 9以降のみ)
自動調整バッテリーは使用頻度の高いアプリと低いアプリを学習し、使用頻度の低いアプリの実行回数を減らす機能だとされています。
アプリで電池の最適化をオフにすると、自動調整バッテリーをオンにしていても、そのアプリを使っていない間の実行回数が増えることがあります。
とのことですので、自動調整バッテリーは電池の最適化をオンにしているアプリに働きかける機能だと予想されます。
強制アイドルモード (adb使用) 参考
開発時にテストをする目的で、強制的に端末をアイドルモードにすることができます。
アイドルモードとDozeモードは異なるモードですが、アイドルモードにすることでDozeモードのテストを行いやすくなるようです。詳しくは参考リンクをご覧ください。
実験A
アプリを起動した後端末をスリープ状態にし、会社の周辺を歩き回りました。
最適化バッテリーを有効にした時は、そうでない時に比べて測位された地点の数が減少することが期待されます。
しかし驚くべきことに、最も厳しい設定においてもバックグラウンド動作に制限は掛かりませんでした。
これは、強制アイドルモードを有効にした場合でも同様です。
Pixel 5a 最適化バッテリー有効 電池の最適化有効 強制アイドルモード有効
バックグラウンド動作が制限されるまでには思ったより時間の余裕があること、
また強制アイドルモードを有効にしたからといって、すべてのバックグラウンド動作が制限されるとは限らないことが分かりました。
実験B
どうにかして検証用アプリでバックグラウンド動作に制限がかかる様子が再現できないかと思い、2つめの実験を行いました。
アプリを起動した後端末をスリープ状態にし、1時間程度放置しました。
すると、充電していない場合において30分程度で位置情報が送信されなくなりました。
しかし、その状態で端末を10秒程度振ると、(電源ボタン等を押さずとも)サーバーに再び位置情報が送信されるようになりました。
保留されていたHTTPリクエストが一気に送信される様子
このことから、端末のモーションセンサーで大きな動きを観測した場合は、制限されていたアプリの動作が再開されることが分かりました。
Androidデベロッパー向けドキュメントに、下記のような記述があります。
放置していたデバイスを動かしたり、画面をオンにしたり、充電器に接続したりするなどの動作によってデバイスをアクティブにすると、Doze モードは解除され、すべてのアプリが通常のアクティビティに戻ります。
実験Bにより、この挙動が実証された形です[*2]。
現時点での仮説
以上の結果から、バックグラウンド動作を停止するかどうかの判断材料として下記を用いている可能性が高いと判断できます。
- バッテリー設定(最適化バッテリーの有効/無効など)
- 充電中かそうでないか
- バックグラウンド処理の重さ
- モーションセンサーの状態
今回の実験では、バックグラウンド処理の重さやAndroidバージョンの違いによる影響を明らかにすることはできませんでした。
バックグラウンド処理の「重さ」とは何か、他のアプリが影響を及ぼすことがあるのかなどの詳細な事項を含めると、検証の余地はまだまだ残されています。
追加で判明したことがあり次第、別途記事に書き下ろそうと思います。
「電池の最適化」無効化をユーザーにお願いする選択肢も
上記のような挙動がアプリの主要機能に悪影響を及ぼす場合、バッテリー最適化の対象外ホワイトリストへの登録をアプリ内で要求できるとされています。 参考
弊社のアプリであるiFieldは、継続的に位置情報を取得することがアプリの主要機能に必須であるため、初回起動時にバックグラウンドでの常時実行を要求しています。
[*1] 正確には位置測位のみが制限された場合と、ネットワーク通信も含めてすべてが制限された場合に分けられますが、位置測位とは関係なく1分程度の間隔で空のHTTPリクエストを送ることで2つを区別しています。いわゆるハートビートです。
[*2]モーションセンサーの反応がないから当然位置も動いていないだろうという判断がなされている、すなわちバックグラウンド動作は制限されずに位置測位のみが休止している可能性も考えられますが、先の補足で述べたハートビートもサーバーに到達していなかったため、バックグラウンド動作が制限されたと考えるのが自然です。
地図や位置情報を用いたシステムのご提案・開発ならマルティスープへ
マルティスープは、創業以来のGISとモバイル開発の実績と技術力で、営業支援システムやリサーチ・公共インフラ・工事・警備業界の現場を支援するシステム開発など、地図や位置情報を使った業務システムの導入のご提案や開発をいたします。
現場をつなぐコミュニケーションが屋内外業務のパフォーマンスを最大限に。マルティスープのiField(アイ・フィールド)®シリーズは、屋内外業務の現場の実力を減少させるコミュニケーション障壁を除き、使い慣れたスマートデバイスを使って 現場の実力をリアルに伝えるサービス。
位置・空間情報のエキスパート集団として一緒に働きませんか?
マルティスープは地図情報をはじめとする位置・空間情報技術のエキスパート集団です。当社で日々研究している地図や位置情報といった技術は、災害支援など貢献度の高いシステムとして使用されることもあれば、スマートフォンアプリのゲームとして使われることもあり、その利用用途・価値は、今後もますます広がっていっています。
私たちの企業理念は、「創る喜び、使う喜び」です。
今後の開発体制をより強化するために、新卒・中途問わず、当社の未来を共に創っていただける新メンバーを募集します!
【関連記事】こんな記事も読まれています
2017.01.19
みなさん、こんにちは。
今回は、Distance Matrix API の使い方について説明いたします。・・・
2019.01.13
明けましておめでとうございます。
今年もどうぞよろしくお願いいたします。
さて、今回は書籍のご紹介をした・・・
2017.05.19
みなさん、こんにちは。
Googleマップ上に同心円を書きたいと思ったことはありませんか? 私は、よくあります。
マルティスープで・・・
-
最新記事New Posts
-
人気記事Popular Posts
-
関連タグRelated Tags
-
アーカイブArchive