車庫模式

為了在車輛中提供空閒時間段,車庫模式使系統保持清醒,以便可以執行受空閒限制的JobScheduler中的作業。

什麼是車庫模式?

在手機等連接設備上,用戶依靠系統來確保設備穩定、最新和優化。為了實現這種狀態,Android 平台提供了一個空閒時間窗口,在此期間應用程序可以在用戶不與設備交互時執行任務。當用戶長時間(60 分鐘或更長時間)不觸摸手機並且屏幕關閉時,手機被認為處於空閒狀態。與電話不同的是,當汽車不使用時,它會關閉,這意味著汽車沒有空閒時間窗口。車庫模式確保車內的空閒時間。

當用戶關閉汽車時,系統進入車庫模式。當汽車處於車庫模式時,系統會打開電源,顯示屏會關閉,並且會執行 JobScheduler 隊列中的空閒作業。要實施車庫模式,請參閱下面的設備實施指南

設備實施指南

要激活車庫模式,在關閉車輛時,車輛 HAL ( AP_POWER_STATE_REQ ) 必鬚髮送狀態為SHUTDOWN_PREPARE且參數設置為SHUTDOWN_ONLY或 CAN_SLEEP 的CAN_SLEEP

為了使狀態SHUTDOWN_PREPARE有效,VHAL 必須為AP_POWER_STATE_REQ命令指定兩個參數(狀態和附加參數)。這使設備能夠進入車庫模式,該模式檢測JobScheduler中的計劃作業並防止系統繼續掛起或關閉,直到作業完成。

設備實現如何連接到 Android 框架?

對於車庫模式,框架請求 VHAL 延長關閉時間,直到超過所需的持續時間或所有作業都已執行,此時系統將關閉。在 CDD 中定義的特定情況下,設備實現可以更快地關閉系統。 (有關 Android 兼容性要求的詳細信息,請參閱 Android兼容性定義文檔 (CDD) 。)如果 VHAL 必須在車庫模式完成之前關閉系統,則 VHAL 可以發出SHUTDOWN_PREPARE參數設置為SHUTDOWN_IMMEDIATELYSLEEP_IMMEDIATELY 。設備實現只能在特定情況下使用它,通常是在保持系統運行所需的資源不可用時。例如,當電池容量不足時。

車庫模式

應用程序開發人員如何使用車庫模式?

應用程序和服務不直接與車庫模式交互。相反,應用程序在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