W Androidzie 10 interfejs ConfigStore HAL używa flag kompilacji do przechowywania wartości konfiguracji w partycji vendor
, a usługa w partycji system
uzyskuje dostęp do tych wartości za pomocą HIDL (tak samo jest w Androidzie 9). Jednak ze względu na duże zużycie pamięci i trudność obsługi interfejsu ConfigStore HAL został wycofany.
Interfejs HAL ConfigStore pozostaje w AOSP, aby obsługiwać starsze partycje dostawców. Na urządzeniach z Androidem 10 lub nowszym surfaceflinger
najpierw odczytuje właściwości systemu. Jeśli dla elementu konfiguracji w pliku SurfaceFlingerProperties.sysprop nie jest zdefiniowana żadna właściwość systemu, surfaceflinger korzysta z interfejsu ConfigStore HAL.
Android 8.0 dzieli monolityczny system operacyjny Android na partycje ogólne (system.img
) i specyficzne dla sprzętu (vendor.img
i odm.img
). W efekcie tej zmiany kompilacja warunkowa musi zostać usunięta z modułów zainstalowanych na partycji systemowej, a moduły te muszą określać konfigurację systemu w czasie wykonywania (i działać inaczej w zależności od tej konfiguracji).
Interfejs ConfigStore HAL udostępnia zestaw interfejsów API umożliwiających dostęp do elementów konfiguracji tylko do odczytu, które służą do konfigurowania platformy Android. Ta strona opisuje projekt interfejsu ConfigStore HAL (oraz dlaczego właściwości systemowe nie były używane do tego celu). Na innych stronach w tej sekcji znajdziesz szczegółowe informacje o interfejsie HAL, implementacji usługi i użyciu po stronie klienta, przy czym wszystkie przykłady odnoszą się do surfaceflinger
. Aby uzyskać pomoc dotyczącą interfejsów ConfigStore, zapoznaj się z artykułem Dodawanie klas i elementów interfejsu.
Dlaczego nie używać właściwości systemowych?
Rozważaliśmy użycie właściwości systemowych, ale napotkaliśmy kilka podstawowych problemów, takich jak:
- Ograniczenia długości wartości. Właściwości systemowe mają ścisłe limity długości wartości (92 bajty). Ponadto te limity zostały bezpośrednio udostępnione aplikacjom na Androida jako makra C, więc zwiększenie długości może spowodować problemy ze zgodnością wsteczną.
- Brak obsługi typu. Wszystkie wartości to w podstawie ciągi tekstowe, a interfejsy API po prostu analizują je na
int
lubbool
. Inne złożone typy danych (np. tablice i struktury) powinny być kodowane/dekodowane przez klientów (np."aaa,bbb,ccc"
może być zakodowany jako tablica 3 ciągów znaków). - Zastępuje. Właściwości systemowe tylko do odczytu są implementowane jako właściwości tylko do odczytu, dlatego dostawcy/ODM, którzy chcą zastąpić zdefiniowane przez AOSP wartości tylko do odczytu, muszą najpierw zaimportować własne wartości tylko do odczytu. W konsekwencji wartości zdefiniowane przez dostawcę, które można zapisać, są zastępowane wartościami zdefiniowanymi przez AOSP.
- Zapoznaj się z wymaganiami dotyczącymi miejsca. Właściwości systemowe zajmują stosunkowo dużo miejsca w przestrzeni adresowej w każdym procesie. Właściwości systemowe są grupowane w jednostki
prop_area
o stałym rozmiarze 128 KB, z których wszystkie są przypisywane do przestrzeni adresowej procesu, nawet jeśli dostęp jest uzyskiwany tylko do jednej właściwości systemowej. Może to powodować problemy na urządzeniach 32-bitowych, na których przestrzeń adresowa jest cenna.
Staraliśmy się przezwyciężyć te ograniczenia bez poświęcania zgodności, ale nadal obawialiśmy się, że właściwości systemu nie obsługują elementów konfiguracji tylko do odczytu. Ostatecznie zdecydowaliśmy, że właściwości systemowe lepiej nadają się do udostępniania kilku dynamicznie aktualizowanych elementów na wszystkich urządzeniach z Androidem w czasie rzeczywistym. Uznaliśmy też, że potrzebny jest nowy system do uzyskiwania dostępu do elementów konfiguracji w trybie tylko do odczytu.
Projektowanie interfejsu HAL ConfigStore
Podstawowy projekt jest prosty:
Rysunek 1. Projektowanie interfejsu HAL ConfigStore
- Opisz flagi kompilacji (obecnie używane do warunkowego kompilowania frameworka) w HIDL.
- Dostawcy i producenci OEM podają wartości flag kompilacji dla SoC i urządzeń, implementując usługę HAL.
- Zmodyfikuj platformę, aby używała usługi HAL do znajdowania wartości elementu konfiguracji w czasie wykonywania.
Elementy konfiguracji, do których framework obecnie się odwołuje, są zawarte w pakiecie HIDL z wersją (android.hardware.configstore@1.0
). Dostawcy/OEM-y podają wartości elementów konfiguracji, implementując interfejsy w tym pakiecie, a framework używa tych interfejsów, gdy potrzebuje wartości elementu konfiguracji.
Zagadnienia związane z bezpieczeństwem
Flagi kompilacji zdefiniowane w tym samym interfejsie podlegają tym samym zasadom SELinux. Jeśli co najmniej 1 flaga kompilacji ma mieć inne zasady SELinux, należy je rozdzielić na inny interfejs. Może to wymagać gruntownej zmiany android.hardware.configstore package
, ponieważ oddzielone interfejsy nie są już zgodne wstecz.