Health2.0の実装

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

すべての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サービスがベンダーイメージによって提供されない場合があります。これは、廃止スケジュールによって実施されます。

この問題を解決するには:

  1. healthdIHealthhwservicemanagerに登録します(システムデーモンであるにもかかわらず)。 IHealthは、インスタンス名「backup」でシステムマニフェストに追加されます。
  2. フレームワークとhealthdは、 binderの代わりにstoragedを介してhwbinderと通信します。
  3. フレームワークとstoragedのコードは、インスタンスが利用可能な場合は「デフォルト」をフェッチし、次に「バックアップ」をフェッチするように変更されています。
    • C ++クライアントコードは、 libhealthhalutilsで定義されたロジックを使用します。
    • Javaクライアントコードは、 HealthServiceWrapperで定義されたロジックを使用します。
  4. 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を実装し、 libbatterymonitorlibhealthd. 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.cpphardware/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_serverstoragedhal_healthを使用できるようにします。
  • system_serverBatteryService )がbatteryproperties_serviceIBatteryPropertiesRegistrar )を登録できるようにします。
  • hal_healthhealthdを提供できるようにします。
  • system_server / storagedがバインダーを介してhealthdを呼び出すことを許可するルールを削除します。
  • IBatteryPropertiesRegistrarbatteryproperties_servicehealthd )を登録できるようにするルールを削除します。

独自の実装を持つデバイスの場合、ベンダーの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が削除される前に正しく機能し続けることを確認するため)の両方に対して作成されます。

バッテリー情報の要件

バッテリー情報の要件を参照してください。