Wdrażanie konfiguracji rozruchowej w Androidzie 12

W Androidzie 12 funkcja bootconfig zastępuje opcje cmdline jądraandroidboot.* używane w Androidzie 11 i starszych wersjach. Funkcja bootconfig to mechanizm przekazywania szczegółów konfiguracji z kompilacji i bootloadera do Androida 12.

Ta funkcja umożliwia oddzielenie parametrów konfiguracji przestrzeni użytkownika Androida od parametrów jądra. Przeniesienie długich parametrów jądra androidboot.* do pliku bootconfig tworzy miejsce na polecenie jądra i czyni je dostępnym do przyszłego rozszerzenia.

Zarówno jądro, jak i przestrzeń użytkownika Androida muszą obsługiwać bootconfig.

  • Pierwsza wersja, która obsługuje tę funkcję: Android 12
  • Pierwsza wersja jądra, która obsługuje tę funkcję: 12-5.4.xx

Wdrożyć funkcję bootconfig na nowych urządzeniach z jądrem w wersji 12-5.10.xx. Jeśli aktualizujesz urządzenia, nie musisz tego robić.

Przykłady i źródło

Podczas przeglądania przykładów i kodu źródłowego w tej sekcji pamiętaj, że format kodu bootconfig różni się tylko nieznacznie od formatu wiersza poleceń jądra używanego w Androidzie 11 i starszych wersjach. Jednak w przypadku korzystania z tych usług występuje jedna ważna różnica:

  • Parametry muszą być rozdzielone sekwencją znaku ucieczki nowego wiersza \n, a nie spacją.

Przykład programu rozruchowego

Przykładem programu rozruchowego jest implementacja referencyjna programu rozruchowego Cuttlefish U-boot. Poniżej znajdziesz 2 commity z tego repozytorium. Pierwsza aktualizacja zmienia wersję nagłówka rozruchu na najnowszą. W tym przykładzie pierwsze potwierdzenie aktualizuje (lub podnosi) wersję do następnej, czyli 4. Drugi plik wykonuje 2 działania: dodaje obsługę bootconfig i pokazuje dodawanie parametrów w czasie wykonywania:

Przykład kompilacji

Przykład kompilacji, który pokazuje zmiany w mkbootimg w wersji kompilacji vendor_boot.img z nagłówkiem rozruchu dostawcy w wersji 4, znajdziesz w artykule mkbootimg changes for bootconfig. Zapoznaj się ze zmianami w Cuttlefish, które umożliwiają:

Implementacja

Partnerzy muszą dodać obsługę do swoich bootloaderów i przesunąć parametry androidboot.* z kompilacji do cmdline jądra w pliku bootconfig. Najlepszym sposobem na wdrożenie tej zmiany jest stopniowe wprowadzanie jej w dużych odstępach czasu. Więcej informacji o tym procesie znajdziesz w sekcji Stopniowe wdrażanie i weryfikowanie.

Jeśli masz zmiany, które wyszukiwały parametry androidboot.* w pliku /proc/cmdline, skieruj je zamiast tego do pliku /proc/bootconfig. Właściwości ro.boot.* są ustawiane za pomocą nowych wartości bootconfig, więc nie musisz wprowadzać zmian w kodzie, który ich używa.

Zmiany w kompilacji

Najpierw zaktualizuj wersję nagłówka rozruchu do wersji 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Dodaj parametr bootconfig do cmdline jądra. W ten sposób jądro będzie szukać sekcji bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Parametry bootconfig są tworzone na podstawie parametrów zmiennej BOARD_BOOTCONFIG, podobnie jak cmdline jądra jest tworzony na podstawie BOARD\_KERNEL\_CMDLINE.

Wszystkie parametry androidboot.* można przenieść w postaci domyślnej, np. w takiej formie:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Zmiany w programie rozruchowym

Bootloader konfiguruje initramfs, zanim przejdzie do jądra. Konfiguracja rozruchu jądra szuka sekcji bootconfig i oczekuje, że będzie ona znajdować się na końcu pliku initramfs, z oczekiwanym wstępem.

