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 systemu AOSP, program rozruchowy odczytuje pierwsze 32 bajty w partycji misc. Jeśli dane tam zawarte pasują do boot-recovery, program rozruchowy uruchamia obraz recovery. Ta metoda umożliwia dokończenie wszelkich oczekujących zadań odzyskiwania (np. zastosowanie aktualizacji OTA lub usunięcie danych).
Szczegółowe informacje o zawartości bloku w pamięci flash używanego do komunikacji przez odzyskiwanie 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, które korzystają z A/B aktualizacji, upewnij się, że program rozruchowy urządzenia spełnia te kryteria.
Kryteria ogólne
Wszystkie partycje zaktualizowane za pomocą aktualizacji OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie podczas odzyskiwania).
Aby uruchomić partycję
system, program rozruchowy przekazuje tę wartość w wierszu poleceń jądra:ro root=/dev/[node] rootwait init=/init.Wywołanie
markBootSuccessfulz HAL należy do obowiązków platformy Android. Program rozruchowy nigdy nie powinien oznaczać partycji jako pomyślnie uruchomionej.
Obsługa HAL sterowania rozruchem
Program rozruchowy musi obsługiwać HAL boot_control zgodnie z definicją w
hardware/libhardware/include/hardware/boot_control.h. Program aktualizujący wysyła zapytanie do
HAL sterowania rozruchem,
aktualizuje nieużywany slot rozruchowy, zmienia aktywny slot za pomocą
HAL i ponownie uruchamia zaktualizowany system operacyjny. Szczegółowe informacje znajdziesz w artykule
Implementowanie HAL sterowania rozruchem.
Obsługa slotów
Program rozruchowy musi obsługiwać funkcje związane z partycjami i slotami, w tym:
Nazwy partycji muszą zawierać sufiks, który identyfikuje, które partycje należą do danego slotu w programie rozruchowym. Dla każdej takiej partycji, istnieje odpowiednia zmienna
has-slot:partition base nameo wartościyes. Sloty są nazywane alfabetycznie jako a, b, c itd., co odpowiada partycjom z sufiksem_a,_b,_citd. Program rozruchowy powinien informować system operacyjny, który slot został uruchomiony, 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-countjest resetowana do wartości dodatniej (zwykle3) przez HAL sterowania rozruchem za pomocą wywołania zwrotnegosetActiveBootSlotlub za pomocą poleceniafastboot set_active. Podczas modyfikowania partycji, która jest częścią slotu, program rozruchowy czyści „pomyślnie uruchomiono” i resetuje liczbę ponownych prób dla slotu.
Program rozruchowy powinien też określić, który slot ma zostać wczytany. Na ilustracji przedstawiono przykładowy proces decyzyjny.
Określ, który slot ma zostać użyty. Nie próbuj wczytywać slotu oznaczonego jako
slot-unbootable. Ten slot powinien być zgodny z wartościami zwracanymi przez fastboot i jest nazywany bieżącym slotem.Jeśli bieżący slot nie jest oznaczony jako
slot-successfuli ma wartośćslot-retry-count = 0, oznacz go jakoslot-unbootable. Następnie wybierz inny slot, który nie jest oznaczony jakounbootablei jest oznaczony jakoslot-successful. Ten slot jest teraz wybranym slotem. Jeśli nie jest dostępny żaden bieżący slot, uruchom odzyskiwanie lub wyświetl użytkownikowi zrozumiały komunikat o błędzie.Wybierz odpowiedni plik
boot.imgi dodaj ścieżkę do prawidłowej partycji systemowej w wierszu poleceń jądra.Wypełnij parametr
slot_suffixw wierszu poleceń jądra.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ń flash. Na przykład po uruchomieniu polecenia fastboot flash system system.img najpierw wysyła zapytanie o zmienną 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 slotu za pomocą polecenia fastboot set_active lub polecenia HAL sterowania rozruchem setActiveBootSlot program rozruchowy powinien zaktualizować bieżący slot, 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 A/B), upewnij się, że program rozruchowy urządzenia spełnia te kryteria.
Partycja
recoverypowinna zawierać obraz, który może odczytać obraz systemu z obsługiwanej partycji (cache,userdata) i zapisać go w partycjisystem.Program rozruchowy powinien obsługiwać bezpośrednie uruchamianie w trybie odzyskiwania.
Jeśli obsługiwane są aktualizacje obrazu radia, partycja
recoverypowinna 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 odzyskiwania flashuje radio. Ta funkcja może być udostępniana jako biblioteka binarna lub narzędzie.