ConfigStore HAL

Android 8.0 dzieli monolityczny Android OS język generycznego ( system.img ) oraz sprzętowe specyficzne ( vendor.img i odm.img ) partycje. W wyniku tej zmiany kompilacja warunkowa musi zostać usunięta z modułów zainstalowanych na partycji systemowej i takie moduły muszą określać konfigurację systemu w czasie wykonywania (i zachowywać się inaczej w zależności od tej konfiguracji).

ConfigStore HAL udostępnia zestaw interfejsów API do uzyskiwania dostępu do elementów konfiguracji tylko do odczytu używanych do konfigurowania platformy Android. Na tej stronie opisano projekt warstwy HAL ConfigStore (i dlaczego nie użyto w tym celu właściwości systemu); Inne strony w tej sekcji szczegółowo interfejsu HAL , wdrażania usług i użycia po stronie klienta , wszystko za pomocą surfaceflinger jako przykład. O pomoc z klas interfejsu ConfigStore, zobacz Dodawanie klas i elementów interfejsu .

Dlaczego nie korzystać z właściwości systemu?

Rozważaliśmy użycie właściwości systemu, ale znaleźliśmy kilka podstawowych problemów, w tym:

  • Limity długości wartości. Właściwości systemu mają ścisłe limity długości swoich wartości (92 bajty). Ponadto, ponieważ ograniczenia te zostały bezpośrednio ujawnione aplikacjom na Androida jako makra w języku C, zwiększenie długości może powodować problemy ze zgodnością wsteczną.
  • Brak obsługi typów. Wszystkie wartości są zasadniczo ciągi i API po prostu analizować ciąg na int lub bool . Inne typy danych związek (na przykład, tablica i struktura) powinny być kodowane / dekodowane przez klienta (na przykład "aaa,bbb,ccc" może być zakodowana jako szereg trzech łańcuchów).
  • Zastępuje. Ponieważ właściwości systemowe tylko do odczytu są implementowane jako właściwości jednorazowego zapisu, dostawcy/ODM, którzy chcą zastąpić wartości tylko do odczytu zdefiniowane przez AOSP, muszą zaimportować własne wartości tylko do odczytu przed wartościami tylko do odczytu zdefiniowanymi przez AOSP. To z kolei powoduje, że wartości wielokrotnego zapisu zdefiniowane przez dostawcę są zastępowane przez wartości zdefiniowane przez AOSP.
  • Uwzględnij wymagania dotyczące miejsca. Właściwości systemu zajmują stosunkowo dużą ilość przestrzeni adresowej w każdym procesie. Właściwości systemowe są grupowane w prop_area jednostkach o stałej wielkości 128 KB, z których każda jest przeznaczona do przestrzeni adresowej procesu, nawet jeśli tylko jedna właściwość systemu w niej danych. Może to powodować problemy na urządzeniach 32-bitowych, gdzie przestrzeń adresowa jest cenna.

Próbowaliśmy przezwyciężyć te ograniczenia bez poświęcania kompatybilności, ale nadal obawialiśmy się, że właściwości systemu nie zostały zaprojektowane do obsługi dostępu do elementów konfiguracji tylko do odczytu. Ostatecznie zdecydowaliśmy, że właściwości systemu lepiej nadają się do udostępniania kilku dynamicznie aktualizowanych elementów w całym systemie Android w czasie rzeczywistym i że istnieje potrzeba nowego systemu przeznaczonego do uzyskiwania dostępu do elementów konfiguracji tylko do odczytu.

Projekt HAL ConfigStore

Podstawowy projekt jest prosty:

Projekt HAL Configstore

Rysunek 1. ConfigStore HAL konstrukcja

  • Opisz flagi kompilacji (obecnie używane do warunkowego kompilowania frameworka) w HIDL.
  • Dostawcy i producenci OEM zapewniają wartości SoC i specyficzne dla urządzenia dla flag kompilacji, implementując usługę HAL.
  • Zmodyfikuj platformę tak, aby korzystała z usługi HAL w celu znalezienia wartości elementu konfiguracji w czasie wykonywania.

Elementy konfiguracji obecnie odwołuje ramach zawarte są w wersjonowanym pakietu HIDL ( android.hardware.configstore@1.0 ). Dostawcy/OEM dostarczają wartości do elementów konfiguracji, implementując interfejsy w tym pakiecie, a platforma używa interfejsów, gdy musi uzyskać wartość elementu konfiguracji.

Względy bezpieczeństwa

Na flagi kompilacji zdefiniowane w tym samym interfejsie wpływa ta sama polityka SELinux. Jeśli jeden lub więcej flag kompilacji powinny mieć różne polityki SELinux, muszą być rozdzielone na inny interfejs. Może to wymagać znaczącą zmianę android.hardware.configstore package jako oddzieloną interfejsy nie są wstecznie kompatybilne.