モバイル Android では、複数のユーザーがサポートされているため、ユーザーはバックグラウンド(アクティブなユーザーが別にいる場合)でもフォアグラウンド(現在のユーザーとも呼ばれます)でも実行できます。状況に応じてリソースを節約するために、システムがユーザーのシャットダウンを管理します。フォアグラウンド ユーザーは常に 1 人必要です。
Android 10 以降、Android Automotive のデフォルト構成では、一度に実行可能なユーザー数は最大 3 人に限られています(config_multiuserMaxRunningUsers
)。したがって、ヘッドレス システム ユーザー(ユーザー 0)以外に設定できるのは、フォアグラウンド ユーザー 1 人とバックグラウンド ユーザー 1 人のみとなります。
- 一般的な状況では、現在のユーザーをフォアグラウンドで実行し、ヘッドレス システム ユーザー(ユーザー 0)をバックグラウンドで実行します。バックグラウンドに移ったユーザーは、停止されますがロックはされません。ユーザーの最大数に達すると、最近の使用頻度が最も低いバックグラウンド ユーザーが停止されロックされます(
config_multiuserDelayUserDataLocking
)。 - 停止およびロック解除されたバックグラウンド ユーザーは、ガレージモード中に再起動します。
ゲストユーザーは一時的なものであり、フォアグラウンドでのみ実行できます。ゲストから抜けると、ゲストユーザーは停止されます。バックグラウンドでは実行できません。
バックグラウンド ユーザー プロセス
ユーザーがフォアグラウンドからバックグラウンド(またはその逆)に切り替えられると、そのユーザーのすべてのアクティビティとフォアグラウンド サービスが終了します。これにより、これらのサービスからバインドされるすべてのサービスが停止します。ただし、ある程度のクリーンアップは残ります。ファースト パーティおよび OEM のシステムアプリの永続サービスは、(その時点でバックグラウンドとなっている)ユーザーが停止しない限り引き続き実行されます。
永続サービスは、Android のメモリ不足(OOM)管理システムにおいて優先度の高いバケットに含まれるため、大きな問題となることがあります。フォアグラウンド ユーザーのアプリがさらに多くのメモリを必要としていても、これらの永続的なバックグラウンド プロセスが終了されることはありません。その結果、フォアグラウンド ユーザーの観点からは、永続サービスが永久にメモリの一部を占有しており、そのメモリは、車両が再起動され、すべてのバックグラウンド ユーザーが停止しない限り、返されません。
ユーザーの状態
開始前のユーザーは停止状態(STATE_SHUTDOWN
)にあります。ユーザー認証情報(PIN など)が設定されている場合、Android ユーザーは実行されますが、そのユーザーのロック画面がロック解除されるまではロックされたままになります(STATE_RUNNING_LOCKED
)。ユーザーがロック解除すると、暗号化された認証情報のストレージが復号され、そのユーザーのデータ ディレクトリが利用可能になります。一般的なユーザー切り替えでは、バックグラウンド ユーザーは、一度ロック解除されると、停止せず実行およびロック解除されたままになります(STATE_RUNNING_UNLOCKED
)。
ユーザーのガレージモード、JobScheduler、アプリ アップデート
Automotive アプリでデータを更新する場合には、ガレージモードを介して JobScheduler
を使用し、デバイスがアイドル状態のときにのみジョブが実行されるようにスケジューリングする方法が推奨されます(Google Play からアプリ アップデートをダウンロードする場合など)。アプリが JobScheduler
と JobSchedulerService
にジョブを登録すると、可能なときにそのジョブが実行されます。
CarService は、ガレージモードを介してシグナルを JobSchedulerService
に送信し、Automotive デバイスがアイドル状態のときに実行されるように設定されているジョブをトリガーします。JobSchedulerService
でバックグラウンド ユーザーのジョブを実行するには、そのユーザーが STATE_RUNNING_UNLOCKED
状態になっている必要があります。JobSchedulerService
にキュー登録されたジョブは、電源をオフにして再度オンにした後でも保持されて存続します。
電源をオフにして再度オンにした後にユーザーのロックが解除されなかった場合、JobScheduler
はそのユーザーのジョブを実行できません。ただし、ロックが解除されたときにユーザーが STATE_RUNNING_UNLOCKED
に残っている場合は、そのユーザーのジョブを実行できます。