車両にアイドル時間を設けるために、ガレージ モードはシステムを起動したままにして、アイドル状態に制限されたJobScheduler
内のジョブを実行できるようにします。
ガレージモードとは何ですか?
電話などの接続されたデバイスでは、ユーザーはデバイスが安定し、最新で、最適化されていることを確認するシステムに依存しています。この状態を実現するために、Android プラットフォームは、ユーザーがデバイスを操作していないときにアプリがタスクを実行できるアイドル時間枠を提供します。ユーザーが長時間 (60 分以上) 電話に触れず、画面がオフになっている場合、電話はアイドル状態であるとみなされます。電話とは異なり、車が使用されていないときは電源がオフになります。つまり、車にはアイドル時間枠がありません。ガレージモードは車内でのアイドリング時間を確保します。
ユーザーが車の電源を切ると、システムはガレージ モードに入ります。車がガレージ モードにある間、システムの電源はオンになり、ディスプレイはオフになり、 JobScheduler
キュー内のアイドル ジョブが実行されます。ガレージ モードを実装するには、 「デバイス実装ガイドライン」を参照してください。
デバイス実装ガイドライン
ガレージ モードをアクティブにするには、車両の電源を切るときに、車両 HAL (VHAL) がSHUTDOWN_PREPARE
状態のAP_POWER_STATE_REQ
を、パラメータをSHUTDOWN_ONLY
またはCAN_SLEEP
に設定して送信する必要があります。
SHUTDOWN_PREPARE
状態を有効にするには、VHAL がAP_POWER_STATE_REQ
コマンドに 2 つのパラメータ (状態と追加パラメータ) を指定する必要があります。これにより、デバイスはガレージ モードに移行できるようになり、 JobScheduler
でスケジュールされたジョブが検出され、ジョブが完了するまでシステムが一時停止またはシャットダウンに進むことがなくなります。
デバイス実装はどのように Android フレームワークに接続しますか?
ガレージ モードの場合、フレームワークは、必要な期間を超えるか、すべてのジョブが実行されるまでシャットダウン時間を延長するよう VHAL に要求します。その時点でシステムはシャットダウンします。 CDD で定義された特定の状況下では、デバイス実装によりシステムがより早くシャットダウンされる可能性があります。 Android 互換性要件の詳細については、Android互換性定義ドキュメント (CDD)を参照してください。
ガレージ モードが完了する前に VHAL がシステムをシャットダウンする必要がある場合、VHAL はパラメータをSHUTDOWN_IMMEDIATELY
またはSLEEP_IMMEDIATELY
に設定してSHUTDOWN_PREPARE
を発行できます。デバイス実装は、特定の状況下でのみこれを使用できます。通常は、システムの実行を維持するために必要なリソースが利用できない場合です。たとえば、バッテリーの容量が足りないとき。
図 1.ガレージ モードのフロー
アプリ開発者はガレージ モードをどのように操作しますか?
アプリとサービスはガレージ モードと直接対話しません。代わりに、アプリはJobScheduler
でジョブをスケジュールします。アイドル状態によって制約されるジョブは、ガレージ モード中に実行されます。
次のコードは、ガレージ モード中にジョブを実行するようにスケジュールする方法を示しています。
public class MyGarageModeJob extends JobService { ... } Context context = ...; int jobId = ...; ComponentName myGarageModeJobName = new componentName(context, MyGarageModeJob.class); JobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName) .setRequiresDeviceIdle(true); // Example of an optional constraint: infoBuilder.setRequiredNetworkType(NetworkType.NETWORK_TYPE_UNMETERED); JobScheduler jobScheduler = (JobScheduler) context .getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(infoBuilder.build());
デバッグガレージモード
ガレージ モードをデバッグするには:- ガレージ モードに関連するログ カテゴリを有効にするには:
adb shell stop adb shell setprop log.tag.GarageMode VERBOSE adb shell setprop log.tag.Finsky VERBOSE adb shell setprop log.tag.CAR.POWER VERBOSE adb shell setprop log.tag.JobScheduler.Connectivity VERBOSE adb shell start
- logcat 出力を確認してガレージ モードが開始していることを確認するには:
GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE GarageMode: [GarageMode]: Entering GarageMode GarageMode: [Controller]: Sending broadcast with action: com.android.server.jobscheduler.GARAGE_MODE_ON
- ガレージ モードの終了 (キャンセルまたは完了) を示す logcat 出力を確認するには:
[GarageMode]: GarageMode was canceled
または[GarageMode]: GarageMode completed normally
ガレージ モードは、前述したように車両の電源状態によって異なります。
- logcat 出力を確認して、正しい電源状態が入力されていることを示します:
CAR.POWER: starting shutdown prepare without Garage Mode GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE GarageMode: [GarageMode]: Entering GarageMode CAR.POWER: send shutdown prepare CAR.POWER: setPowerState=SHUTDOWN_PREPARE(7) param=0