Implementacja Bootconfig w systemie Android 12

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

Ta funkcja umożliwia oddzielenie parametrów konfiguracyjnych przestrzeni użytkownika systemu Android od parametrów jądra. Przeniesienie długich parametrów jądra androidboot.* do pliku bootconfig powoduje utworzenie miejsca w wierszu poleceń jądra i udostępnienie go do łatwej przyszłej rozbudowy.

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

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

Zaimplementuj funkcję bootconfig dla nowych urządzeń uruchamianych z wersją jądra 12-5.10.xx. Nie musisz go wdrażać, jeśli aktualizujesz urządzenia.

Przykłady i źródło

Przeglądając przykłady i kod źródłowy w tej sekcji, zwróć uwagę, że format kodu bootconfig tylko nieznacznie różni się od formatu wiersza poleceń jądra używanego w systemie Android 11 i starszych wersjach. Jednak dla Twojego użytkowania ważna jest następująca różnica:

  • Parametry muszą być oddzielone sekwencją ucieczki nowej linii \n , a nie spacjami.

Przykład bootloadera

Aby zapoznać się z przykładem programu ładującego, zobacz referencyjną implementację programu ładującego U-boot mątwy. Poniżej wymieniono dwa zatwierdzenia w odnośniku. Pierwsza podnosi obsługę wersji nagłówka rozruchowego do najnowszej wersji. W tym przykładzie pierwsze zatwierdzenie aktualizuje (lub podnosi) obsługę wersji do następnej, v4. Drugi robi dwie rzeczy; dodaje obsługę bootconfig i demonstruje dodawanie parametrów w czasie wykonywania:

Przykład budowy

Przykład kompilacji pokazujący zmiany mkbootimg w celu zbudowania pliku vendor_boot.img z nagłówkiem rozruchowym dostawcy v4 można znaleźć w artykule mkbootimg changes for bootconfig . Zobacz zmiany w mątwie, aby wykonać następujące czynności:

Realizacja

Partnerzy muszą dodać obsługę swoich programów ładujących i przenieść parametry androidboot.* używane podczas kompilacji z wiersza cmd jądra do pliku bootconfig. Najlepszym sposobem wdrożenia tej zmiany jest wprowadzanie tego stopniowo; Aby uzyskać informacje na temat stosowania procesu przyrostowego, zobacz sekcję Przyrostowa implementacja i weryfikacja .

Jeśli masz zmiany, które wyszukują parametry androidboot.* w pliku /proc/cmdline, wskaż je zamiast tego na plik /proc/bootconfig. Właściwości ro.boot.* są ustawione przy użyciu nowych wartości bootconfig , więc nie ma potrzeby wprowadzania zmian w kodzie przy użyciu tych właściwości.

Budowanie zmian

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

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Dodaj parametr cmdline jądra bootconfig . To sprawia, że ​​jądro szuka sekcji bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

Parametry bootconfig są tworzone z parametrów w zmiennej BOARD_BOOTCONFIG , podobnie jak linia cmd jądra jest tworzona z BOARD\_KERNEL\_CMDLINE .

Wszelkie parametry androidboot.* można przenosić w niezmienionej postaci, podobnie jak poniżej:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Zmiany w bootloaderze

Program ładujący konfiguruje initramfs przed skokiem do jądra. Konfiguracja rozruchu jądra wyszukuje sekcję bootconfig i szuka jej na samym końcu initramfs, z oczekiwanym zwiastunem.

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

Diagram of bootconfig memory allocation layout

Rysunek 1. Przydział pamięci bootconfig w systemie Android 12

Program ładujący tworzy sekcję bootconfig w pamięci. Sekcja bootconfig zawiera alokację pamięci dla następujących elementów:

  • Parametry
  • 4 parameters size rozmiaru B
  • 4 Suma parameters checksum rozmiaru B
  • 12 B magiczny ciąg bootconfig ( #BOOTCONFIG\n )

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

Parametry znane w czasie kompilacji są pakowane na końcu obrazu vendor_boot 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 czasie kompilacji, są znane tylko w czasie wykonywania w bootloaderze. Należy je dodać na końcu sekcji parametrów bootconfig przed zastosowaniem zwiastuna bootconfig.

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

Przyrostowe wdrażanie i walidacja

Implementuj funkcję bootconfig stopniowo, postępując zgodnie z procesem opisanym w tej sekcji. Pozostaw parametry cmdline jądra niezmienione podczas dodawania parametrów bootconfig.

Oto kroki wdrożenia przyrostowego z walidacją:

  1. Wprowadź zmiany w programie ładującym i kompilacji, a następnie wykonaj następujące czynności:
    1. Użyj zmiennej BOARD_BOOTCONFIG , aby dodać nowy parametr bootconfig.
    2. Zachowaj parametry cmdline jądra w niezmienionym stanie, aby urządzenie mogło nadal poprawnie uruchamiać się. Dzięki temu debugowanie i weryfikacja są znacznie łatwiejsze.
  2. Zweryfikuj swoją pracę, 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 bootconfig, używając zmiennej BOARD_BOOTCONFIG i programu ładującego.
  4. Sprawdź , czy każdy z parametrów istnieje w /proc/bootconfig ORAZ czy nie ma ich w /proc/cmdline . Jeśli możesz to zweryfikować, oznacza to, że implementacja zakończyła się pomyślnie.

Uwagi dotyczące aktualizacji i obniżenia wersji OTA

Zarządzając aktualizacjami i wersjami OTA pomię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. W przypadku przejścia na dowolną wcześniejszą wersję, zamiast bootconfig należy użyć parametrów cmdline jądra.

Wersje jądra 12-5.4 i nowsze obsługują bootconfig. W przypadku przejścia na dowolną wcześniejszą wersję (w tym 11-5.4) należy użyć parametrów cmdline jądra.

Uaktualnienia z Androida 11 i starszych do Androida 12 i nowszych mogą nadal korzystać z parametrów cmdline jądra. To samo dotyczy aktualizacji 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 istnieje wpis w dzienniku dotyczący bootconfig, jeśli jądro to obsługuje.

Przykładowe wyjście dziennika

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

Jeśli zostanie wyświetlony dziennik błędów, oznacza to, że wystąpił problem z ładowaniem pliku bootconfig. Aby zobaczyć różne typy błędów, wyświetl plik init/main.c .