Android システムの健全性

Android 13 には、health@2.1 HAL から変更された android.hardware.health AIDL HAL が含まれています。この新しい HAL には次の利点があります。

  • 使用していない充電器関連の API を削除する
  • 未使用の StorageAttribute と関連フィールドを削除する
  • ホルダーでの充電をサポートする

Android 11 には、health@2.0 HAL からのマイナー バージョン アップグレードである android.hardware.health HAL 2.1 が含まれています。この新しい HAL には次の利点があります。

  • フレームワークとベンダーコードが明確に分離される
  • ヘルス情報レポートのベンダー カスタマイズにおける自由度が高い
  • バッテリー以外についてもデバイスのヘルス情報を確認できる

参考として、Health 2.1 HAL の実装に関するドキュメントをこのページに記載します。

要件

このセクションには、Android 11、Android 12、および Android 13 以降の要件が記載されています。

Android 11、Android 12 を搭載したデバイス

Android 11、Android 12 でリリースするデバイスは、2.1 HAL または AIDL HAL を提供する必要があります。Android 11、Android 12 でリリースせずに、ベンダー イメージをターゲット フレームワーク互換性マトリックス バージョン 5(Android 11 でリリース済み)またはバージョン 6(Android 12 でリリース済み)に更新する予定のデバイスは、既存の 2.0 HAL 実装を削除して 2.1 HAL または AIDL HAL を提供する必要があります。Android 11 でリリースせず、ベンダー イメージを更新する予定がないデバイスであっても、2.1 HAL または AIDL HAL の提供が推奨されます。

AOSP には、2.1 HAL の実装と以前の HIDL HAL からの移行に役立つ複数のヘルパー ライブラリが含まれています。

Android 13 以降を搭載したデバイス

Android 13 でリリースするデバイスでは、AIDL HAL を提供する必要があります(HIDL HAL は提供できません)。Android 13 でリリースせずに、ベンダー イメージをターゲット フレームワーク互換性マトリックス バージョン 7(Android 13 でリリース済み)に更新する予定のデバイスでは、既存の HIDL HAL 実装を削除して AIDL HAL を提供する必要があります。Android 13 でリリースせず、ベンダー イメージを更新する予定がないデバイスであっても、AIDL HAL を提供することが推奨されます。

AOSP には、AIDL HAL の実装と以前の HIDL HAL からの移行に役立つ複数のヘルパー ライブラリが含まれています。

用語

以下に、Android システムのヘルスに関するドキュメントを読み進めるにあたって把握しておく必要がある用語をまとめます。

health@2.1
android.hardware.health@2.1 の省略形。health HIDL のバージョン 1 は Android 11 でリリースされました。
health AIDL HAL
android.hardware.health の省略形。health AIDL HAL のバージョン 1 は Android 13 でリリースされました。
charger
スマートフォン充電中のアニメーションを表示するオフモード充電で実行される実行可能ファイル。
recovery
バッテリー情報を取得する必要があるリカバリモード(Recovery mode)で実行される実行可能ファイル。
storaged
ストレージ情報を取得してフレームワークに提供するデーモン。

Android 11、Android 12 の health

Android 11、Android 12 では、health コンポーネントは次の図に示すように動作します。

[system]
    | getService()
    V
[health@2.1-service]
        | getService(stub=true)
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

その他のモードの場合:

[       charger          ]
    | getService()      |  (legacy code path)
    V                   +-------------------------------------------------+
[health@2.1-service]                                                      |
        | getService(stub=true)                                           |
        V                                                                 |
[      health@2.0-impl-2.1-<device>.so      ]                             |
        |                                  | (device-dependent linkage)   |
        V                                  V                              |
+---------Helper libs for impl--------+   [libhealthd.device]             |
| [libhealthloop (uevent, wakealarm)] |                                   |
| [libhealth2impl (IHealth impl)    ] | <---------------------------------+
| [libbatterymonitor (battery)      ] |
+-------------------------------------+
[recovery]
        | getService() w/o hwservicemanager
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

その他の各種モードについては、以下の簡略図をご覧ください。

health HIDL HAL 2.1 のインフラストラクチャ

図 1. health HIDL HAL 2.1 のインフラストラクチャ。

Android 13 の health

Android 13 では、health AIDL HAL が導入されています。図 2 に、health コンポーネントの動作を示します。

health AIDL HAL のインフラストラクチャ

図 2. health AIDL HAL のインフラストラクチャ。

HIDL HAL インターフェース 2.1

health@2.1 HAL はオフモード充電に対応し、バッテリーに関する詳細情報を提供します。

メイン インターフェース(IHealth)には次の関数が用意されています。

  • getHealthConfig: この HAL の構成を取得します
  • getHealthInfo_2_1: getHealthInfo のマイナー バージョン アップグレード
  • shouldKeepScreenOn: 画面を充電モードにしておくかどうかを決定します

さらに、@2.1::IHealth の実装には、継承された registerCallback 関数と unregisterCallback 関数に対して @2.1::IHealthInfoCallback をサポートする必要があります。新しいコールバック インターフェースは、継承された healthInfoChanged 関数ではなく、healthInfoChanged_2_1 関数を使用してヘルス情報をクライアントに返します。

コールバックと getHealthInfo_2_1 を使用して、新しい構造体 @2.1::HealthInfo が返されます。この構造体には、health@2.0 HAL から入手できる、次のような追加のデバイスヘルス情報が含まれます。

  • バッテリー容量
  • フル充電までの時間(秒)
  • フル充電の設計容量(~μAh)

図 3 に、health HAL の実装に役立つクラスの UML 図を示します。

health HAL 2.1 の UML 図

図 3. health HAL 2.1 の UML 図。

Health サービス 2.1 の実装については、Health 2.1 の実装をご覧ください。

AIDL HAL インターフェース バージョン 1

このセクションには、AIDL HAL インターフェース バージョン 1 に関する情報が記載されています。

API の変更

AIDL バージョン 1 HAL は、HIDL 2.1 HAL と同様の API をサポートしています。HIDL 2.1 インターフェースと比較して、API に次の変更が行われています。

  • HIDL HAL 2.1 で導入された充電器関連の API は、AIDL HAL に移植されていません。オフモード充電の機能は /vendor パーティションでのみ有効であるため、ベンダー インターフェースの API は必要ありません。オフモード充電を適切に実装するには、charger をご覧ください。
  • StorageAttribute タイプと関連フィールドは、使用されていないため削除されました。
  • ホルダーでの充電をサポートするために、chargerDockOnlineHealthInfo に追加されました。

実装

図 4 に、health AIDL HAL の実装に役立つクラスの UML 図を示します。

health AIDL HAL の UML 図

図 4. health AIDL HAL の UML 図。

Health AIDL サービスの実装については、Health AIDL HAL の実装をご覧ください。

リカバリ

Android 13 では、リカバリのバインダがサポートされています。Health AIDL サービスをリカバリにインストールすると、リカバリモードで実行できます。

Health AIDL サービスをリカバリにインストールする方法については、次のページをご覧ください。

充電器

オフモード充電の機能は、/system から /vendor に移動されました。Android 13 を搭載したデバイスがオフモード充電をサポートする場合、HAL サービス バイナリは充電器モードをサポートする必要があります。詳しくは、充電器の実装をご覧ください。

充電器のシステム プロパティ

/vendorcharger バイナリでは、プロパティ ro.charger.* を読み取れなくなりました。デバイスに ro.charger.* システム プロパティのいずれかが設定されている場合は、充電器のシステム プロパティをご覧ください。