차량에 유휴 시간을 제공하기 위해 Garage Mode는 시스템을 절전 모드 해제 상태로 유지하여 유휴 상태로 제한된 JobScheduler의 작업을 실행할 수 있습니다.
차고 모드란?
스마트폰과 같이 연결된 기기에서 사용자는 시스템을 사용하여 기기가 안정적이고, 최신 상태이고, 최적화되어 있는지 확인합니다. 이러한 상태에 도달하기 위해 Android 플랫폼은 사용자가 기기와 상호작용하지 않을 때 앱이 작업을 실행할 수 있는 유휴 시간 기간을 제공합니다. 사용자가 스마트폰을 장시간 (60분 이상) 터치하지 않고 화면이 꺼지면 스마트폰은 유휴 상태로 간주됩니다. 스마트폰과 달리 자동차를 사용하지 않을 때는 시동이 꺼집니다. 즉, 차량에는 유휴 시간 기간이 없습니다. 차고 모드는 자동차에서 유휴 시간을 보장합니다.
사용자가 자동차의 시동을 끄면 시스템이 차고 모드로 전환됩니다. 자동차가 차고 모드일 때는 시스템 전원이 켜져 있고, 디스플레이는 꺼져 있으며, JobScheduler 큐에 있는 유휴 작업이 실행됩니다. 차고 모드를 구현하려면 기기 구현 가이드라인을 참고하세요.
기기 구현 가이드라인
차고 모드를 활성화하려면 차량 시동을 끌 때 차량 HAL (VHAL)이 SHUTDOWN_PREPARE 상태를 사용하고 SHUTDOWN_ONLY 또는 CAN_SLEEP으로 설정된 매개변수를 사용하여 AP_POWER_STATE_REQ를 전송해야 합니다.
SHUTDOWN_PREPARE 상태가 유효하려면 VHAL이 AP_POWER_STATE_REQ 명령어에 두 매개변수(상태 및 추가 매개변수)를 지정해야 합니다. 그러면 기기가 차고 모드로 전환되어, JobScheduler에서 예약된 작업을 감지하고 작업이 완료될 때까지 시스템이 정지 또는 종료 상태로 전환되지 않도록 방지합니다.
기기 구현이 Android 프레임워크에 어떻게 연결되나요?
차고 모드의 경우 프레임워크는 필요한 지속 시간이 초과되거나 모든 작업이 실행될 때까지(이때가 되면 시스템은 종료됨) 시스템 종료 시간을 연장하도록 VHAL에 요청합니다. CDD에 정의된 특정 상황에서 기기 구현은 시스템을 더 빨리 종료할 수 있습니다. Android 호환성 요구사항에 관한 자세한 내용은 Android 호환성 정의 문서 (CDD)를 참고하세요.
차고 모드가 완료되기 전에 VHAL이 시스템을 종료해야 하는 경우 VHAL은 SHUTDOWN_IMMEDIATELY 또는 SLEEP_IMMEDIATELY로 설정된 매개변수를 사용하여 SHUTDOWN_PREPARE를 실행할 수 있습니다. 기기 구현은 일반적으로 시스템을 계속 실행 상태로 유지하는 데 필요한 리소스를 사용할 수 없는 등의 특정 상황에 한해서만 이 매개변수를 사용할 수 있습니다. 예를 들어 배터리 용량이 부족한 경우가 해당됩니다.
그림 1. 차고 모드 흐름
앱 개발자는 차고 모드를 어떻게 사용하나요?
앱과 서비스는 차고 모드와 직접 상호작용하지 않습니다. 대신 앱은 JobScheduler에서 작업을 예약합니다.
유휴 상태로 제한된 작업은 차고 모드 중에 실행됩니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# Garage Mode\n\nTo provide periods of idle time in vehicles, *Garage Mode* keeps the system\nawake so that jobs in\n[`JobScheduler`](https://developer.android.com/reference/android/app/job/JobScheduler) constrained with\n[idleness](https://developer.android.com/reference/android/app/job/JobInfo.Builder#setRequiresDeviceIdle(boolean)) can be executed.\n\nWhat is Garage Mode?\n--------------------\n\n\nOn connected devices such as phones, users rely on the system to ensure devices\nare stable, up-to-date, and optimized. To achieve that state, the Android platform\nprovides an\n[idle\ntime](https://developer.android.com/reference/android/app/job/JobInfo.Builder#setRequiresDeviceIdle(boolean))\nwindow during which apps can perform tasks when the user doesn't\ninteract with the device. A phone is considered to be *idle* when the user doesn't touch\nit for an extended duration (60 minutes or more) and the screen is turned off.\nUnlike a phone, when a car isn't being used, it's turned off, which means the car\nhas no\n[idle time](https://developer.android.com/reference/android/app/job/JobInfo.Builder#setRequiresDeviceIdle(boolean))\nwindow. Garage Mode ensures idle time in a car.\n\n\nWhen a car is turned off by the user, the system enters Garage Mode. While a\ncar is in Garage Mode, the system is powered on, the display is turned off, and\nidle jobs in the `JobScheduler` queue are executed. To implement Garage Mode, see\n[Device implementation guidelines](/docs/automotive/power/garage_mode#device).\n\nDevice implementation guidelines\n--------------------------------\n\n\nTo activate Garage Mode, when turning off the vehicle, the Vehicle HAL (VHAL)\nmust send\n[AP_POWER_STATE_REQ](https://developer.android.com/reference/android/car/VehiclePropertyIds.html#AP_POWER_STATE_REQ) with the state `SHUTDOWN_PREPARE`\nwith the parameter set to `SHUTDOWN_ONLY` or `CAN_SLEEP`.\n\n\nFor the state `SHUTDOWN_PREPARE` to be effective, the VHAL must specify the two\nparameters (state and the additional parameter) for the [AP_POWER_STATE_REQ](https://developer.android.com/reference/android/car/VehiclePropertyIds.html#AP_POWER_STATE_REQ) command. This enables the device to enter Garage Mode,\nwhich detects scheduled jobs in\n[`JobScheduler`](https://developer.android.com/reference/android/app/job/JobScheduler)\nand prevents the system from proceeding to either suspend or shut down until the jobs\nare completed.\n\nHow do device implementations connect to the Android framework?\n---------------------------------------------------------------\n\n\nFor Garage Mode, the framework requests the VHAL to extend the shutdown time\nuntil either the required duration is exceeded or all jobs have been executed,\nat which time the system shuts down. Under specific circumstances defined\nin the CDD, device implementations can shut down the system sooner. For details\non Android compatibility requirements, see the Android\n[Compatibility Definition Document (CDD)](/docs/compatibility/cdd).\n\nIf the VHAL must shut down the system before Garage Mode completes, the VHAL can issue\n`SHUTDOWN_PREPARE` with the parameter set to\n`SHUTDOWN_IMMEDIATELY` or `SLEEP_IMMEDIATELY`. Device\nimplementations can use this under specific circumstances *only*, typically\nwhen the resources needed to keep the system running are unavailable. For\nexample, when battery capacity is insufficient.\n\n**Figure 1.** Garage Mode flow\n\nHow do app developers work with Garage Mode?\n--------------------------------------------\n\n\nApps and services don't interact directly with Garage Mode. Instead,\napps schedule jobs in\n[`JobScheduler`](https://developer.android.com/reference/android/app/job/JobScheduler).\nThose jobs constrained by\n[idleness](https://developer.android.com/reference/android/app/job/JobInfo.Builder#setRequiresDeviceIdle(boolean)) are executed during Garage Mode.\n\nThe following code shows how to schedule a job to run during Garage Mode: \n\n```gdscript\npublic class MyGarageModeJob extends JobService { ... }\n\nContext context = ...;\nint jobId = ...;\n\nComponentName myGarageModeJobName = new componentName(context,\n MyGarageModeJob.class);\n\nJobInfo.Builder infoBuilder = new JobInfo.Builder(jobId, myGarageModeJobName)\n .setRequiresDeviceIdle(true);\n\n// Example of an optional constraint:\ninfoBuilder.setRequiredNetworkType(NetworkType.NETWORK_TYPE_UNMETERED);\n\nJobScheduler jobScheduler = (JobScheduler) context\n .getSystemService(Context.JOB_SCHEDULER_SERVICE);\n\njobScheduler.schedule(infoBuilder.build());\n```\n\nDebug Garage Mode\n-----------------\n\nTo debug Garage Mode:\n\n1. To enable logging categories relevant to Garage Mode: \n\n ```\n adb shell stop\n adb shell setprop log.tag.GarageMode VERBOSE\n adb shell setprop log.tag.Finsky VERBOSE\n adb shell setprop log.tag.CAR.POWER VERBOSE\n adb shell setprop log.tag.JobScheduler.Connectivity VERBOSE\n adb shell start\n ```\n | Stopping and starting Android services ensures log availability from service boot.\n2. To review the logcat output to indicate that Garage Mode is starting: \n\n ```transact-sql\n GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE\n GarageMode: [GarageMode]: Entering GarageMode\n GarageMode: [Controller]: Sending broadcast with action: com.android.server.jobscheduler.GARAGE_MODE_ON\n ```\n3. To determine that logcat output to indicate Garage Mode is finished (canceled or completed): \n\n ```transact-sql\n [GarageMode]: GarageMode was canceled\n ```\n *or* \n\n ```transact-sql\n [GarageMode]: GarageMode completed normally\n ```\n\n Garage Mode depends on the power state of the vehicle as described\n [above.](#how-do-device-implementations-connect-to-the-android-framework)\n4. Review the logcat output to indicate the correct power states are entered: \n\n ```transact-sql\n CAR.POWER: starting shutdown prepare without Garage Mode\n GarageMode: [Controller]: CPM state changed to SHUTDOWN_PREPARE\n GarageMode: [GarageMode]: Entering GarageMode\n CAR.POWER: send shutdown prepare\n CAR.POWER: setPowerState=SHUTDOWN_PREPARE(7) param=0\n ```"]]