Wdrażanie aktualizacji OTA

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 markBootSuccessful z 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 name o wartości yes. Sloty są nazywane alfabetycznie jako a, b, c itd., co odpowiada partycjom z sufiksem _a, _b, _c itd. 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-count jest resetowana do wartości dodatniej (zwykle 3) przez HAL sterowania rozruchem za pomocą wywołania zwrotnego setActiveBootSlot lub za pomocą polecenia fastboot 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.

Proces umieszczania programu rozruchowego
Rysunek 1. Przepływ slotów programu rozruchowego
  1. 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.

  2. Jeśli bieżący slot nie jest oznaczony jako slot-successful i ma wartość slot-retry-count = 0, oznacz go jako slot-unbootable. Następnie wybierz inny slot, który nie jest oznaczony jako unbootable i jest oznaczony jako slot-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.

  3. Wybierz odpowiedni plik boot.img i dodaj ścieżkę do prawidłowej partycji systemowej w wierszu poleceń jądra.

  4. Wypełnij parametr slot_suffix w wierszu poleceń jądra.

  5. 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 recovery powinna zawierać obraz, który może odczytać obraz systemu z obsługiwanej partycji (cache, userdata) i zapisać go w partycji system.

  • Program rozruchowy powinien obsługiwać bezpośrednie uruchamianie w trybie odzyskiwania.

  • Jeśli obsługiwane są aktualizacje obrazu radia, 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 odzyskiwania flashuje radio. Ta funkcja może być udostępniana jako biblioteka binarna lub narzędzie.