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 w cmdline jądra i czyni je dostępnym do przyszłej rozbudowy.

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 polecenia cmdline jądra używanego w Androidzie 11 i starszych. Jednak w przypadku korzystania z tych usług występuje jedna ważna różnica:

  • Parametry muszą być rozdzielone sekwencją znaku nowej linii \n, a nie spacją.

Przykład programu rozruchowego

Przykładowy program rozruchowy znajdziesz w instrukcji dotyczącej rozruchu 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 skrypt: wykonuje 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 bootowania 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 życie. 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.

Wprowadź zmiany

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

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Dodaj parametr cmdline jądra bootconfig. 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 postaci:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Zmiany programu rozruchowego

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 rozruchu.

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
  • Magiczny ciąg znaków konfiguracji rozruchu 12 B (#BOOTCONFIG\n)

Parametry te pochodzą z 2 źródeł: parametrów znanych w czasie kompilacji i tych, które są niedostępne w czasie kompilacji. Należy dodać nieznane parametry.

Parametry znane w czasie kompilacji są spakowane na końcu obrazu vendor_boot w sekcji rozruchowej. Rozmiar sekcji jest zapisywany (w bajtach) w polu nagłówka rozruchowego 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 rozruchowych przed zastosowaniem zwiastuna konfiguracji rozruchowej.

Jeśli po zastosowaniu pliku bootconfig trailer chcesz dodać jakieś parametry, zastąp go nowym plikiem i ponownie go zastosuj.

cząstkowa implementacja i weryfikacja,

Wdrożenie funkcji bootconfig metodą iteracyjną polega na wykonaniu czynności opisanych w tej sekcji. Pozostaw parametry wiersza poleceń jądra bez zmian podczas dodawania parametrów Bootconfig.

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

  1. Wprowadź zmiany w programie rozruchowym i kompilacji, a potem wykonaj te czynności:
    1. Dodaj nowy parametr rozruchowy za pomocą zmiennej BOARD_BOOTCONFIG.
    2. Zachowaj parametry wiersza poleceń jądra w niezmienionej postaci, aby urządzenie mogło nadal się prawidłowo 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 wiersza poleceń jądra do konfiguracji rozruchowej za pomocą zmiennej BOARD_BOOTCONFIG i programu rozruchowego.
  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 ukończona.

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 ulepszane z Androida 11 lub starszego na Androida 12 lub nowszego mogą nadal używać parametrów 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 działania

$ 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. Informacje o różnych typach błędów znajdziesz w pliku init/main.c.