Cały kod healthd
został refaktoryzowany na Health@2.0-impl.
libhealthservice
, a następnie dodano do wdrożenia Health@2.0 HAL. Te dwie opcje
są statycznie połączone przez Health@2.0-service, co umożliwia
wykonane wcześniej przez użytkownika healthd
(tzn. uruchom polecenie healthd_mainloop
i wykonaj
). W inicjowaniu usługa Health@2.0-rejestruje implementację
interfejs IHealth
do hwservicemanager
. Gdy wymieniasz urządzenia z
obraz dostawcy Androida 8.x i platformę Androida 9,
obraz dostawcy może nie dostarczać usługi Health@2.0. To jest wymuszane
przez
harmonogram wycofywania.
Aby rozwiązać ten problem:
healthd
rejestruje usługęIHealth
w:hwservicemanager
(mimo że jest systemem) demona). PoleIHealth
zostało dodane do pliku manifestu systemu z nazwą instancji"backup"
- Platforma i
storaged
komunikują się zhealthd
za pomocąhwbinder
zamiastbinder
. - Kod platformy i zasad
storaged
został zmieniony tak, aby pobrać instancję"default"
, jeśli ta opcja jest dostępna, a potem"backup"
.- Kod klienta C++ korzysta z logiki zdefiniowanej w zasadzie
libhealthhalutils
. - Kod klienta w języku Java korzysta z logiki zdefiniowanej w zasadzie
HealthServiceWrapper
.
- Kod klienta C++ korzysta z logiki zdefiniowanej w zasadzie
- Po powszechnej dostępności systemu IHealth/default oraz obrazów dostawców Androida 8.1
wycofane, IHealth/backup oraz
healthd
mogą zostać wycofane. Więcej Więcej informacji znajdziesz w artykule na temat wycofywania ustawień Health@1.0.
Zmienne kompilacji dla konkretnej tablicy dla sprawnych
BOARD_PERIODIC_CHORES_INTERVAL_*
to zmienne związane z płytką używane do tworzenia
healthd
W ramach podziału kompilacji systemu/dostawcy wartości dla poszczególnych płyt
nie można zdefiniować dla modułów systemowych. W stanie Health@2.0 dostawcy mogą zastąpić
te dwie wartości w funkcji healthd_mode_ops->init
(przez usunięcie funkcji libhealthservice
zależność w health@2.0-service.<device>
i ponowne zaimplementowanie tej funkcji).
Biblioteka implementacji statycznej
W przeciwieństwie do innych bibliotek implementacji HAL biblioteka implementacji Health@2.0-impl to biblioteka statyczna, do której usługa Health@2.0-service, ładowarka i starszego prawidłowego stanu.
Health@2.0.impl implementuje funkcję IHealth
w sposób opisany powyżej i ma na celu pakowanie
w pobliżu: libbatterymonitor
i libhealthd.BOARD
. Te
użytkownicy Health@2.0-impl nie mogą używać pola BatteryMonitor
ani funkcji w
bezpośrednio libhealthd
; te wywołania należy zastąpić wywołaniami na
klasę Health
, czyli implementację interfejsu IHealth
. Aby uogólnić
kod healthd_common
jest również uwzględniony w Health@2.0-impl. Nowy
healthd_common
zawiera resztę kodu wspólnego dla usługi Health@2.0-service,
ładowarka i healthd
oraz wywołuje metody IHealth zamiast BatteryMonitor.
Wdróż usługę Health 2.0
Podczas wdrażania usługi Health@2.0 na urządzeniu, jeśli implementacja domyślna to:
- Wystarczające dla urządzenia. Użyj
android.hardware.health@2.0-service
bezpośrednio. Nie jest to wystarczające dla danego urządzenia, utwórz
android.hardware.health@2.0-service.(device)
plik wykonywalny, który zawiera:#include <health2/service.h> int main() { return health_service_main(); }
Następnie:
Jeśli
libhealthd:
specyficzna dla tablicy- Istnieje, link do niego.
- Nie istnieje, dodaj puste implementacje dla
healthd_board_init
ihealthd_board_battery_update
.
W przypadku zmiennych
BOARD_PERIODIC_CHORES_INTERVAL_*
właściwych dla danej tablicy:- są zdefiniowane, utwórz
HealthServiceCommon.cpp
dla konkretnego urządzenia (skopiowany) odhardware/interfaces/health/2.0/utils/libhealthservice
) i Dostosuj ją whealthd_mode_service_2_0_init
. - nie są zdefiniowane; połącz statycznie z usługą
libhealthservice
.
- są zdefiniowane, utwórz
Jeśli urządzenie:
- Należy wdrożyć interfejsy API
getStorageInfo
igetDiskStats
, a także podać w funkcjachget_storage_info
iget_disk_stats
. - Nie powinno być implementowane tych interfejsów API, link do:
libstoragehealthdefault
statycznie.
- Należy wdrożyć interfejsy API
Zaktualizuj niezbędne uprawnienia SELinux.
Wdrożenie HAL w procesie przywracania przez zainstalowanie implementacji przekazującej w obraz odzyskiwania. Przykład:
// 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>
Więcej informacji: hardware/interfaces/health/2.0/README.md.
Klienci ochrony zdrowia
Zapoznaj się z artykułem Klienci korzystający z Health 2.1 HAL.
Zmiany w SELinux
Nowa zawartość Health@2.0 HAL zawiera następujące zmiany dla SELinux:
- Dodaje Health@2.0-service do
file_contexts
. - Zezwala
system_server
istoraged
na korzystanie zhal_health
. - Umożliwia rejestrację aplikacji
system_server
(BatteryService
)batteryproperties_service
(IBatteryPropertiesRegistrar
). - Pozwala
healthd
na dostarczaniehal_health
. - Usuwa reguły, które pozwalają
system_server
istoraged
na wywołaniehealthd
za pomocą separatora. - Usuwa reguły, które pozwalają
healthd
zarejestrować użytkownikabatteryproperties_service
(IBatteryPropertiesRegistrar
).
W przypadku urządzeń z własną implementacją niektóre zmiany dostawcy SELinux mogą niezbędną. Przykład:
# 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.
Interfejsy jądra systemu
Zobacz Interfejsy jądra systemu w Health 2.1 HAL.
Testowanie
Android 9 zawiera nowe testy VTS
napisane specjalnie na potrzeby HAL Health@2.0. Jeśli urządzenie deklaruje udostępnianie
Health@2.0 HAL w pliku manifestu urządzenia, musi przejść odpowiednie testy VTS.
Testy są zapisywane dla instancji domyślnej (aby upewnić się, że urządzenie
prawidłowo implementuje listę HAL) i instancję kopii zapasowej (aby zapewnić, że healthd
będzie działał poprawnie przed jego usunięciem).
Wymagania dotyczące informacji o baterii
Zobacz Wymagania dotyczące informacji o baterii.