車庫模式

為了提供車輛空閒時間段,車庫模式使系統保持喚醒狀態,以便可以執行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_PREPARE並將參數設為SHUTDOWN_IMMEDIATELYSLEEP_IMMEDIATELY 。設備實作只能在特定情況下使用此功能,通常是在保持系統運作所需的資源不可用時。例如,當電池容量不足時。

車庫模式

圖 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