Android 프레임워크를 통해 기기 제조업체와 앱 개발자는 열 데이터를 사용하여 기기가 과열되기 시작하는 경우에도 사용자 환경(UX)을 일관되게 유지할 수 있습니다. 예를 들어 시스템에 열 응력이 발생하는 경우 jobscheduler
작업에 제한이 걸리며 필요한 경우 프레임워크 열 종료가 시작됩니다. PowerManager
클래스의 등록된 콜백을 통해 열 응력 알림을 받는 앱은 UX를 안정적으로 조정할 수 있습니다.
열 HAL
Android 9 이하에서는 Thermal HAL 1.0에 정의된 폴링 인터페이스를 사용하여 온도 측정치를 가져옵니다. 이 HAL의 경우 Android 프레임워크 및 신뢰할 수 있는 기타 클라이언트(예: 기기 제조업체의 HAL)에서 동일한 API를 통해 각 센서의 현재 온도, 제품 정책 관련 제한 및 종료 임곗값을 읽을 수 있었습니다.
Android 10에서는 Android 프레임워크의 열 시스템을 도입하고 열 하위 시스템 하드웨어 기기의 인터페이스를 추상화하는 새 버전의 HAL인 Thermal HAL 2.0을 도입했습니다. 하드웨어 인터페이스에는 스킨, 배터리, GPU, CPU, USB 포트용 온도 센서와 서미스터가 포함됩니다. 기기 스킨 온도는 기기 표면 온도를 지정된 온도 범위 내로 유지하기 위해 추적해야 하는 가장 중요한 시스템입니다.
또한 Thermal HAL 2.0은 여러 클라이언트에 열 센서 측정치 및 연결된 심각도 수준을 제공하여 열 응력을 나타냅니다. 다음 그림은 Android 시스템 UI의 경고 메시지 두 개를 보여줍니다. 이러한 메시지는 USB_PORT
및 SKIN
센서의 IThermalEventListener
콜백 인터페이스가 각각 THERMAL_STATUS_EMERGENCY
심각도 수준에 도달할 때 표시됩니다.
그림 1. 과열 경고
IThermal HAL을 통해 서로 다른 유형의 열 센서와 관련하여 현재 온도를 가져옵니다. 각 함수 호출은 SUCCESS
또는 FAILURE
의 상태 값을 반환합니다. SUCCESS
가 반환되면 프로세스가 계속됩니다. FAILURE
가 반환되면 인간이 읽을 수 있어야 하는 오류 메시지가 status.debugMessage
로 전송됩니다.
현재 온도를 반환하는 폴링 인터페이스인 것 외에도 콜백 IThermalChangedCallback
(HIDL, Android 10~13) 또는 IThermalChangedCallback
(AIDL, Android 14 이상)은 프레임워크의 열 서비스와 같은 열 HAL 클라이언트의 콜백 인터페이스와 함께 사용할 수 있습니다. 예를 들어 RegisterIThermalChangedCallback
및 UnregisterIThermalChangedCallback
은 심각도 변경 이벤트를 등록하거나 등록 취소합니다. 특정 센서의 열 심각도가 변경된 경우 notifyThrottling
은 열 이벤트 리스너에 열 제한 이벤트 콜백을 전송합니다.
열 센서 정보 외에도 열 완화가 진행되어 온도가 낮아지는 기기의 목록이 getCurrentCoolingDevices
에 표시됩니다. 이 목록의 순서는 온도가 낮아지는 기기가 오프라인 상태가 되더라도 유지됩니다. 기기 제조업체는 이 목록을 사용하여 statsd
측정항목을 수집할 수 있습니다.
자세한 내용은 참조 구현을 참고하세요.
자체 확장 프로그램을 추가할 수 있지만 열 완화 기능은 사용 중지하면 안 됩니다.
열 서비스
Android 10 이상에서는 프레임워크의 열 서비스가 Thermal HAL 2.0의 다양한 완화 신호를 사용하여 지속적인 모니터링을 제공하며 제한 심각도 피드백을 클라이언트에 제공합니다. 이러한 클라이언트에는 내부 구성요소와 Android 앱이 포함됩니다. 이 서비스는 콜백으로 표시되는 IThermalEventListener
와 IThermalStatusListener
라는 바인더 콜백 인터페이스 두 가지를 사용합니다. 전자는 내부 플랫폼 및 기기 제조업체용이고 후자는 Android 앱용입니다.
콜백 인터페이스를 통해 기기의 현재 열 상태를 0x00000000
(제한 없음)~0x00000006
(기기 종료) 범위의 정숫값으로 검색할 수 있습니다. Android API 또는 기기 제조업체 API처럼 신뢰할 수 있는 시스템 서비스만 열 센서 및 열 이벤트 상세 정보에 액세스할 수 있습니다. 다음 그림은 Android 10 이상의 열 완화 프로세스 흐름 모델을 보여줍니다.
그림 2. Android 10 이상에 적용되는 열 완화 프로세스 흐름
기기 제조업체 가이드라인
Android 10~13의 기기 온도 센서와 제한 상태를 보고하려면 기기 제조업체는 Thermal HAL 2.0(IThermal.hal
)의 HIDL 측면을 구현해야 합니다.
Android 14의 기기 온도 센서와 제한 상태를 보고하려면 기기 제조업체는 Thermal HAL 2.0(IThermal.aidl
)의 AIDL 측면을 구현해야 합니다.
배터리 전원 제약 등 기기 성능을 제한하는 요소는 열 HAL을 통해 보고되어야 합니다. 이렇게 하려면 상태 변경을 기반으로 완화가 필요할 수 있는 모든 센서를 열 HAL로 통합하고 실행된 완화 작업의 심각도를 보고합니다. 상응하는 심각도 임곗값을 정확히 반영하는 한, 센서 측정치에서 반환된 온도 값이 실제 온도와 반드시 일치할 필요는 없습니다. 예를 들어 실제 온도 임곗값 대신 다른 수치 값을 전달하거나 임곗값 사양에 보호 대역을 빌드하여 이력 현상을 제공할 수 있습니다. 하지만 이 값에 상응하는 심각도는 이 임곗값에서 필요한 것과 일치해야 합니다. 예를 들어 실제 온도가 65°C이고 지정된 중요 심각도에 해당하는 경우 중요 온도 임곗값으로 72°C를 반환할 수 있습니다. 심각도 수준은 최적의 열 프레임워크 기능을 위해 늘 정확해야 합니다.
프레임워크의 임곗값 수준과 이 수준이 완화 조치에 상응하는 방법에 관한 자세한 내용은 열 상태 코드 사용을 참고하세요.
열 API 사용
앱은 리스너를 추가 및 제거하고 PowerManager
클래스를 통해 열 상태 정보에 액세스할 수 있습니다.
IThermal
인터페이스는 열 상태 값 반환을 비롯하여 필요한 모든 기능을 제공합니다. IThermal 바인더 인터페이스는 앱이 열 상태 리스너를 등록하거나 삭제할 때 사용할 수 있는 OnThermalStatusChangedListener
인터페이스로 래핑됩니다.
Android Thermal API에는 PowerManager
클래스에 정의된 상태 코드를 통해 앱에 열 심각도 수준을 알리는 콜백과 폴링 메서드가 모두 있습니다. 메서드는 다음과 같습니다.
getCurrentThermalStatus()
는 기기가 현재 조절 중인 경우를 제외하고 기기의 현재 열 상태를 정수로 반환합니다.addThermalStatusListener()
는 리스너를 추가합니다.removeThermalStatusListener()
는 이전에 추가된 리스너를 제거합니다.
열 상태 코드 사용
열 상태 코드는 특정 제한 수준으로 변환되며 이는 데이터를 수집하고 최적의 UX를 설계하는 데 사용할 수 있습니다. 예를 들어 앱은 0x00000000
(THERMAL_STATUS_NONE
) 상태를 수신할 수 있으며 이 상태는 나중에 0x00000001
(THERMAL_STATUS_LIGHT
)로 변경될 수 있습니다. 0x00000000
상태를 t0으로 표시하고 THERMAL_STATUS_NONE
상태에서 THERMAL_STATUS_LIGHT
상태까지 경과된 시간을 t1로 측정하면 기기 제조업체가 특정 사용 사례의 완화 전략을 설계하고 테스트할 수 있습니다. 다음 표는 열 상태 코드를 사용하는 권장 방법을 설명합니다.
열 상태 코드 | 설명 및 권장 사용법 |
---|---|
THERMAL_STATUS_NONE (0x00000000 ) |
제한이 없습니다. 이 상태를 사용하여 THERMAL_STATUS_NONE (0 )에서 THERMAL_STATUS_LIGHT (1 )까지 기간(t0~t1)의 시작을 감지하는 등 보호 조치를 구현합니다. |
THERMAL_STATUS_LIGHT (0x00000001 ) |
가벼운 제한으로, UX가 영향을 받지 않습니다. 이 단계에서는 가벼운 기기 완화를 사용합니다. 예를 들어 코어가 많이 사용되는 작업에서만 부스팅이나 비효율적인 주파수 사용을 건너뜁니다. |
THERMAL_STATUS_MODERATE (0x00000002 ) |
중간 수준의 제한으로, UX에 큰 영향을 미치지는 않습니다. 열 완화가 포그라운드 활동에 영향을 미치므로 앱은 전력을 즉시 줄여야 합니다. |
THERMAL_STATUS_SEVERE (0x00000003 ) |
심각한 제한으로, UX에 큰 영향을 줍니다. 이 단계에서 기기 열 완화는 시스템 용량을 제한해야 합니다. 이 상태로 인해 디스플레이 버벅거림이나 오디오 잡음과 같은 부작용이 발생할 수 있습니다. |
THERMAL_STATUS_CRITICAL (0x00000004 ) |
플랫폼에서 전력 소비를 줄이는 데 필요한 모든 작업을 실행했습니다. 기기 열 완화 소프트웨어가 모든 구성요소를 최저 성능으로 실행하도록 설정했습니다. |
THERMAL_STATUS_EMERGENCY (0x00000005 ) |
플랫폼의 주요 구성요소가 열 상태로 인해 종료되고 기기 기능이 제한됩니다. 이 상태 코드는 기기 종료 전 마지막 경고를 나타냅니다. 이 상태에서 모뎀 및 모바일 데이터와 같은 일부 기능은 완전히 꺼집니다. |
THERMAL_STATUS_SHUTDOWN (0x00000006 ) |
즉시 종료됩니다. 이 단계의 심각도로 인해 앱이 이 알림을 수신하지 못할 수 있습니다. |
기기 제조업체는 열 HAL의 VTS 테스트를 통과해야 하며 커널 sysfs 인터페이스의 emul_temp
를 사용하여 온도 변화를 시뮬레이션할 수 있습니다.