Der gesamte healthd
-Code wurde in „health@2.0-impl“ und libhealthservice
umgeschrieben und dann so geändert, dass die health@2.0 HAL implementiert wurde. Diese beiden Bibliotheken sind vom health@2.0-Dienst statisch verknüpft, sodass er die Arbeit übernehmen kann, die zuvor von healthd
ausgeführt wurde, d. h. healthd_mainloop
ausführen und Polling durchführen. In der Initialisierung registriert der health@2.0-Dienst eine Implementierung der Schnittstelle IHealth
bei hwservicemanager
. Beim Upgrade von Geräten mit einem Android 8.x-Anbieter-Image und einem Android 9-Framework wird der Dienst „health@2.0“ möglicherweise nicht vom Anbieter-Image bereitgestellt. Dies wird durch den Zeitplan für die Einstellung erzwungen.
So lösen Sie dieses Problem:
healthd
registriertIHealth
beihwservicemanager
(obwohl es sich um einen System-Daemon handelt).IHealth
wird dem Systemmanifest mit dem Instanznamen"backup"
hinzugefügt.- Framework und
storaged
kommunizieren mithealthd
überhwbinder
anstelle vonbinder
. - Der Code für das Framework und
storaged
wird geändert, um die Instanz"default"
abzurufen, falls verfügbar, andernfalls"backup"
.- Der C++-Clientcode verwendet die in
libhealthhalutils
definierte Logik. - Der Java-Clientcode verwendet die in
HealthServiceWrapper
definierte Logik.
- Der C++-Clientcode verwendet die in
- Sobald IHealth/default allgemein verfügbar ist und Android 8.1-Anbieterbilder eingestellt werden, können IHealth/backup und
healthd
eingestellt werden. Weitere Informationen finden Sie unter Einstellung von „health@1.0“.
Boardspezifische Buildvariablen für healthd
BOARD_PERIODIC_CHORES_INTERVAL_*
sind boardspezifische Variablen, die zum Erstellen von healthd
verwendet werden. Im Rahmen des System-/Anbieter-Build-Splits können für Systemmodule keine boardspezifischen Werte definiert werden. In Health@2.0 können Anbieter diese beiden Werte in healthd_mode_ops->init
überschreiben, indem sie die libhealthservice
-Abhängigkeit in health@2.0-service.<device>
entfernen und diese Funktion noch einmal implementieren.
Statische Implementierungsbibliothek
Im Gegensatz zu anderen HAL-Implementierungsbibliotheken ist die Implementierungsbibliothek „health@2.0-impl“ eine statische Bibliothek, mit der der health@2.0-Dienst, das Ladegerät, die Wiederherstellung und der alte healthd verknüpft sind.
Health@2.0.impl implementiert IHealth
wie oben beschrieben und soll libbatterymonitor
und libhealthd.BOARD
umschließen. Diese Nutzer von health@2.0-impl dürfen BatteryMonitor
oder die Funktionen in libhealthd
nicht direkt verwenden. Stattdessen sollten diese Aufrufe durch Aufrufe der Klasse Health
ersetzt werden, einer Implementierung derIHealth
-Schnittstelle. Zur weiteren Verallgemeinerung ist der healthd_common
-Code auch in health@2.0-impl enthalten. Die neue healthd_common
enthält den Rest des gemeinsamen Codes zwischen dem health@2.0-Dienst, dem Ladegerät und healthd
und ruft IHealth-Methoden anstelle von BatteryMonitor auf.
Health 2.0-Dienst implementieren
Bei der Implementierung des Health@2.0-Dienstes für ein Gerät, wenn die Standardimplementierung wie folgt lautet:
- Das ist für das Gerät ausreichend. Verwende
android.hardware.health@2.0-service
direkt. Nicht für das Gerät geeignet. Erstellen Sie die ausführbare Datei
android.hardware.health@2.0-service.(device)
und fügen Sie Folgendes hinzu:#include <health2/service.h> int main() { return health_service_main(); }
Gehen Sie anschließend so vor:
Wenn unternehmensspezifisch
libhealthd:
- Existiert, Link zu ihr.
- Gibt es nicht, geben Sie leere Implementierungen für die Funktionen
healthd_board_init
undhealthd_board_battery_update
an.
Wenn
BOARD_PERIODIC_CHORES_INTERVAL_*
-Variablen für das Board:- definiert sind, erstellen Sie ein gerätespezifisches
HealthServiceCommon.cpp
(aushardware/interfaces/health/2.0/utils/libhealthservice
kopiert) und passen Sie es inhealthd_mode_service_2_0_init
an. - Sie sind nicht definiert. Verknüpfen Sie sie statisch mit
libhealthservice
.
- definiert sind, erstellen Sie ein gerätespezifisches
Wenn das Gerät:
- Wenn Sie die APIs
getStorageInfo
undgetDiskStats
implementieren, geben Sie die Implementierung in den Funktionenget_storage_info
undget_disk_stats
an. - Wenn diese APIs nicht implementiert werden, verknüpfen Sie sie statisch mit
libstoragehealthdefault
.
- Wenn Sie die APIs
Aktualisieren Sie die erforderlichen SELinux-Berechtigungen.
Implementieren Sie HAL bei der Wiederherstellung, indem Sie eine Passthrough-Implementierung für das Wiederherstellungsimage installieren. Beispiel:
// 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>
Weitere Informationen finden Sie unter hardware/interfaces/health/2.0/README.md.
Gesundheitskundschaft
Weitere Informationen finden Sie unter Health-Clients für Health 2.1 HAL.
SELinux-Änderungen
Die neue HAL für health@2.0 enthält die folgenden SELinux-Änderungen:
- Dem Nutzer
file_contexts
wird der Dienst „health@2.0“ hinzugefügt. - Ermöglicht es
system_server
undstoraged
,hal_health
zu verwenden. - Ermöglicht
system_server
(BatteryService
) die Registrierung vonbatteryproperties_service
(IBatteryPropertiesRegistrar
). - Ermöglicht es
healthd
,hal_health
bereitzustellen. - Entfernt Regeln, die es
system_server
undstoraged
ermöglichen, über Binder aufhealthd
zuzugreifen. - Entfernt Regeln, die es
healthd
ermöglichen,batteryproperties_service
(IBatteryPropertiesRegistrar
) zu registrieren.
Bei Geräten mit eigener Implementierung sind möglicherweise einige SELinux-Änderungen des Anbieters erforderlich. Beispiel:
# 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.
Kernelschnittstellen
Weitere Informationen finden Sie unter Kernel-Schnittstellen für Health 2.1 HAL.
Testen
Android 9 enthält neue VTS-Tests, die speziell für die health@2.0 HAL entwickelt wurden. Wenn ein Gerät im Gerätemanifest angibt, dass es die HAL „health@2.0“ bereitstellt, muss es die entsprechenden VTS-Tests bestehen.
Tests werden sowohl für die Standardinstanz als auch für die Sicherungsinstanz geschrieben, um sicherzustellen, dass das Gerät den HAL korrekt implementiert. So wird sichergestellt, dass healthd
vor dem Entfernen weiterhin korrekt funktioniert.
Anforderungen an Akkuinformationen
Weitere Informationen finden Sie unter Anforderungen an Akkuinformationen.