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 na polecenie jądra i czyni je dostępnym do przyszłego rozszerzenia.
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 wiersza poleceń jądra używanego w Androidzie 11 i starszych wersjach.
Jednak w przypadku korzystania z tych usług występuje jedna ważna różnica:
- Parametry muszą być rozdzielone sekwencją znaku ucieczki nowego wiersza
\n
, a nie spacją.
Przykład programu rozruchowego
Przykładem programu rozruchowego jest implementacja referencyjna programu rozruchowego 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 plik wykonuje 2 działania: dodaje 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 rozruchu dostawcy w wersji 4, znajdziesz w artykule mkbootimg changes for
bootconfig
.
Zapoznaj się ze zmianami w Cuttlefish, które umożliwiają:
- Użyj (lub zaktualizuj) wersji nagłówka dostawcy w bootowaniu v4.
- Dodaj bootconfig do cmdline jądra i przenieś wybrane parametry do pliku bootconfig.
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 dużych odstępach czasu. 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.
Zmiany w kompilacji
Najpierw zaktualizuj wersję nagłówka rozruchu do wersji 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
Dodaj parametr bootconfig
do cmdline jądra. 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 formie:
- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing
+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing
Zmiany w programie rozruchowym
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 rozruchowego dostawcy.
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
- 12 B bajtów ciągu magicznego bootconfig (
#BOOTCONFIG\n
)
Parametry pochodzą z 2 źródeł: parametrów znanych w momencie kompilacji oraz parametrów, które nie są znane w momencie kompilacji. Należy dodać nieznane parametry.
Parametry znane w momencie kompilacji są pakowane na końcu obrazu vendor_boot
w sekcji bootconfig. Rozmiar sekcji jest przechowywany (w bajtach) w polu nagłówka rozruchu 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 bootconfig przed zastosowaniem bootconfig trailer.
Jeśli po zastosowaniu pliku bootconfig trailer chcesz dodać jakieś parametry, nadpisz ten plik i zastosuj go ponownie.
cząstkowa implementacja i weryfikacja,
Wdrożenie funkcji bootconfig metodą iteracyjną polega na wykonaniu czynności opisanych 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ą:
- Wprowadź zmiany w bootloadzie i kompilacji, a potem:
- Użyj zmiennej
BOARD_BOOTCONFIG
, aby dodać nowy parametr bootconfig. - 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.
- Użyj zmiennej
- Zweryfikuj swoje treści, sprawdzając zawartość
/proc/bootconfig
. Sprawdź, czy po uruchomieniu urządzenia widzisz nowo dodany parametr. - Przenieś parametry
androidboot.*
z cmdline jądra do bootconfig, używając zmiennejBOARD_BOOTCONFIG
i bootloadera. - 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 przeprowadzona prawidłowo.
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 z Androidem 11 lub starszym można uaktualnić do wersji 12 lub nowszej, zachowując parametry 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
$ 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. Aby wyświetlić różne typy błędów, otwórz plik init/main.c.