W Androidzie 12 funkcja bootconfig zastępuje opcje wiersza poleceń jądra androidboot.* używane w Androidzie 11 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
Wdróż funkcję 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 tylko nieznacznie różni się od formatu wiersza poleceń jądra używanego w Androidzie 11 i starszych wersjach.
Jednak w Twoim przypadku 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 programu rozruchowego znajdziesz w implementacji referencyjnego programu rozruchowego U-boot dla 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, który pokazuje zmiany w mkbootimg, aby utworzyć 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:
- Użyj wersji nagłówka rozruchowego dostawcy v4 (lub zaktualizuj ją do tej wersji).
- Dodaj bootconfig do wiersza poleceń jądra i przenieś wybrane parametry do bootconfig.
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,/proc/bootconfig skieruj 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.
Kompilowanie zmian
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 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 rozruchu jądra wyszukuje sekcję bootconfig i sprawdza, czy znajduje się ona na samym końcu initramfs, z oczekiwanym trailerem.
Program rozruchowy pobiera informacje o układzie vendor_boot.img z nagłówka obrazu rozruchowego dostawcy.
Rysunek 1. Alokacja pamięci bootconfig w Androidzie 12
Program rozruchowy tworzy w pamięci sekcję bootconfig. Sekcja bootconfig zawiera przydziały pamięci na potrzeby tych elementów:
- Parametry
- Rozmiar 4 B
parameters size - Rozmiar 4 B
parameters checksum - 12 B bootconfig magic string (
#BOOTCONFIG\n)
Parametry pochodzą z 2 źródeł: parametrów znanych w czasie kompilacji i parametrów, które nie są znane w czasie kompilacji. Nieznane parametry muszą zostać dodane.
Parametry znane w czasie 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 czasie 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 dodaj parametry bootconfig.
Oto etapy implementacji przyrostowej z weryfikacją:
- Wprowadź zmiany w programie rozruchowym i kompilacji, a potem wykonaj te czynności:
- Użyj zmiennej
BOARD_BOOTCONFIG, aby dodać nowy parametr bootconfig. - Pozostaw parametry wiersza poleceń jądra bez zmian, aby urządzenie mogło nadal prawidłowo się uruchamiać. Ułatwia to debugowanie i weryfikację.
- Użyj zmiennej
- Sprawdź 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 konfiguracji rozruchu za pomocą zmiennejBOARD_BOOTCONFIGi programu ładującego. - Sprawdź, czy każdy z parametrów występuje w
/proc/bootconfigORAZ 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ą i niższą wersję OTA
Podczas zarządzania aktualizacjami i przywracaniem poprzedniej wersji oprogramowania OTA między różnymi wersjami Androida lub różnymi wersjami 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(w tym 11-5.4), musisz użyć parametrów wiersza poleceń jądra.
Użytkownicy, którzy uaktualnią Androida 11 lub starszego do Androida 12 lub nowszego, 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 dziennika.
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.