Wdrażanie USB HAL

W Androidzie 8.0 obsługa poleceń USB została przeniesiona ze skryptów init do natywnego demona USB, aby zapewnić lepszą konfigurację i niezawodność kodu. W przypadku konfiguracji funkcji gadżetu do wykonywania operacji na gadżetach na poszczególnych urządzeniach służą skrypty init (czyli właściwości aktywujące).

W poprzednich wersjach te konfiguracje dla poszczególnych urządzeń były osiągane za pomocą skryptów init (z wykorzystaniem właściwościowych wyzwalaczy). Przejście na projektowanie sprzętowej warstwy abstrakcji (HAL) zapewnia znacznie bardziej przejrzystą implementację, która rozwiązuje te problemy:

  1. Operacje takie jak zapisywanie do węzłów sysfs jądra mogą się nie udać, ale nie mogą być propagowane z powrotem do kodu frameworka, który ustawia wyzwalacz właściwości. W efekcie frameworki błędnie uznają, że operacje zakończyły się powodzeniem, nawet jeśli nie zostały wykonane.
  2. Skrypty init mają ograniczoną liczbę operacji, które mogą wykonać.

Wersja Androida 12 dodaje obsługę interfejsu HAL gadżetu USB dla modeli kontroli sieci (NCM) oraz wywołania interfejsu API, które zwracają zarówno numer wersji interfejsu HAL, jak i szybkość USB. Więcej informacji o wywołaniach interfejsu API dostępnych przez interfejs HAL USB znajdziesz w podsumowaniu pakietu android.hardware.usb.

HAL i Treble

Skrypty init przeznaczone na konkretne urządzenia zostały użyte jako zamienniki warstw HAL do wykonywania operacji USB związanych z konkretnymi urządzeniami. USB (przez ADB) to główny interfejs do debugowania problemów systemowych. Użycie natywnego demona do konfiguracji USB eliminuje zależność od kodu platformy, nawet jeśli pamięć USB w przypadku awarii platformy powinna być uruchomiona.

W ramach modelu Treble wprowadzonego w Androidzie 8.0 wszystkie listy HAL są odizolowane od usług systemowych i muszą działać we własnych natywnych demonach. Dzięki temu nie trzeba mieć osobnego demona USB, ponieważ warstwa HAL pełni też funkcję demona USB.

Domyślna implementacja HAL obsługuje wszystkie urządzenia z Androidem 8.0 lub starszym. Z tego powodu na urządzeniach z systemem starszym niż Android 8.0 nie można by Android 8.0 używa interfejsu HAL do wysyłania zapytań o stan portów USB oraz do przeprowadzania zamiany ról danych i zasilania.

Implementacja

Nowy interfejs USB HAL musi być zaimplementowany na każdym urządzeniu z Androidem 8.0. Domyślna implementacja powinna obsługiwać urządzenia z Androidem w wersji 8.0 lub starszej. Domyślna implementacja jest wystarczająca, jeśli urządzenie używa klasy dual_role_usb do zgłaszania stanu portu typu C. Przeniesienie własności węzłów typuc-c do systemu może wymagać drobnych zmian w skryptach USB przeznaczonych na konkretne urządzenia.