Wdrażanie konfiguracji rozruchowej w Androidzie 12

W Androidzie 12 funkcja rozruchu zastępuje Opcje polecenia cmdline jądra systemu androidboot.* używane w Androidzie 11 lub niższy. 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. Przenoszenie długiego jądra systemu androidboot.* tworzy miejsce w wierszu cmdline jądra i sprawia, można ją wykorzystać w przyszłości.

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

  • Pierwsza wersja obsługująca tę funkcję: Android 12
  • Pierwsza wersja jądra obsługująca tę obsługę: jądro 12-5.4.xx

Wdróż funkcję rozruchu na nowych urządzeniach z wersjami 12–5.10.xx wersji jądra systemu operacyjnego. 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 z uwagi na sposób korzystania z urządzenia musisz zwrócić uwagę na tę różnicę:

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

Przykład programu rozruchowego

Przykład bootloadera znajdziesz w implementacji bootloadera referencyjnego U-boot firmy Cuttlefish. Poniżej znajdziesz 2 zatwierdzenia w dokumentacji. Pierwsze wzrosty obsługę najnowszej wersji nagłówka rozruchowego. W tym przykładzie pierwszy element zatwierdzenia aktualizacji (lub przyspieszenia) obsługi kolejnych wersji (v4). Druga ma dwie rzeczy: dodaje obsługę konfiguracji rozruchowej i pokazuje dodawanie parametrów w czasie działania:

Przykładowa kompilacja

W przypadku przykładowej kompilacji, w której widać zmiany w elemencie mkbootimg, aby utworzyć vendor_boot.img z nagłówkiem rozruchowym dostawcy w wersji 4: patrz 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 przenieść parametry androidboot.* z wiersza poleceń jądra do pliku bootconfig. Najlepszym sposobem na wprowadzenie tej zmiany jest stopniowe wprowadzanie tych zmian. zobacz Sekcja Implementacja i weryfikacja przyrostowa .

Jeśli masz zmiany, które powodują wyszukiwanie androidboot.* w pliku /proc/cmdline , zamiast tego wskaż plik /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 bootconfig jądra. W ten sposób jądro będzie szukać sekcji bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Parametry w konfiguracji rozruchowej są tworzone na podstawie parametrów w pliku Zmienna BOARD_BOOTCONFIG, podobnie jak cmdline jądra tworzonego 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

Program rozruchowy konfiguruje initramfs przed przejściem do jądra. Jądro konfiguracja uruchamiania wyszukuje sekcję rozruchu i wyszukuje ją na samym końcu initramfs, z oczekiwanym zwiastunem.

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 bootconfigu 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 pochodzą z 2 źródeł: parametrów znanych w momencie kompilacji oraz Parametry, które są nieznane w momencie kompilacji. Należy dodać nieznane parametry.

Parametry znane w czasie kompilacji są spakowane na końcu vendor_boot w sekcji konfiguracji rozruchowej. Zapisywany rozmiar sekcji (w bajtach) w polu nagłówka rozruchu dostawcy vendor_bootconfig_size.

Parametry, które nie są znane w czasie kompilacji, są znane tylko w czasie działania programu rozruchowego. Należy je dodać na końcu sekcji parametrów rozruchu przed zastosowaniem zwiastuna rozruchowego.

Jeśli po zastosowaniu zwiastuna rozruchowego musisz dodać jakieś parametry, zastąp zwiastun i zastosuj go ponownie.

Implementacja i weryfikacja przyrostowa

Stopniowo wdrażaj funkcję rozruchu, postępując zgodnie z instrukcjami podanymi w 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 programie rozruchowym i kompilacji, a potem wykonaj te czynności:
    1. Dodawanie nowej konfiguracji rozruchowej przy użyciu zmiennej BOARD_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 swoją pracę, sprawdzając zawartość dokumentu /proc/bootconfig. Zweryfikuj zobaczysz nowo dodany parametr po uruchomieniu urządzenia.
  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 ukończona.

Uwagi na temat uaktualniania OTA i przechodzenia na niższą wersję

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 rozruchem konfiguracyjnym . 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 weryfikacji nie widzisz oczekiwanych parametrów w /proc/bootconfig sprawdź logi jądra w logcat. Zawsze znajdziesz dziennik wpis dla konfiguracji rozruchowej, jeśli ją obsługuje.

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 wyświetli się dziennik błędów, oznacza to, że podczas wczytywania konfiguracji rozruchowej. Aby wyświetlić różne typy błędów, otwórz plik init/main.c.