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 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 markBootSuccessfulz 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ści yes. 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 (zazwyczaj 3), czy to przez interfejs HAL sterowania uruchamianiem za pomocą wywołania zwrotnego setActiveBootSlot, czy za pomocą polecenia fastboot 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.

Proces zarezerwowania miejsca na program rozruchowy
Rysunek 1. Procedura przydzielania slotu dla programu rozruchowego
  1. 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.

  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 inne gniazdo, które nie jest oznaczone jako unbootable, ale jako slot-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.

  3. Wybierz odpowiednią wartość boot.img i dodaj ścieżkę do właściwej partycji systemu w wierszu poleceń jądra.

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

  5. Rozruch. Jeśli nie jest zaznaczone slot-successful, zmniejsz slot-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-unbootableslot-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 partycji system.

  • 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.