Wdrażanie konfiguracji rozruchowej w Androidzie 12

W Androidzie 12 funkcja uruchamiania konfiguracji zastępuje opcje wiersza poleceń jądra androidboot.* używane w Androidzie 11 i starszych wersjach. Funkcja rozruchu konfiguracji to mechanizm przekazywania szczegółów konfiguracji z kompilacji i programu rozruchowego do Androida 12.

Ta funkcja umożliwia oddzielenie parametrów konfiguracji w obszarze użytkownika Androida od parametrów jądra. Przeniesienie długich parametrów jądra androidboot.* do pliku rozruchowego tworzy miejsce w wierszu poleceń jądra i udostępnia je do przyszłego rozszerzania.

Jądro 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 jądrem w wersji 12–5.10.xx. Nie musisz jej wdrażać, jeśli uaktualniasz urządzenia.

Przykłady i źródło

Patrząc na przykłady i kod źródłowy w tej sekcji, pamiętaj, że format kodu bootconfig różni się tylko nieco od formatu cmdline jądra używanego w Androidzie 11 i jego starszych wersjach. Jednak z uwagi na sposób korzystania z urządzenia musisz zwrócić uwagę na tę różnicę:

  • Parametry muszą być rozdzielone znakami nowego wiersza \n, a nie spacjami.

Przykład programu rozruchowego

Przykładowy program rozruchowy znajdziesz w instrukcji dotyczącej rozruchu Cuttlefish U-boot. Poniżej znajdziesz 2 zatwierdzenia w dokumentacji. Pierwsza powoduje zwiększenie obsługi wersji nagłówka rozruchowego do najnowszej wersji. W tym przykładzie pierwsze zatwierdzenie aktualizuje (lub zwiększa) obsługę kolejnych wersji do następnej, czyli wersji 4. Drugi ma 2 czynności – dodaje obsługę konfiguracji rozruchowej i pokazuje dodawanie parametrów w czasie działania:

Przykładowa kompilacja

Przykład kompilacji, który pokazuje zmiany mkbootimg, które tworzą vendor_boot.img z nagłówkiem rozruchowym dostawcy w wersji 4, znajdziesz tutaj: mkbootimg changes for bootconfig. Zobacz zmiany w mątwie:

Implementacja

Partnerzy muszą dodać obsługę do swoich programów rozruchowych i przenieść parametry androidboot.* czasu kompilacji z wiersza poleceń jądra do pliku rozruchowego. Najlepszym sposobem wdrażania tej zmiany jest wprowadzanie zmian stopniowo. W sekcji Implementacja i weryfikacja przyrostowa znajdziesz informacje o procesie przyrostowym.

Jeśli masz zmiany, które wyszukują w pliku /proc/cmdline parametry androidboot.*, zamiast tego wskaż plik /proc/bootconfig. Właściwości ro.boot.* są ustawiane z nowymi wartościami bootconfig, więc nie musisz wprowadzać zmian w kodzie za ich pomocą.

Wprowadź zmiany

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

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

Dodaj parametr cmdline jądra bootconfig. Jądro szuka sekcji rozruchowej:

BOARD_KERNEL_CMDLINE += bootconfig

Parametry w konfiguracji rozruchu są tworzone na podstawie parametrów w zmiennej BOARD_BOOTCONFIG, podobnie jak w przypadku polecenia cmdline jądra BOARD\_KERNEL\_CMDLINE.

Wszystkie parametry androidboot.* można przenieść w niezmienionej postaci, podobnie jak tutaj:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Zmiany programu rozruchowego

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

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

Schemat układu alokacji pamięci w konfiguracji rozruchowej

Rysunek 1. Alokacja pamięci w konfiguracji rozruchowej Androida 12

Program rozruchowy tworzy sekcję rozruchu w pamięci. Sekcja rozruchu konfiguracji zawiera alokacje pamięci na:

  • Parametry
  • 4 B Rozmiar parameters size
  • 4 B Rozmiar parameters checksum
  • Magiczny ciąg znaków konfiguracji rozruchu 12 B (#BOOTCONFIG\n)

Parametry te pochodzą z 2 źródeł: parametrów znanych w czasie kompilacji i tych, które są niedostępne w czasie kompilacji. Trzeba dodać nieznane parametry.

Parametry znane w czasie kompilacji są spakowane na końcu obrazu vendor_boot w sekcji rozruchowej. Rozmiar sekcji jest zapisywany (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 w programie rozruchowym. Należy je dodać na końcu sekcji parametrów rozruchowych przed zastosowaniem zwiastuna konfiguracji rozruchowej.

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

Implementacja i weryfikacja przyrostowa

Stopniowo wdrażaj funkcję rozruchu zgodnie z procedurą opisaną w tej sekcji. Pozostaw parametry wiersza poleceń jądra bez zmian podczas dodawania parametrów Bootconfig.

Oto kroki implementacji przyrostowej z weryfikacją:

  1. Wprowadź zmiany w programie rozruchowym i kompilacji, a potem wykonaj te czynności:
    1. Dodaj nowy parametr rozruchowy za pomocą zmiennej BOARD_BOOTCONFIG.
    2. Zachowaj parametry wiersza poleceń jądra w niezmienionej postaci, aby urządzenie mogło nadal się prawidłowo uruchamiać. Dzięki temu debugowanie i weryfikacja jest znacznie łatwiejsze.
  2. Zweryfikuj swoją pracę, sprawdzając zawartość dokumentu /proc/bootconfig. Sprawdź, czy po uruchomieniu urządzenia widzisz nowo dodany parametr.
  3. Przenieś parametry androidboot.* z wiersza poleceń jądra do konfiguracji rozruchowej za pomocą zmiennej BOARD_BOOTCONFIG i programu rozruchowego.
  4. Sprawdź, czy każdy z parametrów istnieje w polu /proc/bootconfig ORAZ czy nie ma go w /proc/cmdline. Jeśli możesz to sprawdzić, oznacza to, że implementacja się udała.

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

Zachowaj szczególną ostrożność, gdy zarządzasz uaktualnieniami OTA lub starszymi wersjami Androida lub różnych wersji jądra.

Android 12 to pierwsza wersja, która obsługuje rozruch. W przypadku przejścia na niższą wersję przed tą zmianą należy użyć parametrów wiersza poleceń jądra zamiast obiektu rozruchowego.

Jądro w wersjach 12–5.4 i nowszych obsługuje konfigurację rozruchu. W przypadku zmiany wersji na dowolną wcześniejszą(w tym 11–5.4) trzeba użyć parametrów wiersza poleceń jądra.

Po przejściu z Androida 11 lub starszego na Androida 12 lub nowszego możesz nadal używać parametrów wiersza poleceń 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. Plik rozruchowy zawiera zawsze wpis logu, jeśli ją obsługuje.

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 zwracany jest dziennik błędów, oznacza to, że podczas wczytywania konfiguracji rozruchowej wystąpił problem. Informacje o różnych typach błędów znajdziesz w pliku init/main.c.