Aby wdrożyć aktualizacje bezprzewodowe (OTA), program rozruchowy musi mieć dostęp do dysku RAM odzyskiwania podczas uruchamiania. Jeśli urządzenie używa niezmodyfikowanego obrazu przywracania AOSP, program rozruchowy odczytuje pierwsze 32 bajty na partycji misc
. Jeśli dane są zgodne z wartością boot-recovery
, program rozruchowy uruchomi obraz recovery
. Ta metoda umożliwia kontynuowanie nieukończonych działań związanych z przywracaniem (np. stosowaniem OTA lub usuwaniem danych).
Szczegółowe informacje o zawartości bloku w pamięci flash używanej do komunikacji przez odzyskiwanie i bootloader znajdziesz w pliku bootable/recovery/bootloader_message/bootloader_message.h.
Urządzenia z aktualizacjami A/B
Aby obsługiwać aktualizacje OTA na urządzeniach, które korzystają z aktualizacji A/B, upewnij się, że program rozruchowy urządzenia spełnia te kryteria.
Kryteria ogólne
Wszystkie partycje zaktualizowane przez OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie w trybie odzyskiwania).
Aby uruchomić partycję
system
, bootloader przekazuje tę wartość w wierszu poleceń jądra:ro root=/dev/[node] rootwait init=/init
.Wywołania funkcji
markBootSuccessful
z HAL-a są realizowane przez platformę Androida. Program rozruchowy nigdy nie powinien oznaczać partycji jako uruchomionej.
Obsługa interfejsu HAL do sterowania rozruchem
Program rozruchowy musi obsługiwać interfejs boot_control
HAL zgodnie z definicją w dokumentacji hardware/libhardware/include/hardware/boot_control.h
. Aktualizator wysyła zapytanie do sterownika uruchamiania (HAL), aktualizuje nieużywany slot uruchamiania, zmienia aktywny slot za pomocą sterownika HAL i uruchamia ponownie zaktualizowany system operacyjny. Więcej informacji znajdziesz w artykule Implementacja kontroli uruchamiania HAL.
Obsługa przedziałów
Program rozruchowy musi obsługiwać funkcje związane z partycjami i gniazdami, w tym:
Nazwy partycji muszą zawierać przyrostek, który wskazuje, które partycje należą do danego slotu w bootloaderze. W przypadku każdej takiej partycji istnieje odpowiednia zmienna
has-slot:partition base name
o wartościyes
. Miejsca są nazywane alfabetycznie jako a, b, c itd., co odpowiada partycjom z sufiksem_a
,_b
,_c
itd. Ładowarka powinna poinformować system operacyjny, który slot został załadowany, 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 (zazwyczaj3
), czy to przez interfejs HAL sterowania uruchamianiem za pomocą wywołania zwrotnegosetActiveBootSlot
, czy za pomocą poleceniafastboot set_active
. Podczas modyfikowania partycji, która jest częścią slotu, bootloader czyści flagę „booted successfully” i resetuje liczbę prób dla slotu.
Program rozruchowy powinien też określić, który slot ma być wczytany. Rysunek przedstawia przykładowy proces podejmowania decyzji.

Określ, z którego slotu chcesz skorzystać. Nie próbuj wczytywać gniazda oznaczonego jako
slot-unbootable
. Ten slot powinien być zgodny z wartościami zwróconymi przez fastboot i jest nazywany bieżącym slotem.Jeśli bieżący slot nie jest oznaczony jako
slot-successful
i ma wartośćslot-retry-count = 0
, oznacz go jakoslot-unbootable
. Następnie wybierz inne gniazdo, które nie jest oznaczone jakounbootable
, ale jakoslot-successful
. To gniazdo będzie teraz wybrane. Jeśli nie ma wolnego slotu, należy uruchomić tryb odzyskiwania lub wyświetlić użytkownikowi odpowiedni komunikat o błędzie.Wybierz odpowiednią wartość
boot.img
i dodaj ścieżkę do właściwej partycji systemu w wierszu poleceń jądra.Wypełnij parametr wiersza poleceń jądra
slot_suffix
.Rozruch. Jeśli nie jest zaznaczone
slot-successful
, zmniejszslot-retry-count
.
Narzędzie fastboot
określa, który partycji ma być flashowany podczas wykonywania poleceń flash. Na przykład wykonanie polecenia fastboot flash system system.img
najpierw wysyła zapytanie do zmiennej current-slot
, a potem łączy wynik z systemem, aby wygenerować nazwę partycji, którą należy zaprogramować (system_a
, system_b
itp.).
Podczas ustawiania bieżącego slotu za pomocą polecenia fastboot set_active
lub polecenia sterowania bootem HAL setActiveBootSlot
program uruchamiający powinien zaktualizować bieżący slot, wyczyścić slot-unbootable
i slot-successful
oraz zresetować liczbę 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 A/B), upewnij się, że bootloader urządzenia spełnia poniższe kryteria.
Partycja
recovery
powinna zawierać obraz, który umożliwia odczytanie obrazu systemu z jakiejś obsługiwanej partycji (cache
,userdata
) i zapisanie go na partycjisystem
.Program rozruchowy powinien obsługiwać uruchamianie bezpośrednio w trybie odzyskiwania.
Jeśli aktualizacje obrazu radia są obsługiwane, partycja
recovery
powinna umożliwiać również flashowanie radia. Można to zrobić na 2 sposoby:Program rozruchowy aktualizuje radio. W takim przypadku można ponownie uruchomić urządzenie z partycji odzyskiwania, aby uruchomić program rozruchowy i dokończyć aktualizację.
Obraz odzyskiwania powoduje miganie radia. Może ona być udostępniana jako biblioteka binarna lub narzędzie.