ガレージモード

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

ガレージモードとは

スマートフォンなどのコネクテッド デバイスでは、デバイスを安定した最新の最適化された状態に保つため、ユーザーはもっぱらシステムに頼ります。その状態を達成するために、Android プラットフォームは、ユーザーがデバイスを操作していないときにアプリがタスクを実行できるアイドル時間枠を提供します。スマートフォンは、ユーザーが長時間(60 分以上)触らないとアイドル状態であると見なされ、画面がオフになります。自動車は、スマートフォンと異なり、使用しないときはエンジンを切ります。つまり、自動車にはアイドル時間枠がありません。ガレージモードは、自動車のアイドル時間を提供します。

ユーザーが自動車のエンジンを切ると、システムはガレージモードに入ります。自動車がガレージモードになると、システムの電源がオン、ディスプレイがオフになり、JobScheduler キューのアイドルジョブが実行されます。ガレージモードを実装するには、下記のデバイス実装のガイドラインをご覧ください。

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

ガレージモードを有効にするには、自動車のエンジンを切る際に、車両 HAL(VHAL)が AP_POWER_STATE_REQSHUTDOWN_PREPARE 状態で、パラメータを 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