Implementacja USB HAL

Wersja Androida 8.0 przenosi obsługę poleceń USB ze skryptów init do natywnego demona USB, co zapewnia 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 osiągane za pomocą skryptów init specyficznych dla urządzenia (przy użyciu wyzwalaczy właściwości). Przejście na projekt warstwy abstrakcji sprzętu (HAL) skutkuje znacznie czystszą implementacją, która rozwiązuje następujące problemy:

  1. Operacje takie jak zapis do węzłów sysfs jądra mogą zakończyć się niepowodzeniem, ale nie zostaną przekazane z powrotem do kodu struktury, który ustawia wyzwalacz właściwości. W rezultacie frameworki błędnie zakładają, że operacje powiodły się, mimo że po cichu zakończyły się niepowodzeniem.
  2. skrypty init mają ograniczoną liczbę operacji, które można wykonać.

W wersji Androida 12 dodano obsługę HAL gadżetu USB dla modeli sterowania sieciowego (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ń API dostępnych poprzez USB HAL można znaleźć w podsumowaniu pakietu android.hardware.usb .

HAL i wysokie tony

Skrypty init specyficzne dla urządzenia zostały użyte jako substytut warstw HAL w celu wykonywania operacji USB specyficznych dla urządzenia. USB (poprzez 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 powinno 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ć na własnych, natywnych demonach. Eliminuje to potrzebę posiadania ekskluzywnego demona USB, ponieważ warstwa HAL ładnie podwaja się jako demon USB.

Domyślna implementacja 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ądzeń w wersji wcześniejszej niż Android 8.0. Android 8.0 wykorzystuje interfejs HAL do sprawdzania stanu portów USB oraz do wykonywania zamiany ról danych i ról zasilania.

Realizacja

Na każdym urządzeniu z systemem Android 8.0 należy zaimplementować nowy interfejs USB HAL. Domyślna implementacja powinna obsługiwać urządzenia z systemem starszym 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. W skryptach USB specyficznych dla urządzenia mogą być wymagane trywialne zmiany, aby przenieść własność węzłów typu c-c na system.