車庫模式

為了讓車輛有一段閒置時間,車庫模式會讓系統保持運作,以便執行JobScheduler 中受閒置時間限制的工作。

什麼是車庫模式?

在手機等連網裝置上,使用者會依賴系統確保裝置穩定、更新及最佳化。為達到這個狀態,Android 平台會提供閒置時間視窗,讓應用程式在使用者未與裝置互動時執行工作。當使用者長時間 (60 分鐘以上) 未觸碰手機,且螢幕已關閉時,系統會將手機視為閒置狀態。與手機不同的是,汽車在未使用時會關機,因此沒有閒置時間視窗。車庫模式可確保車輛在車庫內的閒置時間。

當使用者關閉車輛時,系統會進入車庫模式。車輛處於車庫模式時,系統會開啟,螢幕會關閉,並執行 JobScheduler 佇列中的閒置工作。如要導入車庫模式,請參閱裝置導入指南

裝置實作指南

如要啟用車庫模式,在關閉車輛時,車輛 HAL (VHAL) 必須傳送 AP_POWER_STATE_REQ,狀態為 SHUTDOWN_PREPARE,參數設為 SHUTDOWN_ONLYCAN_SLEEP

為了讓狀態 SHUTDOWN_PREPARE 生效,VHAL 必須為 AP_POWER_STATE_REQ 指令指定兩個參數 (狀態和額外參數)。這樣裝置就能進入車庫模式,在 JobScheduler 中偵測排定的作業,並在作業完成前,防止系統繼續進入暫停或關機狀態。

裝置實作項目如何連線至 Android 架構?

針對車庫模式,架構會要求 VHAL 延長關機時間,直到超過所需的時間長度或執行所有工作為止,系統就會關機。在 CDD 中定義的特定情況下,裝置實作項目可以提早關閉系統。如要進一步瞭解 Android 相容性要求,請參閱 Android 相容性定義說明文件 (CDD)

如果 VHAL 必須在車庫模式完成前關閉系統,則 VHAL 可以將參數設為 SHUTDOWN_IMMEDIATELYSLEEP_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