Wdrażanie konfiguracji rozruchowej w Androidzie 12

W Androidzie 12 funkcja bootconfig zastępuje androidboot.*opcje wiersza poleceń jądra używane w Androidzie 11androidboot.* i starszych wersjach. Funkcja bootconfig to mechanizm przekazywania szczegółów konfiguracji z kompilacji i programu rozruchowego do Androida 12.

Ta funkcja umożliwia oddzielenie parametrów konfiguracji przestrzeni użytkownika Androida od parametrów konfiguracji jądra. Przeniesienie długich parametrów androidboot.* jądra do pliku bootconfig zwalnia miejsce w wierszu poleceń jądra i umożliwia jego rozbudowę w przyszłości.

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ę: jądro 12-5.4.xx

Wdrażanie funkcji bootconfig na nowych urządzeniach z wersją jądra 12-5.10.xx. Jeśli uaktualniasz 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 zwróć uwagę, ż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 Twojego użytkowania ważna jest ta różnica:

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

Przykład programu rozruchowego

Przykład bootloadera znajdziesz w referencyjnej implementacji bootloadera U-boot Cuttlefish. Poniżej znajdziesz 2 zatwierdzenia w odniesieniu. Pierwsza aktualizacja podnosi wersję nagłówka rozruchowego do najnowszej wersji. W tym przykładzie pierwszy commit aktualizuje (lub podnosi) obsługę wersji do następnej, czyli v4. Drugi skrypt wykonuje 2 czynności: dodaje obsługę bootconfig i pokazuje, jak dodawać parametry w czasie działania:

Tworzenie przykładu

Przykład kompilacji, w którym mkbootimg zmienia się w celu utworzenia vendor_boot.img z nagłówkiem rozruchowym dostawcy w wersji 4, znajdziesz w mkbootimg changes for bootconfig. Zapoznaj się ze zmianami w Cuttlefish, aby wykonać te czynności:

Implementacja

Partnerzy muszą dodać obsługę do programów rozruchowych i przenieść parametry czasu kompilacjiandroidboot.* z wiersza poleceń jądra do pliku konfiguracji rozruchu. Najlepiej wprowadzać tę zmianę stopniowo. Więcej informacji o tym, jak to zrobić, znajdziesz w sekcji Stopniowe wdrażanie i weryfikacja.

Jeśli masz zmiany, które wyszukują w pliku /proc/cmdline androidboot.*parametry, przekieruj je do pliku /proc/bootconfig. Właściwości ro.boot.* są ustawiane z nowymi wartościami bootconfig, więc nie musisz wprowadzać zmian w kodzie, który korzysta z tych właściwości.

Wprowadzanie zmian w kompilacji

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

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Dodaj parametr bootconfig wiersza poleceń jądra. Spowoduje to, że jądro będzie szukać sekcji bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

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

Wszystkie parametry androidboot.* można przenieść w takiej postaci, w jakiej są, np.:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Zmiany w programie rozruchowym

Program rozruchowy konfiguruje initramfs przed przejściem do jądra. Konfiguracja uruchamiania jądra wyszukuje sekcję bootconfig i sprawdza, czy znajduje się ona na samym końcu initramfs, z oczekiwanym zakończeniem.

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

Diagram układu alokacji pamięci w konfiguracji rozruchu

Rysunek 1. Alokacja pamięci w bootconfigu Androida 12

Program rozruchowy tworzy w pamięci sekcję bootconfig. Sekcja bootconfig zawiera przydziały pamięci dla tych elementów:

  • Parametry
  • Rozmiar 4 B parameters size
  • Rozmiar 4 B parameters checksum
  • Ciąg magiczny 12 B w konfiguracji rozruchu (#BOOTCONFIG\n)

Parametry pochodzą z 2 źródeł: parametry znane w momencie kompilacji i parametry nieznane w momencie kompilacji. Nieznane parametry muszą zostać dodane.

Parametry znane w momencie kompilacji są umieszczane na końcu vendor_bootobrazu w sekcji bootconfig. Rozmiar sekcji jest przechowywany (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 programu rozruchowego. Muszą one zostać dodane na końcu sekcji parametrów bootconfig przed zastosowaniem przyczepy bootconfig.

Jeśli po zastosowaniu przyczepy bootconfig musisz dodać jakieś parametry, zastąp przyczepę i zastosuj ją ponownie.

Stopniowe wdrażanie i weryfikacja

Wdrażaj funkcję bootconfig stopniowo, wykonując czynności opisane w tej sekcji. Pozostaw parametry wiersza poleceń jądra bez zmian, a parametry bootconfig zostaną dodane.

Oto etapy implementacji przyrostowej z weryfikacją:

  1. Wprowadź zmiany w programie rozruchowym i kompilacji, a potem wykonaj te czynności:
    1. Użyj zmiennej BOARD_BOOTCONFIG, aby dodać nowy parametr bootconfig.
    2. Pozostaw parametry wiersza poleceń jądra bez zmian, aby urządzenie mogło nadal prawidłowo się uruchamiać. Ułatwia to debugowanie i weryfikację.
  2. Sprawdź swoją pracę, przeglądają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 rozruchu za pomocą zmiennej BOARD_BOOTCONFIG i programu rozruchowego.
  4. Sprawdź, czy każdy z parametrów występuje w /proc/bootconfig ORAZ czy nie występuje w /proc/cmdline. Jeśli możesz to potwierdzić, implementacja została przeprowadzona prawidłowo.

Uwagi dotyczące przechodzenia na wyższą lub niższą wersję usługi OTA

Podczas zarządzania aktualizacjami i przywracaniem starszych wersji Androida lub różnych wersji jądra należy zachować szczególną ostrożność.

Android 12 to pierwsza wersja obsługująca bootconfig. Jeśli chcesz wrócić do wersji wcześniejszej, zamiast bootconfig musisz użyć parametrów wiersza poleceń jądra.

Bootconfig jest obsługiwany w wersjach jądra 12-5.4 i nowszych. Jeśli chcesz wrócić do wersji wcześniejszej niż ta(w tym 11-5.4), musisz użyć parametrów wiersza poleceń jądra.

Uaktualnienia z Androida 11 i starszych wersji do Androida 12 i nowszych mogą nadal używać parametrów wiersza poleceń jądra. To samo dotyczy uaktualniania wersji jądra.

Rozwiązywanie problemów

Jeśli podczas wykonywania kroku weryfikacji nie widzisz oczekiwanych parametrów w /proc/bootconfig, sprawdź dzienniki jądra w logcat. Jeśli jądro obsługuje bootconfig, zawsze będzie dostępny wpis w dzienniku.

Przykładowe dane wyjściowe logu

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

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