Korzystanie z DebugFS w systemie Android 12

Urządzenia uruchamiane z systemem Android 12 i wersją jądra wyższą niż v5.4 muszą być dostarczane z jądrem GKI. Aby partnerzy mogli uzyskać dostęp do DebugFS w kompilacjach userdebug podczas programowania na jądrze GKI, konfiguracja jądra CONFIG_DEBUG_FS jest włączona w GKI defconfig. Nigdy nie montuj DebugFS w kompilacjach użytkowników dla urządzeń uruchamianych na Androidzie 12.

Kompilacje debugowania użytkownika mają lepszy zasięg testów niż kompilacje użytkowników i są intensywnie testowane w całym cyklu programowania. Poniższy plan minimalizuje różnicę między dwoma typami kompilacji w odniesieniu do dostępu do DebugFS i zapewnia następujące korzyści:

  • Zapobiega przypadkowemu uzależnieniu kompilacji userdebug od DebugFS w celu uzyskania nowych funkcjonalności
  • Zapewnia, że ​​każda istniejąca funkcjonalność, która została uszkodzona z powodu braku DebugFS, jest znana na wczesnym etapie cyklu rozwojowego

Dostępy Debugfs w kompilacjach userdebug są podzielone na następujące kategorie:

  1. Inicjalizacja pliku DebugFS podczas uruchamiania urządzenia, na przykład dostęp do zapisu do pliku w DebugFS w celu włączenia zbierania danych debugowania.
  2. Generowanie raportu o błędach: HAL stanu zrzutu odczytuje pliki DebugFS , gdy DumpstateBoard() jest wywoływana przez dumpstate . Informacje te stają się częścią raportu o błędzie.
  3. Testowanie i walidacja specyficzne dla urządzenia.

W poniższej tabeli opisano, jak każda z tych trzech kategorii jest obsługiwana w systemie Android 12. Należy pamiętać, że poniższe informacje dotyczą tylko kompilacji userdebug, ponieważ DebugFS nie można zamontować w kompilacjach użytkownika.

Przypadek użycia Kompilacja debugowania użytkownika Androida 12
Jednorazowa inicjalizacja plików DebugFS podczas uruchamiania . Dostęp ten ma miejsce tylko raz podczas rozruchu. Dumpstate HAL wykonuje to podczas inicjalizacji HAL. Aby to umożliwić, init montuje DebugFS w kompilacjach userdebug przed inicjalizacją warstwy HAL. Init wywołuje umount() na DebugFS , gdy urządzenie zakończy uruchamianie.
Generowanie raportu o błędzie : stan zrzutu HAL odczytuje pliki DebugFS , które stają się częścią raportu o błędzie. Wykonywane przez HAL stanu zrzutu w ramach DumpstateBoard() po wywołaniu przez stan zrzutu ( DumpstateDevice.cpp ). Narzędzie dumpstate (część platformy Android) gwarantuje, że DebugFS zostanie zamontowany podczas wywołania.
Testowanie i walidacja specyficzne dla urządzenia Korzeń Adb i powłoka. Zamontuj DebugFS z powłoki adb z dostępem do roota 1 .

1 Aby zamontować DebugFS z adb shell z dostępem roota, użyj tego polecenia:

adb shell mount -t debugfs debugfs /sys/kernel/debug .

Wymagane działania partnera

W oparciu o te zmiany na urządzeniach z Androidem 12 partnerzy muszą wprowadzić następujące zmiany:

  • Spraw, aby wszystkie inicjalizacje węzłów DebugFS miały miejsce podczas inicjalizacji HAL stanu zrzutu. Aby zapoznać się z przykładem, jak to zrobić, zobacz DNM: Przykład inicjalizacji plików DebugFS w czasie rozruchu .
  • Nie zezwalaj na dostęp do DebugFS w czasie wykonywania. Obowiązują następujące wyjątki:
    • Generowanie raportu o błędach (pochodzi ze stanu zrzutu HAL)
    • Testowanie i sprawdzanie poprawności (dostępne przez adb root i shell - upewnij się, że DebugFS jest zamontowany jako pierwszy)

Deweloperzy mogą ustawić trwałą właściwość debugowania persist.dbg.keep_debugfs_mounted , aby zachować zamontowanie DebugFs po ponownym uruchomieniu kompilacji userdebug i eng.

Testy zgodności GTS zapewniają, że system plików DebugFS nie jest zamontowany w kompilacjach użytkowników. Instrukcje Sepolicy neverallow zapewniają, że na urządzeniach uruchamianych w systemie Android 12 lub nowszym nieautoryzowane procesy nie uzyskają dostępu do DebugFs .