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 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ści yes. 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 (zwykle 3) przez HAL sterowania rozruchem przez wywołanie zwrotne setActiveBootSlot lub polecenie fastboot 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.

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

  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 boks, który nie jest oznaczony jako unbootable i ma oznaczenie slot-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.

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

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

  5. Rozruch. Jeśli nie masz oznaczenia slot-successful, zmniejsz wartość o 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 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 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ż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.