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 korzysta z niezmodyfikowanego obrazu przywracania AOSP, program rozruchowy odczytuje pierwsze 32 bajty na partycji misc. Jeśli dane w tym miejscu pasują do boot-recovery, program rozruchowy uruchamia obraz recovery. Ta metoda umożliwia dokończenie wszystkich oczekujących działań związanych z przywracaniem (np. zastosowanie aktualizacji OTA lub usunięcie danych).

Szczegółowe informacje o zawartości bloku w pamięci flash używanego do komunikacji przez system odzyskiwania 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 korzystających z aktualizacji A/B, upewnij się, że program rozruchowy urządzenia spełnia te kryteria:

Kryteria ogólne

  • Wszystkie partycje aktualizowane za pomocą OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie w trybie odzyskiwania).

  • Aby uruchomić partycję system, program rozruchowy przekazuje na linii poleceń jądra tę wartość: ro root=/dev/[node] rootwait init=/init.

  • Wywołanie funkcji markBootSuccessful z HAL należy do obowiązków platformy Androida. Program rozruchowy nigdy nie powinien oznaczać partycji jako pomyślnie uruchomionej.

Obsługa HAL sterowania rozruchem

Program rozruchowy musi obsługiwać interfejs HAL boot_control zdefiniowany w boot_control.hardware/libhardware/include/hardware/boot_control.h Program aktualizujący wysyła zapytanie do warstwy HAL sterowania rozruchem, aktualizuje nieużywane gniazdo rozruchowe, zmienia aktywne gniazdo za pomocą warstwy HAL i ponownie uruchamia system operacyjny. Więcej informacji znajdziesz w artykule Implementowanie interfejsu HAL sterowania uruchamianiem.

Obsługa przedziałów

Program rozruchowy musi obsługiwać funkcje związane z partycjami i slotami, w tym:

  • Nazwy partycji muszą zawierać sufiks, który identyfikuje partycje należące do określonego gniazda w programie rozruchowym. Dla każdego takiego podziału istnieje odpowiednia zmienna has-slot:partition base name o wartości yes. Gniazda są oznaczane literami alfabetu: a, b, c itd., co odpowiada partycjom z sufiksami _a, _b, _c itd. Program rozruchowy powinien informować system operacyjny o tym, które gniazdo zostało uruchomione, 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 kontroli rozruchu za pomocą wywołania zwrotnego setActiveBootSlot lub polecenia fastboot set_active. Podczas modyfikowania partycji, która jest częścią gniazda, program rozruchowy czyści flagę „successfully booted” (uruchomiono pomyślnie) i resetuje liczbę ponownych prób dla gniazda.

Program rozruchowy powinien też określić, który slot ma zostać wczytany. Ilustracja przedstawia przykładowy proces decyzyjny.

Proces instalacji programu rozruchowego
Rysunek 1. Procedura przydzielania miejsc na program rozruchowy
  1. Określ, który przedział ma być użyty. Nie próbuj wczytywać slotu oznaczonego symbolemslot-unbootable. Ten slot powinien być zgodny z wartościami zwracanymi przez fastboot i jest określany jako bieżący slot.

  2. Jeśli bieżący przedział nie jest oznaczony jako slot-successful i ma slot-retry-count = 0, oznacz go jako slot-unbootable. Następnie wybierz inne gniazdo, które nie jest oznaczone symbolem unbootable, ale jest oznaczone symbolem slot-successful. To gniazdo jest teraz wybrane. Jeśli nie ma dostępnego bieżącego gniazda, uruchom tryb odzyskiwania lub wyświetl użytkownikowi zrozumiały komunikat o błędzie.

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

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

  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ń flashowania. Na przykład uruchomienie polecenia fastboot flash system system.img najpierw wysyła zapytanie do zmiennej 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 gniazda za pomocą polecenia fastboot set_active lub polecenia HAL sterowania rozruchem setActiveBootSlot program rozruchowy powinien zaktualizować bieżące gniazdo, wyczyścić slot-unbootableslot-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 użycia aktualizacji 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 niektórych obsługiwanych partycji (cache, userdata) i zapisać go na partycji system.

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

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