W Androidzie 11 cały kod healthd
jest refaktoryzowany na
libhealthloop
i libhealth2impl
, a następnie modyfikowano w celu implementacji kodu Health@2.1
HAL. Te 2 biblioteki są statycznie połączone przez health@2.0-impl-2.1
,
przekazującej wdrożenie Health 2.1. Statycznie połączone biblioteki
zezwól aplikacji health@2.0-impl-2.1
na wykonywanie tych samych czynności co healthd
, np. uruchamianie
healthd_mainloop
i ankietowanie. W inicjowaniu moduł health@2.1-service
rejestruje
po wdrożeniu interfejsu IHealth
do hwservicemanager
. Podczas uaktualniania
urządzeniach z Androidem 8.x lub 9,
obraz dostawcy i platformę Androida 11,
obraz dostawcy może nie udostępniać usługi Health@2.1. Wstecz
zgodność ze starymi obrazami dostawcy jest wymuszana przez
harmonogram wycofywania.
Aby zapewnić zgodność wsteczną:
healthd
rejestrujeIHealth
whwservicemanager
mimo korzystania z systemu demona. Do pliku manifestu systemowego dodano nazwę instancjiIHealth
z nazwą instancji „kopia zapasowa”.- Platforma i
storaged
komunikują się z platformąhealthd
za pomocąhwbinder
zamiastbinder
. - Kod platformy i zasad
storaged
został zmieniony tak, aby pobrać instancję „domyślna” wybierz „kopia zapasowa”, jeśli ta opcja jest dostępna.- 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 szczegóły, patrz Wycofanie 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. Te wartości zostały zastąpione
w wycofanej funkcji healthd_board_init
.
W Health@2.1 dostawcy mogą zastąpić
te 2 wartości interwału zadań okresowych w strukturze healthd_config
przed
do konstruktora klas implementacji stanu zdrowia. Zdrowie
klasa implementacji powinna dziedziczyć z
android::hardware::health::V2_1::implementation::Health
Wdrażanie usługi Health 2.1
Informacje o wdrażaniu usługi Health 2.1 znajdziesz tutaj hardware/interfaces/health/2.1/README.md.
Klienci ochrony zdrowia
Health@2.x ma tych klientów:
- ładowarka. Korzystanie z kodu aplikacji
libbatterymonitor
ihealthd_common
jest zawijanie tekstuhealth@2.0-impl
. - w przypadku odzyskiwania konta. Połączenie z usługą
libbatterymonitor
jest uwzględnione w zakresiehealth@2.0-impl
Wszystkie połączenia z numeremBatteryMonitor
są zastępowane połączeniami z: klasę implementacjiHealth
. BatteryManager.
BatteryManager.queryProperty(int id)
był jedynym klient domenyIBatteryPropertiesRegistrar.getProperty
. Źródło:IBatteryPropertiesRegistrar.getProperty
healthd
i bezpośrednio przeczytaj:/sys/class/power_supply
.Ze względów bezpieczeństwa aplikacje nie mogą wywoływać HAL dotyczących stanu zdrowia bezpośrednio. W Androidzie 9 i nowszych pakiet binarny usługa
IBatteryPropertiesRegistrar
jest świadczona przezBatteryService
zamiasthealthd
.BatteryService
przekazuje wywołanie do HAL ds. zdrowia w celu pobrania wymaganych informacji.BatteryService. W Androidzie 9 i nowszych
BatteryService
używaHealthServiceWrapper
do określenia, czy użyć domyślna instancja usługi stanu z usługivendor
lub do użycia kopii zapasowej instancję usługi stanu zhealthd
.BatteryService
następnie nasłuchuje przez zdarzenia związane ze zdrowiem doIHealth.registerCallback
.Pamięć. W Androidzie 9 i nowszych
storaged
używalibhealthhalutils
do określenia, czy użyć domyślna instancja usługi stanu z usługivendor
lub do użycia kopii zapasowej instancję usługi stanu zhealthd
.storaged
, potem nasłuchuje zdarzeń związanych ze zdrowiem przezIHealth.registerCallback
i pobiera z informacjami o pamięci masowej.
Zmiany w SELinux
HAL Health@2.1 zawiera następujące zmiany na platformie SELinux:
- Dodaje
android.hardware.health@2.1-service
do listyfile_contexts
.
W przypadku urządzeń z własną implementacją niektóre zmiany dostawcy SELinux mogą niezbędną. Przykład:
# 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
Demon healthd
i implementacja domyślna
android.hardware.health@2.0-impl-2.1
uzyskuje dostęp do poniższych interfejsów jądra,
pobrania informacji o baterii:
/sys/class/power_supply/*/capacity_level
(dodano w Health 2.1)/sys/class/power_supply/*/capacity
/sys/class/power_supply/*/charge_counter
/sys/class/power_supply/*/charge_full
/sys/class/power_supply/*/charge_full_design
(dodano w Health 2.1)/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
/sys/class/power_supply/*/cycle_count
/sys/class/power_supply/*/health
/sys/class/power_supply/*/online
/sys/class/power_supply/*/present
/sys/class/power_supply/*/status
/sys/class/power_supply/*/technology
/sys/class/power_supply/*/temp
/sys/class/power_supply/*/time_to_full_now
(dodano w Health 2.1)/sys/class/power_supply/*/type
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
Każda implementacja kontroli stanu HAL na danym urządzeniu, która korzysta z interfejsu libbatterymonitor
domyślnie uzyskuje dostęp do tych interfejsów jądra, chyba że zostanie to zastąpione
konstruktora klasy implementacji.
Jeśli nie ma tych plików lub są one niedostępne w usłudze healthd
lub w
domyślnej usługi (na przykład plik jest dowiązaniem symbolicznym do folderu konkretnego dostawcy;
odmawia dostępu z powodu błędnie skonfigurowanej zasady SELinux),
nie działa poprawnie. Dodatkowe zmiany SELinux związane z dostawcą
mimo że jest używana implementacja domyślna.
Niektóre interfejsy jądra używane w Health 2.1, takie jak
/sys/class/power_supply/*/capacity_level
i
/sys/class/power_supply/*/time_to_full_now
, może być opcjonalna. Jednak, aby:
zapobiega nieprawidłowemu działaniu platformy wynikającemu z braku interfejsów jądra systemu
zalecamy wybranie wiśni
CL 1398913
przed utworzeniem usługi Health HAL 2.1.
Testowanie
Android 11 zawiera nowe
Testy VTS
napisane specjalnie na potrzeby HAL Health@2.1. Jeśli urządzenie zadeklaruje,
Health@2.1 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
HAL Health 2.0 określa zestaw wymagań dotyczących interfejsu HAL, ale i testy VTS są egzekwowane w umiarkowanym stopniu. W Androidzie 11 pojawiły się nowe testy VTS, które wymuszają stosowanie następujące wymagania na urządzeniach uruchamianych z systemem Android 11 i nowsze:
- Jednostkami prądu zmiennego i średniego baterii jest wartość w mikroA (μA).
- Symbol chwilowego i średniego prądu baterii musi być prawidłowy.
Więcej szczegółów:
- bieżący == 0, gdy stan baterii to
UNKNOWN
- aktualnie > 0, gdy stan baterii to
CHARGING
- obecna <= 0, gdy stan baterii to
NOT_CHARGING
- bieżące < 0, gdy stan baterii to
DISCHARGING
- Nieegzekwowana, gdy stan baterii to
FULL
- bieżący == 0, gdy stan baterii to
- Stan baterii musi być zgodny z tym, czy źródło zasilania jest
– podłączono Więcej szczegółów:
- stan baterii musi mieć wartość
CHARGING
,NOT_CHARGING
lubFULL
, jeśli i tylko wtedy, gdy jest podłączone źródło zasilania. - stan baterii musi wynosić
DISCHARGING
tylko wtedy, gdy źródło zasilania jest – rozłączono.
- stan baterii musi mieć wartość
Jeśli korzystasz w swojej implementacji z interfejsu libbatterymonitor
i przekazujesz wartości
z interfejsów jądra, sprawdź, czy węzły sysfs zgłaszają prawidłowe wartości:
- Upewnij się, że poziom naładowania baterii jest podawany z prawidłowym oznaczeniem i odpowiednimi jednostkami. Ten
obejmuje następujące węzły sysfs:
/sys/class/power_supply/*/current_avg
/sys/class/power_supply/*/current_max
/sys/class/power_supply/*/current_now
- Wartości dodatnie wskazują, jaki jest prąd wchodzący do baterii.
- Wartości powinny być podane w mikroampery (μA).
- Sprawdź, czy napięcie baterii jest podane w mikrowoltach (μV). Obejmuje to m.in.:
te węzły sysfs:
/sys/class/power_supply/*/voltage_max
/sys/class/power_supply/*/voltage_now
- Pamiętaj, że domyślna implementacja HAL dzieli
voltage_now
przez 1000 i podaje wartości w miliwoltach (mV). Zobacz @1.0::HealthInfo.
Więcej informacji: Klasa zasilacza – Linux.