Aby wdrożyć aktualizacje bezprzewodowe (OTA), program rozruchowy musi mieć dostęp do dysku RAM odzyskiwania podczas uruchamiania. Jeśli urządzenie korzysta z niezmodyfikowanego obrazu przywracania AOSP, program rozruchowy odczytuje pierwsze 32 bajty na partycji misc
. Jeśli dane w tym miejscu pasują do boot-recovery
, program rozruchowy uruchamia obraz recovery
. Ta metoda umożliwia dokończenie wszystkich oczekujących działań związanych z przywracaniem (np. zastosowanie aktualizacji OTA lub usunięcie danych).
Szczegółowe informacje o zawartości bloku w pamięci flash używanego do komunikacji przez system odzyskiwania i program rozruchowy znajdziesz w pliku 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 rozruchowy urządzenia spełnia te kryteria:
Kryteria ogólne
Wszystkie partycje aktualizowane za pomocą OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie w trybie odzyskiwania).
Aby uruchomić partycję
system
, program rozruchowy przekazuje na linii poleceń jądra tę wartość:ro root=/dev/[node] rootwait init=/init
.Wywołanie funkcji
markBootSuccessful
z HAL należy do obowiązków platformy Androida. Program rozruchowy nigdy nie powinien oznaczać partycji jako pomyślnie uruchomionej.
Obsługa HAL sterowania rozruchem
Program rozruchowy musi obsługiwać interfejs HAL boot_control
zdefiniowany w boot_control
.hardware/libhardware/include/hardware/boot_control.h
Program aktualizujący wysyła zapytanie do warstwy HAL sterowania rozruchem, aktualizuje nieużywane gniazdo rozruchowe, zmienia aktywne gniazdo za pomocą warstwy HAL i ponownie uruchamia system operacyjny. Więcej informacji znajdziesz w artykule Implementowanie interfejsu HAL sterowania uruchamianiem.
Obsługa przedziałów
Program rozruchowy musi obsługiwać funkcje związane z partycjami i slotami, w tym:
Nazwy partycji muszą zawierać sufiks, który identyfikuje partycje należące do określonego gniazda w programie rozruchowym. Dla każdego takiego podziału istnieje odpowiednia zmienna
has-slot:partition base name
o wartościyes
. Gniazda są oznaczane literami alfabetu: a, b, c itd., co odpowiada partycjom z sufiksami_a
,_b
,_c
itd. Program rozruchowy powinien informować system operacyjny o tym, które gniazdo zostało uruchomione, za pomocą właściwości wiersza poleceńandroidboot.slot_suffix
. Ta właściwość jest ustawiana za pomocą bootconfig na urządzeniach z Androidem 12 lub nowszym.Wartość
slot-retry-count
jest resetowana do wartości dodatniej (zwykle3
) przez HAL kontroli rozruchu za pomocą wywołania zwrotnegosetActiveBootSlot
lub poleceniafastboot set_active
. Podczas modyfikowania partycji, która jest częścią gniazda, program rozruchowy czyści flagę „successfully booted” (uruchomiono pomyślnie) i resetuje liczbę ponownych prób dla gniazda.
Program rozruchowy powinien też określić, który slot ma zostać wczytany. Ilustracja przedstawia przykładowy proces decyzyjny.

Określ, który przedział ma być użyty. Nie próbuj wczytywać slotu oznaczonego symbolem
slot-unbootable
. Ten slot powinien być zgodny z wartościami zwracanymi przez fastboot i jest określany jako bieżący slot.Jeśli bieżący przedział nie jest oznaczony jako
slot-successful
i maslot-retry-count = 0
, oznacz go jakoslot-unbootable
. Następnie wybierz inne gniazdo, które nie jest oznaczone symbolemunbootable
, ale jest oznaczone symbolemslot-successful
. To gniazdo jest teraz wybrane. Jeśli nie ma dostępnego bieżącego gniazda, uruchom tryb odzyskiwania lub wyświetl użytkownikowi zrozumiały komunikat o błędzie.Wybierz odpowiedni symbol
boot.img
i uwzględnij ścieżkę do prawidłowej partycji systemowej w wierszu poleceń jądra.Wypełnij parametr wiersza poleceń jądra
slot_suffix
.Uruchom. Jeśli nie jest oznaczony jako
slot-successful
, zmniejsz wartośćslot-retry-count
.
Narzędzie fastboot
określa, którą partycję należy sflashować podczas wykonywania dowolnych poleceń flashowania. 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, aby wygenerować nazwę partycji, która powinna zostać sflashowana (system_a
, system_b
itp.).
Podczas ustawiania bieżącego gniazda za pomocą polecenia fastboot set_active
lub polecenia HAL sterowania rozruchem setActiveBootSlot
program rozruchowy powinien zaktualizować bieżące gniazdo, wyczyścić slot-unbootable
i slot-successful
oraz zresetować liczbę 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, które można aktualizować bez użycia aktualizacji A/B), upewnij się, że program rozruchowy urządzenia spełnia te kryteria:
Partycja
recovery
powinna zawierać obraz, który może odczytać obraz systemu z niektórych obsługiwanych partycji (cache
,userdata
) i zapisać go na partycjisystem
.Program rozruchowy powinien obsługiwać bezpośrednie uruchamianie w trybie odzyskiwania.
Jeśli aktualizacje obrazu radia są obsługiwane, partycja
recovery
powinna też umożliwiać flashowanie radia. Można to zrobić na 2 sposoby:Program rozruchowy flashuje radio. W takim przypadku powinno być możliwe ponowne uruchomienie z partycji odzyskiwania do programu rozruchowego, aby dokończyć aktualizację.
Obraz przywracania systemu flashuje radio. Ta funkcja może być udostępniana jako biblioteka binarna lub narzędzie.