Android フレームワークでは、デバイス メーカーとアプリ デベロッパーは、温度データを使用して、デバイスが過熱し始めた場合に一貫性のあるユーザー エクスペリエンス(UX)を確保できます。たとえば、システムが熱ストレスにさらされると、jobscheduler
ジョブがスロットリングされ、必要に応じてフレームワークのサーマル シャットダウンが開始されます。登録済みのコールバック(PowerManager
クラス内)を介して熱ストレス通知を受け取るアプリは、UX を適切に調整できます。
Thermal 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 からの 2 つの警告メッセージを示しています。これらのメッセージは、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 以降)は、現在の温度を返すポーリング インターフェースであるだけでなく、Thermal HAL クライアントのコールバック インターフェース(フレームワークのサーマル サービスなど)でも使用できます。たとえば、RegisterIThermalChangedCallback
と UnregisterIThermalChangedCallback
は、重大度が変化するイベントを登録および登録解除します。特定のセンサーの熱重大度が変化した場合、notifyThrottling
は熱イベント リスナーにサーマル スロットリング イベント コールバックを送信します。
熱センサーの情報に加えて、熱軽減策が実施された冷却デバイスのリストが getCurrentCoolingDevices
に公開されます。冷却デバイスがオフラインになっても、リストの状態は保持されます。デバイス メーカーは、これを使用して statsd
指標を収集できます。
詳細については、リファレンス実装をご覧ください。
独自の拡張機能の追加もできますが、熱軽減機能を無効にしないでください。
サーマル サービス
Android 10 以降では、フレームワーク内のサーマル サービスは、Thermal HAL 2.0 のさまざまな熱軽減シグナルを使用して常時モニタリングを行い、スロットリングの重大度に関するフィードバックをクライアントに提供します。このようなクライアントとしては、内部コンポーネントと Android アプリがあります。サービスは、コールバックとして公開されている 2 つのバインダ コールバック インターフェース(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 アスペクトを実装する必要があります。
バッテリーの電力制約など、デバイスのパフォーマンスをスロットリングするものはすべて、Thermal HAL を通じて報告する必要があります。確実にこれを行うには、(ステータス変更に基づいて)熱軽減策の必要性を示すすべてのセンサーを Thermal HAL に配置し、実行された熱軽減アクションの重大度を報告します。センサーの読み取りによって返される温度値は、対応する重大度しきい値を正確に反映していれば、実際の温度でなくてもかまいません。たとえば、実際の温度しきい値の代わりに異なる数値を渡すことも、しきい値指定に保護周波数帯を作成してヒステリシスを提供することもできます。ただし、その値に対応する重大度は、そのしきい値で必要なものと一致する必要があります。たとえば、実際の温度が 65℃ で、指定したクリティカルな重大度に対応する場合、クリティカルな温度しきい値として 72℃ を返すことができます。サーマル フレームワーク機能を最適化するには、重大度が常に正確であることが必要です。
フレームワークのしきい値レベルと、それらが熱軽減アクションに対応する仕組みについては、熱ステータス コードの使用をご覧ください。
Thermal 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 ) |
直ちにシャットダウンします。この段階の重大度では、アプリがこの通知を受信できない可能性があります。 |
デバイス メーカーは、Thermal HAL の VTS テストに合格する必要があります。温度変化をシミュレートするには、カーネル sysfs インターフェースの emul_temp
を使用できます。