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

モバイル Android では、複数のユーザーのサポートにより、ユーザーはバックグラウンド (別のユーザーがアクティブなとき) とフォアグラウンド (現在のユーザーとも呼ばれます) で実行できるようになります。必要に応じてリソースを節約するために、システムはユーザーのシャットダウンを管理します。常に 1 人のフォアグラウンド ユーザーが必要です

Android 10 以降、Android Automotive のデフォルト構成では、一度に最大 3 ユーザーのみの実行が許可されます ( config_multiuserMaxRunningUsers )。したがって、ヘッドレス システム ユーザー (ユーザー 0) に加えて、フォアグラウンド ユーザーとバックグラウンド ユーザーを 1 つだけ設定できます。

  • 一般的な状況では、現在のユーザーがフォアグラウンドで実行され、ヘッドレス システム ユーザー (ユーザー 0) がバックグラウンドで実行されます。ユーザーがバックグラウンドに移動すると、ユーザーは停止しますが、ロックはされません。ユーザーの最大数に達すると、最も最近使用されていないバックグラウンド ユーザーが停止され、ロックされます ( config_multiuserDelayUserDataLocking )。
  • バックグラウンドで停止およびロック解除されたユーザーは、ガレージ モード中に再起動されます。

ゲスト ユーザーは一時的なものであり、フォアグラウンドでのみ実行できます。ユーザーがゲストから切り替えると、ゲスト ユーザーは停止され、バックグラウンドで実行できなくなります。

バックグラウンドユーザープロセス

ユーザーがフォアグラウンドからバックグラウンドに (またはその逆に) 切り替えると、そのユーザーのすべてのアクティビティとフォアグラウンド サービスが終了します。これにより、それらのサービスからバインドされているすべてのサービスが停止します。ただし、いくつかのクリーンアップが残っています。ファースト パーティおよび OEM システム アプリからの 永続サービスは、 (現在はバックグラウンドの) ユーザーが停止しない限り実行され続けます。

永続的なサービスは、Android のメモリ不足 (OOM) 管理システムの優先度の高いバケットに含まれているため、さらに問題が発生します。フォアグラウンド ユーザーのアプリがより多くのメモリを必要とする場合でも、それらの永続的なバックグラウンド プロセスは終了されません。その結果、フォアグラウンド ユーザーの観点から見ると、永続的なサービスは一定量のメモリを永続的に切り出し、そのメモリは人が車を再起動し、バックグラウンド ユーザーが停止した場合にのみ返されます。

ユーザー状態

ユーザーは、開始されるまで停止状態 ( STATE_SHUTDOWN ) になります。ユーザー資格情報 (PIN など) が設定されている場合、Android ユーザーは実行されますが、誰かがそのユーザーのロック画面のロックを解除するまでロックされたままになります ( STATE_RUNNING_LOCKED )。ユーザーのロックが解除されると、資格情報で暗号化されたストレージが復号化され、そのユーザーのデータ ディレクトリが使用可能になります。一般的なユーザーの切り替えでは、バックグラウンド ユーザーは停止されず、ロックが解除されると実行状態を維持し、ロックが解除されます ( STATE_RUNNING_UNLOCKED )。

ガレージ モード、ジョブスケジューラ、ユーザー向けアプリのアップデート

Automotive アプリがデータを更新する場合に推奨される手法は、 JobSchedulerを使用して、デバイスがアイドル状態のときに、ガレージ モードを通じて実行されるジョブをスケジュールすることです (たとえば、Google Play ストアからのアプリ更新のダウンロード)。アプリが JobScheduler および JobSchedulerService にジョブを登録すると、可能な場合にはジョブが実行されます。

CarService は、自動車デバイスがガレージ モードでアイドル状態のときに実行するように設定されたジョブをトリガーするために、JobSchedulerService に信号を送信します。 JobSchedulerService がバックグラウンド ユーザーのジョブを実行するには、そのユーザーがSTATE_RUNNING_UNLOCKED状態である必要があります。 JobSchedulerService のキューに入れられたジョブは保持され、電源を入れ直しても存続します。

電源を入れ直してもユーザーのロックが解除されていない場合、JobScheduler は特定のユーザーのジョブを実行できません。ただし、ロックが解除され、ユーザーがSTATE_RUNNING_UNLOCKEDのままであれば、そのユーザーのジョブを実行できます。