Implementacja interfejsu HAL USB

W wersji 8.0 Androida obsługa poleceń USB została przeniesiona ze skryptów initdo natywnego demona USB, aby zapewnić lepszą konfigurację i sprawdzanie 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 na poziomie warstwy abstrakcji sprzętowej (HAL) skutkuje znacznie czystszą 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 zostały użyte jako zamienniki warstw HAL do wykonywania operacji USB na konkretnych urządzeniach. USB (przez ADB) jest głównym interfejsem do debugowania problemów z systemem. Użycie natywnego demona do konfiguracji USB eliminuje zależność od kodu frameworku, więc nawet jeśli framework ulegnie awarii, USB powinien działać.

W ramach modelu Treble, który również został wprowadzony w Androidzie 8.0, wszystkie interfejsy HAL są izolowane od usług systemowych i mu być uruchamiane w ramach własnych natywnych demonów. 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 w wersji 8.0 lub starszej. Dlatego na urządzeniach z Androidem 8.0 lub starszym nie trzeba będzie wykonywać żadnych czynności związanych z konkretnym urządzeniem. Android 8.0 używa interfejsu HAL do sprawdzania stanu portów USB i wymiany ról danych oraz ról 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. Aby przenieść własność węzłów typc-c do systemu, mogą być wymagane drobne zmiany w skryptach USB dotyczących konkretnych urządzeń.