すべてのhealthd
コードはhealth@2.0-implとlibhealthservice
にリファクタリングされ、health @ 2.0HALを実装するように変更されました。これらの2つのライブラリは、health @ 2.0-serviceによって静的にリンクされ、 healthd
によって以前に実行された作業を実行できるようにします(つまり、 healthd_mainloop
を実行してポーリングを実行します)。 initで、health @ 2.0-serviceは、インターフェースIHealth
の実装をhwservicemanager
に登録します。 Android8.xベンダーイメージとAndroid9フレームワークを使用してデバイスをアップグレードする場合、health @ 2.0サービスがベンダーイメージによって提供されない場合があります。これは、廃止スケジュールによって実施されます。
この問題を解決するには:
-
healthd
はIHealth
をhwservicemanager
に登録します(システムデーモンであるにもかかわらず)。IHealth
は、インスタンス名「backup」でシステムマニフェストに追加されます。 - フレームワークと
healthd
は、binder
の代わりにstoraged
を介してhwbinder
と通信します。 - フレームワークと
storaged
のコードは、インスタンスが利用可能な場合は「デフォルト」をフェッチし、次に「バックアップ」をフェッチするように変更されています。- C ++クライアントコードは、
libhealthhalutils
で定義されたロジックを使用します。 - Javaクライアントコードは、
HealthServiceWrapper
で定義されたロジックを使用します。
- C ++クライアントコードは、
- IHealth / defaultが広く利用可能になり、Android 8.1ベンダーのイメージが非推奨になった後、IHealth / backupと
healthd
を非推奨にすることができます。詳細については、 health @ 1.0の廃止を参照してください。
healthdのボード固有のビルド変数
BOARD_PERIODIC_CHORES_INTERVAL_*
は、 healthd
を構築するために使用されるボード固有の変数です。システム/ベンダービルド分割の一部として、ボード固有の値をシステムモジュールに定義することはできません。 health@2.0では、ベンダーはhealthd_mode_ops->init
でこれら2つの値をオーバーライドできます( health@2.0-service.<device>
のlibhealthservice
依存関係を削除し、この関数を再実装することにより)。
静的実装ライブラリ
他のHAL実装ライブラリとは異なり、実装ライブラリhealth@2.0-implは、health @ 2.0-サービス、充電器、リカバリ、およびレガシーヘルスリンクがリンクする静的ライブラリです。
health@2.0.implは、上記のようにIHealth
を実装し、 libbatterymonitor
とlibhealthd. BOARD
。 health@2.0-implのこれらのユーザーは、 BatteryMonitor
またはlibhealthd
の関数を直接使用してはなりません。代わりに、これらの呼び出しは、 IHealth
インターフェイスの実装であるHealth
クラスへの呼び出しに置き換える必要があります。さらに一般化するために、 healthd_common
コードもhealth@2.0-implに含まれています。新しいhealthd_common
には、health @ 2.0-service、charger、healthdの間の残りの共通コードが含まれており、 healthd
の代わりにIHealthメソッドを呼び出します。
Health2.0サービスの実装
デバイスにhealth@2.0サービスを実装する場合、デフォルトの実装が次の場合:
- デバイスには十分です
android.hardware.health@2.0-service
を直接使用してください。 デバイスには不十分です
android.hardware.health@2.0-service.(device)
実行可能ファイルを作成し、次のものを含めます。#include <health2/service.h> int main() { return health_service_main(); }
それで:
ボード固有の
libhealthd:
- 存在します、それにリンクします。
- 存在しません
healthd_board_init
およびhealthd_board_battery_update
関数の空の実装を提供します。
ボード固有の
BOARD_PERIODIC_CHORES_INTERVAL_*
変数の場合:- 定義されている場合は、デバイス固有の
HealthServiceCommon.cpp
(hardware/interfaces/health/2.0/utils/libhealthservice
からコピー)を作成し、healthd_mode_service_2_0_init
でカスタマイズします。 - 定義されていません。静的に
libhealthservice
にリンクしてください。
- 定義されている場合は、デバイス固有の
デバイスの場合:
-
getStorageInfo
およびgetDiskStats
を実装する必要があり、get_storage_info
およびget_disk_stats
関数で実装を提供します。 - これらのAPIを実装しないでください。静的に、
libstoragehealthdefault
にリンクしてください。
-
必要なSELinuxパーミッションを更新します。
パススルー実装をリカバリイメージにインストールすることにより、リカバリにHALを実装します。例:
// Android.bp cc_library_shared { name: "android.hardware.health@2.0-impl-<device>", recovery_available: true, relative_install_path: "hw", static_libs: [ "android.hardware.health@2.0-impl", "libhealthd.<device>" // Include the following or implement device-specific storage APIs "libhealthstoragedefault", ], srcs: [ "HealthImpl.cpp", ], overrides: [ "android.hardware.health@2.0-impl-default", ], }
// HealthImpl.cpp #include <health2/Health.h> #include <healthd/healthd.h> using android::hardware::health::V2_0::IHealth; using android::hardware::health::V2_0::implementation::Health; extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) { const static std::string providedInstance{"default"}; if (providedInstance != name) return nullptr; return Health::initInstance(&gHealthdConfig).get(); }
# device.mk PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
詳細については、 hardware / interfaces / health / 2.0 /README.mdを参照してください。
健康クライアント
ヘルス2.1HALについては、ヘルスクライアントを参照してください。
SELinuxの変更
新しいhealth@2.0HALには、次のSELinuxの変更が含まれています。
- health@2.0-serviceを
file_contexts
に追加します。 -
system_server
とstoraged
がhal_health
を使用できるようにします。 -
system_server
(BatteryService
)がbatteryproperties_service
(IBatteryPropertiesRegistrar
)を登録できるようにします。 -
hal_health
がhealthd
を提供できるようにします。 -
system_server
/storaged
がバインダーを介してhealthd
を呼び出すことを許可するルールを削除します。 -
IBatteryPropertiesRegistrar
がbatteryproperties_service
(healthd
)を登録できるようにするルールを削除します。
独自の実装を持つデバイスの場合、ベンダーのSELinuxの変更が必要になる場合があります。例:
# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0
# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.
カーネルインターフェース
ヘルス2.1HALのカーネルインターフェースを参照してください。
テスト
Android 9には、health @ 2.0HAL用に特別に作成された新しいVTSテストが含まれています。デバイスがデバイスマニフェストでhealth@2.0HALを提供することを宣言した場合、対応するVTSテストに合格する必要があります。テストは、デフォルトインスタンス(デバイスがHALを正しく実装していることを確認するため)とバックアップインスタンス( healthd
が削除される前に正しく機能し続けることを確認するため)の両方に対して作成されます。
バッテリー情報の要件
バッテリー情報の要件を参照してください。