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 z aktualizacjami A/B, upewnij się, że program rozruchowy urządzenia spełnia poniższe kryteria.
Kryteria ogólne
Wszystkie partycje zaktualizowane przy użyciu OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie podczas przywracania).
Aby uruchomić partycję
system
, bootloader przekazuje tę wartość na linii poleceń jądra:ro root=/dev/[node] rootwait init=/init
.Platforma Androida odpowiada za wywoływanie funkcji
markBootSuccessful
z poziomu HAL. Program rozruchowy nigdy nie powinien oznaczać partycji jako uruchomionej.
Obsługa interfejsu HAL do sterowania rozruchem
Program rozruchowy musi obsługiwać listę HAL boot_control
zgodnie z definicją w narzędziu 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 przedziałami, w tym:
Nazwy partycji muszą zawierać przyrostek, który wskazuje, które partycje należą do konkretnego gniazda w bootloaderze. Każda taka partycja ma przypisaną zmienną
has-slot:partition base name
o wartościyes
. Miejsca są nazywane alfabetycznie (a, b, c itd.), a odpowiadają partycjom z sufiksem_a
,_b
,_c
itd. Ładowarka powinna poinformować system operacyjny, z którego miejsca na dane została załadowana partycja, 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 sterowania rozruchem przez wywołanie zwrotnesetActiveBootSlot
lub poleceniefastboot set_active
. Podczas modyfikowania partycji, która jest częścią slotu, bootloader usuwa flagę „booted successfully” i zresetowuje 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ć przedziału 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 inny boks, który nie jest oznaczony jakounbootable
i ma oznaczenieslot-successful
. Ten boks jest teraz wybrany. Jeśli bieżący przedział jest niedostępny, uruchom urządzenie w celu przywracania lub wyświetl użytkownikowi znaczący komunikat o błędzie.Wybierz odpowiedni plik
boot.img
i podaj ścieżkę do prawidłowej partycji systemowej w wierszu poleceń jądra.Wypełnij parametr wiersza poleceń jądra
slot_suffix
.Rozruch. Jeśli nie masz oznaczenia
slot-successful
, zmniejsz wartość oslot-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 zaflashować (system_a
, system_b
itp.).
Gdy ustawiasz bieżący przedział za pomocą polecenia szybkiego rozruchu set_active
lub polecenia HAL setActiveBootSlot
, program rozruchowy powinien zaktualizować bieżący boks, wyczyścić slot-unbootable
i slot-successful
oraz zresetować licznik ponownych prób (to jedyny sposób usunięcia wartości 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 może odczytać obraz systemu z jakiejś obsługiwanej partycji (cache
,userdata
) i zapisać 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żesz to zrobić na 2 sposoby:Program rozruchowy aktualizuje radio. W takiej sytuacji powinno być możliwe ponowne uruchomienie w programie rozruchowym z partycji przywracania w celu ukończenia aktualizacji.
Obraz przywracania miga w radiu.Może ona być dostępna jako biblioteka binarna lub narzędzie.