ガレージモード

車両にアイドル時間を設けるために、ガレージ モードはシステムを起動したままにして、アイドル状態に制限された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());

デバッグガレージモード

ガレージ モードをデバッグするには:
  1. ガレージ モードに関連するログ カテゴリを有効にするには:
    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
    
  2. 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
    
  3. ガレージ モードの終了 (キャンセルまたは完了) を示す logcat 出力を確認するには:
    [GarageMode]: GarageMode was canceled
    
    または
    [GarageMode]: GarageMode completed normally
    

    ガレージ モードは、前述したように車両の電源状態によって異なります

  4. 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