ガレージモード

車両のアイドル時間を提供するために、ガレージモードはシステムを起動状態に保ち、アイドル状態に制約されたJobSchedulerのジョブを実行できるようにします。

ガレージモードとは何ですか?

電話などの接続されたデバイスでは、ユーザーはシステムを利用して、デバイスが安定し、最新で、最適化されていることを確認します。その状態を実現するために、Androidプラットフォームは、ユーザーがデバイスを操作していないときにアプリケーションがタスクを実行できるアイドル時間枠を提供します。ユーザーが長時間(60分以上)電話に触れず、画面がオフになっている場合、電話はアイドル状態であると見なされます。電話とは異なり、車が使用されていないときはオフになっています。つまり、車にはアイドル時間枠がありません。ガレージモードは、車のアイドル時間を確保します。

ユーザーが車の電源を切ると、システムはガレージモードになります。車がガレージモードになっている間、システムの電源がオンになり、ディスプレイがオフになり、JobSchedulerキュー内のアイドル状態のジョブが実行されます。ガレージモードを実装するには、以下のデバイス実装ガイドラインを参照してください。

デバイス実装ガイドライン

ガレージモードをアクティブにするには、車両の電源を切るときに、車両HAL(VHAL)が、パラメータがSHUTDOWN_ONLYまたはCAN_SLEEPに設定された状態SHUTDOWN_PREPAREAP_POWER_STATE_REQを送信する必要があります。

状態SHUTDOWN_PREPAREを有効にするには、VHALでAP_POWER_STATE_REQコマンドの2つのパラメーター(状態と追加パラメーター)を指定する必要があります。これにより、デバイスはガレージモードに入ることができます。ガレージモードは、 JobSchedulerでスケジュールされたジョブを検出し、ジョブが完了するまでシステムが一時停止またはシャットダウンに進むのを防ぎます。

デバイスの実装はどのようにAndroidフレームワークに接続しますか?

ガレージモードの場合、フレームワークはVHALに、必要な期間を超えるか、すべてのジョブが実行されるまでシャットダウン時間を延長するように要求します。その時点で、システムはシャットダウンされます。 CDDで定義されている特定の状況では、デバイスの実装によりシステムをより早くシャットダウンできます。 (Android互換性要件の詳細については、Android互換性定義ドキュメント(CDD)を参照してください。)ガレージモードが完了する前にVHALがシステムをシャットダウンする必要がある場合、VHALはパラメーターをSHUTDOWN_IMMEDIATELYまたはSLEEP_IMMEDIATELYに設定してSHUTDOWN_PREPAREを発行できます。デバイスの実装では、特定の状況でのみこれを使用できます。通常、システムの実行を維持するために必要なリソースが利用できない場合です。たとえば、バッテリー容量が不足している場合。

ガレージモード

アプリケーション開発者はガレージモードでどのように作業しますか?

アプリケーションとサービスは、ガレージモードと直接対話しません。代わりに、アプリは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出力を確認して、正しい電源状態が入力されていることを示します。l10n
    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