熱軽減策

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 クライアントのコールバック インターフェース(フレームワークのサーマル サービスなど)でも使用できます。たとえば、RegisterIThermalChangedCallbackUnregisterIThermalChangedCallback は、重大度が変化するイベントを登録および登録解除します。特定のセンサーの熱重大度が変化した場合、notifyThrottling は熱イベント リスナーにサーマル スロットリング イベント コールバックを送信します。

熱センサーの情報に加えて、熱軽減策が実施された冷却デバイスのリストが getCurrentCoolingDevices に公開されます。冷却デバイスがオフラインになっても、リストの状態は保持されます。デバイス メーカーは、これを使用して statsd 指標を収集できます。

詳細については、リファレンス実装をご覧ください。

独自の拡張機能の追加もできますが、熱軽減機能を無効にしないでください。

サーマル サービス

Android 10 以降では、フレームワーク内のサーマル サービスは、Thermal HAL 2.0 のさまざまな熱軽減シグナルを使用して常時モニタリングを行い、スロットリングの重大度に関するフィードバックをクライアントに提供します。このようなクライアントとしては、内部コンポーネントと Android アプリがあります。サービスは、コールバックとして公開されている 2 つのバインダ コールバック インターフェース(IThermalEventListenerIThermalStatusListener)を利用します。前者は内部プラットフォームとデバイス メーカー向け、後者は Android アプリ向けです。

コールバック インターフェースを介して、デバイスの現在の熱ステータスを 0x00000000(スロットリングなし)から 0x00000006(デバイスのシャットダウン)までの整数値として取得できます。Android API やデバイス メーカー API などの信頼できるシステム サービスのみが、熱センサーと熱イベントの詳細情報にアクセスできます。次の図は、Android 10 以降の熱軽減プロセスフローのモデルを示しています。

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 クラスで定義されている)としてアプリに通知するためのコールバックとポーリングの両方のメソッドがあります。メソッドは次のとおりです。

熱ステータス コードを使用する

熱ステータス コードは、データの収集や最適な UX の設計に使用できる特定のスロットリング レベルに変換されます。たとえば、アプリが 0x00000000THERMAL_STATUS_NONE)のステータスを受信し、その後 0x00000001THERMAL_STATUS_LIGHT)に変わる場合があります。0x00000000 の状態を t0 としてマークし、ステータス THERMAL_STATUS_NONE からステータス THERMAL_STATUS_LIGHT までの経過時間を t1 として測定することで、デバイス メーカーは特定のユースケースに対応する軽減策を設計し、テストできます。次の表は、熱ステータス コードの推奨される使用方法の概要を示します。

熱ステータス コード 説明と推奨される使用法
THERMAL_STATUS_NONE0x00000000 スロットリングなし。このステータスを使用して、THERMAL_STATUS_NONE0)から THERMAL_STATUS_LIGHT1)までの経過時間(t0~t1)の開始を検出するなどの保護対策を実装します。
THERMAL_STATUS_LIGHT0x00000001 軽度のスロットリング、UX に影響なし。この段階では、デバイスの軽度の熱軽減策を実施します。たとえば、ブーストや非効率的な周波数の使用をスキップします(ただし、大きなコアの場合のみ)。
THERMAL_STATUS_MODERATE0x00000002 中程度のスロットリング、UX に大きな影響なし。熱軽減策はフォアグラウンドのアクティビティに影響するため、アプリは直ちに電力を節減する必要があります。
THERMAL_STATUS_SEVERE0x00000003 重度のスロットリング、UX に大きな影響あり。この段階では、デバイスの熱軽減策によってシステム容量を制限する必要があります。これにより、ディスプレイ ジャンクやオーディオ ジッターなどの副作用が発生することがあります。
THERMAL_STATUS_CRITICAL0x00000004 プラットフォームは電力を節減するためのすべてのアクションを実行します。デバイスの熱軽減ソフトウェアによって、すべてのコンポーネントがそれぞれの最小容量で実行されます。
THERMAL_STATUS_EMERGENCY0x00000005 熱条件により、プラットフォームの主要コンポーネントがシャットダウンされ、デバイスの機能が制限されます。このステータス コードは、デバイスがシャットダウンする前の最後の警告です。これにより、一部の機能(モデムやモバイルデータなど)が完全にオフになります。
THERMAL_STATUS_SHUTDOWN0x00000006 直ちにシャットダウンします。この段階の重大度では、アプリがこの通知を受信できない可能性があります。

デバイス メーカーは、Thermal HAL の VTS テストに合格する必要があります。温度変化をシミュレートするには、カーネル sysfs インターフェースの emul_temp を使用できます。