自動車のアイドル時間を提供するために、ガレージモードはシステムの起動状態を維持し、アイドル状態で制約された JobScheduler
のジョブを実行できるようにします。
ガレージモードとは
スマートフォンなどのコネクテッド デバイスでは、デバイスを安定した最新の最適化された状態に保つため、ユーザーはもっぱらシステムに頼ります。その状態を達成するために、Android プラットフォームは、ユーザーがデバイスを操作していないときにアプリがタスクを実行できるアイドル時間枠を提供します。スマートフォンは、ユーザーが長時間(60 分以上)触らないとアイドル状態であると見なされ、画面がオフになります。自動車は、スマートフォンと異なり、使用しないときはエンジンを切ります。つまり、自動車にはアイドル時間枠がありません。ガレージモードは、自動車のアイドル時間を提供します。
ユーザーが自動車のエンジンを切ると、システムはガレージモードに入ります。自動車がガレージモードになると、システムの電源がオン、ディスプレイがオフになり、JobScheduler
キューのアイドルジョブが実行されます。ガレージモードを実装するには、下記のデバイス実装のガイドラインをご覧ください。
デバイス実装のガイドライン
ガレージモードを有効にするには、自動車のエンジンを切る際に、車両 HAL(VHAL)が AP_POWER_STATE_REQ
を SHUTDOWN_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());
ガレージモードのデバッグ
ガレージモードをデバッグする手順は次のとおりです。- ガレージモードに関連するロギング カテゴリを有効にします。
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