W Androidzie 8.0 przeniesiono obsługę poleceń USB ze init
skryptów do natywnego demona USB, co zapewnia lepszą konfigurację i większą niezawodność kodu. W przypadku konfiguracji funkcji gadżetu skryptyinit
(aktywatory 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 (z użyciem wyzwalaczy właściwości). Przejście na warstwę abstrakcji sprzętu (HAL) zapewnia znacznie czystszą implementację, która rozwiązuje te problemy:
- Operacje takie jak zapisywanie w węzłach sysfs jądra mogą się nie powieść, ale nie są przekazywane z powrotem do kodu platformy, który ustawia wyzwalacz właściwości. W rezultacie platformy błędnie zakładają, że operacje zakończyły się powodzeniem, mimo że w rzeczywistości nie powiodły się bez zgłaszania błędów.
init
skrypty mają ograniczoną liczbę operacji, które można wykonać.
W Androidzie 12 dodano obsługę interfejsu HAL urządzenia USB dla modeli kontroli sieci (NCM) i wywołań interfejsu API, które zwracają numer wersji interfejsu HAL i szybkość USB. Więcej informacji o wywołaniach interfejsu API dostępnych w warstwie HAL USB znajdziesz w podsumowaniu pakietu android.hardware.usb
.
HAL i Treble
Skrypty init
przeznaczone na konkretne urządzenia zostały użyte jako zamiennik warstw HAL do wykonywania operacji USB na konkretnych urządzeniach. USB (przez ADB) to podstawowy interfejs do debugowania problemów z systemem. Dzięki natywnemu demonowi do konfigurowania USB nie ma zależności od kodu platformy, więc nawet jeśli platforma ulegnie awarii, USB powinien działać.
W modelu Treble, który został wprowadzony w Androidzie 8.0, wszystkie warstwy HAL są odizolowane od usług systemowych i muszą działać w swoich własnych natywnych demonach. Dzięki temu nie trzeba mieć wyłącznego demona USB, ponieważ warstwa HAL pełni również funkcję demona USB.
Domyślna implementacja HAL obsługuje wszystkie urządzenia z Androidem w wersji starszej niż 8.0. Dlatego w przypadku urządzeń z Androidem starszym niż 8.0 nie trzeba wykonywać żadnych czynności związanych z konkretnym urządzeniem. Android 8.0 używa interfejsu HAL do sprawdzania stanu portów USB oraz do 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 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 USB-C. Może być konieczne wprowadzenie drobnych zmian w skryptach USB specyficznych dla urządzenia, aby przenieść własność węzłów typu C na system.