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:
- Zaktualizuj obsługę wersji nagłówka rozruchowego do najnowszej wersji v4 .
- Dodaj obsługę bootconfig .
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:
- Użyj (lub uaktualnij) nagłówka rozruchowego dostawcy w wersji v4 .
- Dodaj
bootconfig to the kernel cmdline and move selected parameters to bootconfig
.
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.
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ą:
- Wprowadź zmiany w programie ładującym i kompilacji, a następnie wykonaj następujące czynności:
- Użyj zmiennej
BOARD_BOOTCONFIG
, aby dodać nowy parametr bootconfig. - 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.
- Użyj zmiennej
- Zweryfikuj swoją pracę, sprawdzając zawartość
/proc/bootconfig
. Sprawdź, czy po uruchomieniu urządzenia widzisz nowo dodany parametr. - Przenieś parametry
androidboot.*
z wiersza poleceń jądra do bootconfig, używając zmiennejBOARD_BOOTCONFIG
i programu ładującego. - 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 .