フォアグラウンドとバックグラウンドのユーザー システム処理

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 に残っている場合は、そのユーザーのジョブを実行できます。