Bootloader pobiera informacje o układzie vendor_boot.img z nagłówka obrazu rozruchowego dostawcy.

Schemat rozkładu alokacji pamięci bootconfig

Rysunek 1. Przydział pamięci bootconfig w Androidzie 12

Bootloader tworzy w pamięci sekcję bootconfig. Sekcja bootconfig zawiera alokacje pamięci dla:

  • Parametry
  • Rozmiar 4 B parameters size
  • Rozmiar 4 B parameters checksum
  • 12 B bajtów ciągu magicznego bootconfig (#BOOTCONFIG\n)

Parametry pochodzą z 2 źródeł: parametrów znanych w momencie kompilacji oraz parametrów, które nie są znane w momencie kompilacji. Należy dodać nieznane parametry.

Parametry znane w momencie kompilacji są pakowane na końcu obrazu vendor_boot w sekcji bootconfig. Rozmiar sekcji jest przechowywany (w bajtach) w polu nagłówka rozruchu dostawcy vendor_bootconfig_size.

Parametry, które nie są znane w momencie kompilacji, są znane tylko w czasie działania w bootloaderze. Należy je dodać na końcu sekcji parametrów bootconfig przed zastosowaniem bootconfig trailer.

Jeśli po zastosowaniu pliku bootconfig trailer chcesz dodać jakieś parametry, nadpisz ten plik i zastosuj go ponownie.

cząstkowa implementacja i weryfikacja,

Wdrożenie funkcji bootconfig metodą iteracyjną polega na wykonaniu czynności opisanych w tej sekcji. Podczas dodawania parametrów bootconfig nie zmieniaj parametrów cmdline jądra.

Oto kroki, które należy wykonać, aby wdrożyć metodę stopniowego wdrażania z weryfikacją:

  1. Wprowadź zmiany w bootloadzie i kompilacji, a potem:
    1. Użyj zmiennej BOARD_BOOTCONFIG, aby dodać nowy parametr bootconfig.
    2. Nie zmieniaj parametrów cmdline jądra, aby urządzenie mogło prawidłowo się uruchamiać. Dzięki temu debugowanie i weryfikacja są znacznie łatwiejsze.
  2. Zweryfikuj swoje treści, sprawdzając zawartość /proc/bootconfig. Sprawdź, czy po uruchomieniu urządzenia widzisz nowo dodany parametr.
  3. Przenieś parametry androidboot.* z cmdline jądra do bootconfig, używając zmiennej BOARD_BOOTCONFIG i bootloadera.
  4. Sprawdź, czy każdy z parametrów znajduje się w pliku /proc/bootconfig, i czy nie ma go w pliku /proc/cmdline. Jeśli możesz to potwierdzić, oznacza to, że implementacja została przeprowadzona prawidłowo.

Przechodzenie na wyższą lub niższą wersję za pomocą aktualizacji OTA

Podczas zarządzania aktualizacjami OTA i obniżkami między różnymi wersjami Androida lub różnymi wersjami jądra należy zachować szczególną ostrożność.

Android 12 to pierwsza wersja z obsługą bootconfig. Jeśli chcesz wrócić do wersji wcześniejszej, zamiast bootconfig należy użyć parametrów cmdline jądra.

Wersje jądra 12-5.4 i nowsze obsługują bootconfig. Jeśli chcesz wrócić do wersji wcześniejszej(w tym 11-5.4), musisz użyć parametrów cmdline jądra.

Urządzenia z Androidem 11 lub starszym można uaktualnić do wersji 12 lub nowszej, zachowując parametry cmdline jądra. To samo dotyczy uaktualniania wersji jądra.

Rozwiązywanie problemów

Jeśli po wykonaniu kroku sprawdzania nie widzisz oczekiwanych parametrów w /proc/bootconfig, sprawdź dzienniki jądra w logcat. Jeśli ją obsługuje, w pliku dziennika zawsze jest wpis dotyczący bootconfig.

Przykładowy wynik

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Jeśli zwrócony zostanie dziennik błędów, oznacza to, że wystąpił problem z wczytywaniem pliku bootconfig. Aby wyświetlić różne typy błędów, otwórz plik init/main.c.