Implementacja USB HAL

Wersja Androida 8.0 przenosi obsługę poleceń USB ze skryptów init do natywnego demona USB, aby zapewnić lepszą konfigurację i niezawodność kodu. W przypadku konfiguracji funkcji gadżetu skrypty init (wyzwalacze właściwości) służą do wykonywania operacji na gadżetach specyficznych dla urządzenia.

W poprzednich wersjach te konfiguracje specyficzne dla urządzenia były uzyskiwane za pomocą init specyficznych dla urządzenia (przy użyciu wyzwalaczy właściwości). Przejście do projektu warstwy abstrakcji sprzętu (HAL) skutkuje znacznie czystszą implementacją, która rozwiązuje następujące problemy:

  1. Operacje, takie jak zapisy do węzłów jądra sysfs, mogą zakończyć się niepowodzeniem, ale nie mogą być propagowane z powrotem do kodu frameworka, który ustawia wyzwalacz właściwości. W rezultacie frameworki błędnie zakładają, że operacje zakończyły się sukcesem, nawet jeśli po cichu zawiodły.
  2. init mają ograniczoną liczbę operacji, które można wykonać.

Wersja Androida 12 dodaje obsługę HAL gadżetu USB dla modeli sterowania siecią (NCM) i wywołań API, które zwracają zarówno numer wersji HAL, jak i prędkość USB. Więcej informacji na temat wywołań interfejsu API dostępnych za pośrednictwem warstwy HAL USB można znaleźć w podsumowaniu pakietu android.hardware.usb .

HAL i Treble

Skrypty init specyficzne dla urządzenia zostały użyte jako substytut warstw HAL do wykonywania operacji USB specyficznych dla urządzenia. USB (przez ADB) to podstawowy interfejs do debugowania problemów systemowych. Posiadanie natywnego demona do wykonywania konfiguracji USB eliminuje zależność od kodu frameworka, więc nawet jeśli framework ulegnie awarii, USB powinien działać.

W modelu Treble wprowadzonym również w systemie Android 8.0 wszystkie warstwy HAL są odizolowane od usług systemowych i muszą działać we własnych natywnych demonach. Eliminuje to wymóg posiadania wyłącznego demona USB, ponieważ warstwa HAL ładnie podwaja się jako demon USB.

Domyślna implementacja warstwy HAL obsługuje wszystkie urządzenia z systemem starszym niż Android 8.0. W związku z tym nie byłoby żadnej pracy specyficznej dla urządzenia dla urządzeń starszych niż Android 8.0. Android 8.0 używa interfejsu HAL do sprawdzania stanu portów USB oraz do wykonywania zamiany ról danych i zasilania.

Realizacja

Nowy interfejs USB HAL musi być zaimplementowany na każdym urządzeniu uruchamianym na Androidzie 8.0. Domyślna implementacja powinna obsługiwać urządzenia starsze niż Android 8.0. Domyślna implementacja jest wystarczająca, jeśli urządzenie używa klasy dual_role_usb do raportowania stanu portu typu c. Mogą być wymagane drobne zmiany w skryptach USB specyficznych dla urządzenia, aby przenieść własność węzłów typc-c na system.