Aby obsługiwać aktualizacje OTA , program ładujący musi mieć dostęp do dysku RAM odzyskiwania podczas uruchamiania. Jeśli urządzenie korzysta z niezmodyfikowanego obrazu odzyskiwania AOSP, program ładujący odczytuje pierwsze 32 bajty z partycji misc
; jeśli znajdujące się tam dane odpowiadają boot-recovery
, program ładujący uruchomi się z obrazem recovery
. Ta metoda umożliwia kontynuowanie wszelkich oczekujących prac związanych z odzyskiwaniem (na przykład zastosowanie OTA lub usunięcie danych).
Aby uzyskać szczegółowe informacje na temat zawartości bloku we flashu używanego do komunikacji przez odzyskiwanie i program ładujący, zobacz bootable/recovery/bootloader_message/bootloader_message.h .
Urządzenia z aktualizacjami A/B
Aby obsługiwać aktualizacje OTA na urządzeniach korzystających z aktualizacji A/B , upewnij się, że program ładujący urządzenia spełnia następujące kryteria.
Kryteria ogólne
Wszystkie partycje aktualizowane przez OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie aktualizowane podczas odzyskiwania).
Aby uruchomić partycję
system
, program ładujący przekazuje następującą wartość w wierszu poleceń jądra:ro root=/dev/[node] rootwait init=/init
.Wywoływanie
markBootSuccessful
z warstwy HAL jest obowiązkiem platformy Android. Program ładujący nigdy nie powinien oznaczać partycji jako pomyślnie uruchomionej.
Obsługa kontroli rozruchu HAL
Program ładujący musi obsługiwać warstwę HAL boot_control
zdefiniowaną w hardware/libhardware/include/hardware/boot_control.h
). Aktualizator wysyła zapytanie do warstwy sterującej rozruchem , aktualizuje aktualnie nieużywane gniazdo rozruchowe, zmienia aktywne gniazdo za pomocą warstwy HAL i ponownie uruchamia zaktualizowany system operacyjny. Aby uzyskać szczegółowe informacje, zobacz Implementowanie kontroli rozruchu HAL .
Wsparcie dla slotów
Program ładujący musi obsługiwać funkcjonalność związaną z partycjami i gniazdami, w tym:
Nazwy partycji muszą zawierać przyrostek identyfikujący, które partycje należą do konkretnego gniazda w programie ładującym. Dla każdej takiej partycji istnieje odpowiednia zmienna
has-slot: partition base name
o wartościyes
. Sloty nazywane są alfabetycznie jako a, b, c itd., co odpowiada partycjom z przyrostkiem_a
,_b
,_c
itd. Program ładujący powinien poinformować system operacyjny, który slot został uruchomiony, korzystając z właściwości wiersza poleceńandroidboot.slot_suffix
. Ta właściwość jest ustawiana poprzez bootconfig dla urządzeń uruchamianych z systemem Android 12 lub nowszym.Wartość
slot-retry-count
jest resetowana do wartości dodatniej (zwykle3
) albo przez kontrolę rozruchu HAL poprzez wywołanie zwrotnesetActiveBootSlot
, albo przez poleceniefastboot set_active
. Podczas modyfikowania partycji będącej częścią gniazda program ładujący kasuje komunikat „Uruchomienie zakończone pomyślnie” i resetuje licznik ponownych prób dla tego gniazda.
Program ładujący powinien również określić, które gniazdo załadować. Rysunek przedstawia przykładowy proces decyzyjny.
Określ, który slot wypróbować. Nie próbuj ładować gniazda oznaczonego jako
slot-unbootable
. To gniazdo powinno być zgodne z wartościami zwracanymi przez fastboot i jest nazywane bieżącym gniazdem.Jeśli bieżące gniazdo nie jest oznaczone jako
slot-successful
i maslot-retry-count = 0
, oznacz bieżące gniazdo jakoslot-unbootable
. Następnie wybierz inne gniazdo, które nie jest oznaczoneunbootable
i jest oznaczone jakoslot-successful
; to gniazdo jest teraz wybranym gniazdem. Jeśli żadne bieżące gniazdo nie jest dostępne, uruchom system w trybie odzyskiwania lub wyświetl użytkownikowi znaczący komunikat o błędzie.Wybierz odpowiedni
boot.img
i podaj ścieżkę do prawidłowej partycji systemowej w wierszu poleceń jądra.Wypełnij parametr
slot_suffix
wiersza poleceń jądra.Uruchomić. Jeśli nie oznaczono
slot-successful
,slot-retry-count
gnieździe.
Narzędzie fastboot
określa, która partycja ma zostać flashowana podczas uruchamiania jakichkolwiek poleceń flash. Na przykład uruchomienie polecenia fastboot flash system system.img
najpierw wysyła zapytanie do zmiennej current-slot
a następnie łączy wynik z systemem w celu wygenerowania nazwy partycji, która powinna zostać sflashowana ( system_a
, system_b
itp.).
Podczas ustawiania bieżącego gniazda za pomocą polecenia fastboot set_active
lub polecenia kontroli rozruchu HAL setActiveBootSlot
, program ładujący powinien zaktualizować bieżące gniazdo, wyczyścić slot-unbootable
i slot-successful
oraz zresetować licznik ponownych prób (jest to jedyny sposób na wyczyszczenie slot-unbootable
).
Urządzenia bez aktualizacji A/B
Aby obsługiwać aktualizacje OTA na urządzeniach, które nie korzystają z aktualizacji A/B (patrz Urządzenia z możliwością aktualizacji bez aktualizacji A/B ), upewnij się, że program ładujący urządzenia spełnia następujące kryteria.
Partycja
recovery
powinna zawierać obraz umożliwiający odczytanie obrazu systemu z obsługiwanej partycji (cache
,userdata
) i zapisanie go na partycjisystem
.Program ładujący powinien obsługiwać ponowne uruchamianie bezpośrednio w trybie odzyskiwania.
Jeśli obsługiwane są aktualizacje obrazu radia, partycja
recovery
powinna również umożliwiać flashowanie radia. Można to osiągnąć na jeden z dwóch sposobów:Bootloader flashuje radio. W takim przypadku powinno być możliwe ponowne uruchomienie komputera z partycji odzyskiwania do programu ładującego w celu dokończenia aktualizacji.
Obraz odzyskiwania miga radiem. Funkcjonalność tę można udostępnić w postaci biblioteki binarnej lub narzędzia.