Wdrażanie aktualizacji OTA

Aby można było wdrożyć aktualizacje bezprzewodowe (OTA), program rozruchowy musi mieć dostęp do dysku pamięci RAM podczas uruchamiania. Jeśli urządzenie używa niezmodyfikowanego obrazu przywracania AOSP, program rozruchowy odczytuje pierwsze 32 bajty na partycji misc. Jeśli zawarte w nim dane pasują do boot-recovery, program rozruchowy uruchamia się do obrazu recovery. Ta metoda umożliwia kontynuowanie działań oczekujących na przywrócenie (takich jak zastosowanie aktualizacji OTA lub usunięcie danych).

Szczegółowe informacje o zawartości bloku we Flashu używanego do komunikacji przez odzyskiwanie i program rozruchowy znajdziesz na stronie 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 aktualizowane przy użyciu OTA powinny być aktualizowane podczas uruchamiania głównego systemu (a nie podczas przywracania).

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

  • Platforma Androida odpowiada za wywoływanie funkcji markBootSuccessful z poziomu HAL. Program rozruchowy nie powinien nigdy oznaczać partycji jako udanego rozruchu.

Obsługa HAL 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 panelu sterowania rozruchem, aktualizuje nieużywany przedział rozruchowy, zmienia aktywny przedział za pomocą interfejsu HAL i uruchamia się ponownie w zaktualizowanym systemie operacyjnym. Więcej informacji znajdziesz w artykule o wdrażaniu interfejsu HAL kontroli rozruchu.

Obsługa przedziałów

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

  • Nazwy partycji muszą zawierać sufiks określający, które partycje należą do danego przedziału w programie rozruchowym. Każda taka partycja ma przypisaną zmienną has-slot:partition base name o wartości yes. Przedziały mają nazwy alfabetyczne jako a, b, c itd. odpowiadające partycjom z sufiksem _a, _b, _c itd. Program rozruchowy powinien informować system operacyjny o tym, który boks został uruchomiony, używając właściwości wiersza poleceń androidboot.slot_suffix. Jest ona ustawiana w konfiguracji rozruchu 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ą przedziału, program rozruchowy wyczyści komunikat o rozruchu i wyzeruje licznik ponownych prób dla przedziału.

Program rozruchowy powinien też określać, które gniazdo ma zostać załadowane. Na ilustracji widać przykładowy proces decyzyjny.

Proces tworzenia przedziałów w programie rozruchowym
Rysunek 1. Proces dodawania przedziałów w programie rozruchowym
  1. Określ, który przedział czasu ma zostać wykorzystany. Nie próbuj wczytywać przedziału oznaczonego jako slot-unbootable. Ten przedział powinien być zgodny z wartościami zwracanymi przez funkcję szybkiego rozruchu i jest nazywany bieżącym przedziałem.

  2. Jeśli bieżący boks nie jest oznaczony jako slot-successful i ma 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ł nie jest dostę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 slot_suffix wiersza poleceń jądra.

  5. Rozruchowy. Jeśli nie masz oznaczenia slot-successful, zmniejsz wartość o slot-retry-count.

Narzędzie fastboot określa, która partycja ma być aktualizowana po uruchomieniu poleceń Flash. 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, by wygenerować nazwę partycji do wyświetlenia (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 zapewnić obsługę aktualizacji OTA na urządzeniach, które nie korzystają z aktualizacji A/B (zobacz Urządzenia inne niż A/B z możliwością aktualizacji), upewnij się, że program rozruchowy 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 przywracania.

  • Jeśli aktualizacje obrazów radiowych są obsługiwane, partycja recovery powinna również umożliwiać błyskawiczne uruchamianie opcji. Można to zrobić na 2 sposoby:

    • Program rozruchowy miga. W takiej sytuacji powinno być możliwe ponowne uruchomienie w programie rozruchowym z partycji przywracania w celu ukończenia aktualizacji.

    • Obraz odzyskiwania miga.Może ona być dostępna jako biblioteka binarna lub narzędzie.