Przenieś szybki rozruch do przestrzeni użytkownika

Fastboot to nazwa modułu i trybu bootloadera. Android 10 i nowsze wersje obsługują partycje o zmiennym rozmiarze dzięki przenoszeniu implementacji fastboot z bootloadera do przestrzeni użytkownika. Ta zmiana umożliwia przeniesienie kodu do obsługiwania oprogramowania do wspólnej lokalizacji, która jest wspólna i łatwo dostępna do utrzymania i testowania, z jedynie częściami fastboot implementowanymi przez warstwę abstrakcji sprzętowej (HAL) dla konkretnego producenta. Oprócz tego w Androidzie 12 i nowszych można flashować pliki ramdysków za pomocą dodanego polecenia szybkiego rozruchu.

Połączenie Fastboot i odzyskiwania

Fastboot i Recovery w przestrzeni użytkownika są podobne, więc można je scalić w jedną partycję lub plik binarny. Zapewnia to takie korzyści, jak mniejsze miejsce na dane, mniejsza ogólna liczba partycji oraz korzystanie z szybkiego rozruchu i przywracania plików, które współdzielą jądro i biblioteki.

Fastbootd to nazwa demona i trybu przestrzeni użytkownika. Aby obsługiwać fastbootd, program rozruchowy musi zaimplementować nowe polecenie bloku sterowania rozruchem (BCB) boot-fastboot. Aby przejść do trybu fastbootd, bootloader zapisuje wartość boot-fastboot w polu polecenia wiadomości BCB i nie zmienia pola recovery wiadomości BCB (aby umożliwić wznowienie przerwanych zadań odzyskiwania). Pola status, stagereserved również pozostają niezmienione. Po wykryciu boot-fastboot w polu polecenia BCB bootloader wczytuje obraz odzyskiwania i uruchamia go. Następnie funkcja odzyskiwania analizuje komunikat BCB i przełącza się w tryb fastbootd.

Polecenia ADB

W tej sekcji opisaliśmy komendę adb służącą do integracji fastbootd. Polecenie to daje różne rezultaty w zależności od tego, czy zostało wykonane przez system czy przez system przywracania.

Polecenie Opis
reboot fastboot
  • Uruchamia się ponownie w trybie fastbootd (system).
  • Otwiera kod fastbootd bezpośrednio bez ponownego uruchamiania (przywracania).

Polecenia fastboot

W tej sekcji opisano polecenia fastboot służące do integracji fastbootd, w tym nowe polecenia do flashowania i zarządzania partycjami logicznymi. Niektóre komendy dają różne wyniki w zależności od tego, czy zostały wykonane przez bootloadera czy przez fastbootd.

Polecenie Opis
reboot recovery
  • Uruchom ponownie w trybie odzyskiwania (bootloader).
  • Wchodzi w tryb przywracania bezpośrednio bez ponownego uruchamiania (fastbootd).
reboot fastboot Uruchom ponownie fastbootd.
getvar is-userspace
  • Zwroty yes (fastbootd).
  • Zwraca no (program rozruchowy).
getvar is-logical:<partition> Zwraca yes, jeśli dana partycja jest partycją logiczną, a w przeciwnym razie zwraca no. Partycje logiczne obsługują wszystkie polecenia wymienione poniżej.
getvar super-partition-name Zwraca nazwę superpartycji. Nazwa zawiera sufiks bieżącego przedziału, jeśli superpartycja jest partycją A/B (zwykle nie jest).
create-logical-partition <partition> <size> Tworzy partycję logiczną o określonej nazwie i rozmiarze. Nazwa nie może już występować jako partycja logiczna.
delete-logical-partition <partition> Usuwa daną partycję logiczną (skutecznie usuwa partycję).
resize-logical-partition <partition> <size> Zmienia rozmiar partycji logicznej na nowy, nie zmieniając jej zawartości. Operacja zakończy się niepowodzeniem, jeśli nie ma wystarczająco dużo miejsca na zmianę rozmiaru.
update-super <partition> Łączy zmiany w metadanych super partycji. Jeśli nie można scalić plików (na przykład format na urządzeniu jest nieobsługiwaną wersją), ta komenda zakończy się niepowodzeniem. Opcjonalny parametr wipe zastępuje metadane urządzenia, a nie wykonuje scalania.
flash <partition><filename> ] Zapisuje plik na partycji Flash. Urządzenie musi być odblokowane.
erase <partition> Wymazuje partycję (nie jest to wymagane w ramach bezpiecznego wymazywania). Urządzenie musi być odblokowane.
getvar <variable> | all Wyświetla zmienną programu rozruchowego lub wszystkie zmienne. Jeśli zmienna nie istnieje, zwracany jest błąd.
set_active <slot>

Ustawia dany slot uruchamiania A/B jako active. Podczas następnej próby uruchomienia system uruchamia się z wybranego gniazda.

W przypadku obsługi A/B przedziały to zduplikowane zestawy partycji, które można uruchamiać niezależnie. Slots mają nazwy a, b itd. i są rozróżniane przez dodanie do nazwy partycji sufiksu _a, _b itd.

reboot Uruchom ponownie urządzenie.
reboot-bootloader (lub reboot bootloader) Uruchom ponownie urządzenie w trybie bootloadera.
fastboot fetch vendor_boot <out.img>

Używaj w Androidzie 12 i nowszych, aby obsługiwać flashowanie z ramdysk dostawcy.

Pobiera rozmiar całej partycji i rozmiar fragmentu. Pobiera dane z każdego fragmentu, a potem zszywał je w <out.img>

Więcej informacji znajdziesz w sekcji fastboot fetch vendor_boot <out.img>.

fastboot flash vendor_boot:default <vendor-ramdisk.img>

Używaj w Androidzie 12 i nowszych, aby obsługiwać flashowanie ramdysków dostawców.

To specjalny wariant polecenia flash. Wykonuje funkcję obrazu fetch vendor_boot, tak jakby została wywołana fastboot fetch. Nowy obraz vendor_boot, który miga, zależy od tego, czy wersja nagłówka rozruchowego to 3 czy 4.

Więcej informacji znajdziesz w sekcji fastboot flash vendor_boot:default <vendor-ramdisk.img>.

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Używaj w Androidzie 12 i nowszych, aby obsługiwać flashowanie ramdysków dostawcy.

Pobiera obraz vendor_boot. Zwraca błąd, jeśli nagłówek rozruchowy dostawcy ma wersję 3. Jeśli jest to wersja 4, znajduje odpowiedni fragment pamięci RAM dostawcy (jeśli jest dostępny). Zastępuje go określonym obrazem, ponownie oblicza rozmiary i przesunięcia oraz wyświetla nowy vendor_boot image.

Więcej informacji: fastboot flash vendor_boot:<foo> <vendor-ramdisk.img>

Fastboot i program rozruchowy

Program rozruchowy aktualizuje partycje bootloader, radioboot/recovery, po czym urządzenie uruchamia się w trybie fastboot (przestrzeń użytkownika) i aktualizuje wszystkie pozostałe partycje. Program rozruchowy powinien obsługiwać te polecenia.

Polecenie Opis
download Pobiera obraz do flasha.
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ Miga partycję i program rozruchowy recovery/boot.
reboot Uruchom ponownie urządzenie.
reboot fastboot Uruchom ponownie w trybie Fastboot.
reboot recovery Uruchom ponownie w trybie odzyskiwania.
getvar Pobiera zmienną programu rozruchowego, która jest wymagana do zaprogramowania obrazu odzyskiwania/rozruchu (na przykład current-slotmax-download-size).
oem <command> Polecenie zdefiniowane przez OEM.

Dynamiczne partycje

Bootloader nie może zezwalać na flashowanie ani kasowanie partycji dynamicznych i musi zwracać błąd, jeśli zostanie podjęta próba wykonania tych operacji. W przypadku urządzeń z dynamiczną partycją, w których dokonano modernizacji, narzędzie fastboot (i program rozruchowy) obsługuje tryb wymuszania, aby bezpośrednio zaflashować dynamiczną partycję w trybie programu rozruchowego. Jeśli na przykład system to dynamiczna partycja na urządzeniu z dodatkowym oprogramowaniem, użycie polecenia fastboot --force flash system spowoduje, że bootloader (zamiast fastbootd) sflashuje partycję.

Ładowanie w trybie wyłączenia

Jeśli urządzenie obsługuje ładowanie w trybie wyłączenia lub automatycznie uruchamia się w trybie specjalnym po podłączeniu do zasilania, implementacja polecenia fastboot oem off-mode-charge 0 musi pomijać te tryby specjalne, aby urządzenie uruchamiało się tak, jakby użytkownik nacisnął przycisk zasilania.

Fastboot OEM HAL

Aby całkowicie zastąpić fastboot bootloadera, fastboot musi obsługiwać wszystkie istniejące polecenia fastboot. Wiele z tych poleceń pochodzi od producentów OEM i jest udokumentowanych, ale wymagają niestandardowej implementacji. Wiele poleceń dla OEM nie jest zdokumentowanych. Aby obsługiwać takie polecenia, interfejs Fastboot HAL określa wymagane polecenia OEM. OEM może też wdrażać własne polecenia.

Definicja interfejsu Fastboot HAL:

import IFastbootLogger;

/**
 * IFastboot interface implements vendor specific fastboot commands.
 */
interface IFastboot {
    /**
     * Returns a bool indicating whether the bootloader is enforcing verified
     * boot.
     *
     * @return verifiedBootState True if the bootloader is enforcing verified
     * boot and False otherwise.
     */
    isVerifiedBootEnabled() generates (bool verifiedBootState);

    /**
     * Returns a bool indicating the off-mode-charge setting. If off-mode
     * charging is enabled, the device autoboots into a special mode when
     * power is applied.
     *
     * @return offModeChargeState True if the setting is enabled and False if
     * not.
     */
    isOffModeChargeEnabled() generates (bool offModeChargeState);

    /**
     * Returns the minimum battery voltage required for flashing in mV.
     *
     * @return batteryVoltage Minimum battery voltage (in mV) required for
     * flashing to be successful.
     */
    getBatteryVoltageFlashingThreshold() generates (int32_t batteryVoltage);

    /**
     * Returns the file system type of the partition. This is only required for
     * physical partitions that need to be wiped and reformatted.
     *
     * @return type Can be ext4, f2fs or raw.
     * @return result SUCCESS if the operation is successful,
     * FAILURE_UNKNOWN if the partition is invalid or does not require
     * reformatting.
     */
    getPartitionType(string partitionName) generates (FileSystemType type, Result result);

    /**
     * Executes a fastboot OEM command.
     *
     * @param oemCmd The oem command that is passed to the fastboot HAL.
     * @response result Returns the status SUCCESS if the operation is
     * successful,
     * INVALID_ARGUMENT for bad arguments,
     * FAILURE_UNKNOWN for an invalid/unsupported command.
     */
    doOemCommand(string oemCmd) generates (Result result);

};

Włączanie fastbootd

Aby włączyć fastbootd na urządzeniu:

  1. Dodaj fastbootd do PRODUCT_PACKAGES w device.mk: PRODUCT_PACKAGES += fastbootd.

  2. Upewnij się, że interfejsy HAL szybkiego rozruchu, HAL kontroli rozruchu i HAL stanu są zawarte w pakiecie obrazu przywracania.

  3. Dodaj wszelkie uprawnienia SEPolicy właściwe dla urządzenia wymagane przez system fastbootd. Na przykład fastbootd wymaga dostępu do zapisu na partycji specyficznej dla urządzenia, aby móc ją sformatować. Ponadto implementacja interfejsu HAL fastboot może wymagać uprawnień związanych z danym urządzeniem.

Aby zweryfikować fastboot w przestrzeni użytkownika, uruchom pakiet testów dostawcy (VTS).

Ramdysk dostawcy programu Flash

Android 12 i nowsze wersje obsługują flashowanie pamięci RAM za pomocą polecenia fastboot, które pobiera pełny obraz vendor_boot z urządzenia. To polecenie powoduje, że narzędzie fastboot po stronie hosta odczytuje nagłówek rozruchu dostawcy, ponownie utworzy obraz i sflashuje nowy obraz.

Aby pobrać pełny obraz vendor_boot, dodano polecenie fetch:vendor_boot zarówno do protokołu fastboot, jak i do implementacji fastboot w Androidzie 12. Pamiętaj, że fastbootd wdrożył tę funkcję, ale sam bootloader może tego nie zrobić. Producenci OEM mogą dodać polecenie fetch:vendor_boot do implementacji tego protokołu w bootloterze. Jeśli jednak polecenie nie zostanie rozpoznane w trybie bootloadera, flashowanie poszczególnych dysków RAM dostawcy w trybie bootloadera nie jest obsługiwane przez dostawcę.

Zmiany programu rozruchowego

Polecenia getvar:max-fetch-size i fetch:name są zaimplementowane w zadaniu fastbootd. Aby obsługiwać flashowanie dysków RAM dostawcy w programie rozruchowym, musisz wdrożyć te 2 polecenia.

Zmiany dotyczące szybkiego uruchamiania

getvar:max-fetch-size jest podobny do max-download-size. Określa maksymalny rozmiar, jaki urządzenie może wysłać w jednej odpowiedzi DATA. Sterownik nie może pobrać rozmiaru większego niż ta wartość.

fetch:name[:offset[:size]] przeprowadza na urządzeniu serię kontroli. Jeśli wszystkie te warunki są spełnione, polecenie fetch:name[:offset[:size]] zwraca dane:

  • Urządzenie działa w wersji umożliwiającej debugowanie.
  • Urządzenie jest odblokowane (pomarańczowy stan uruchamiania).
  • Wybrana nazwa partycji to vendor_boot.
  • Wartość size mieści się w przedziale 0 < size <= max-fetch-size.

Po sprawdzeniu tych danych fetch:name[:offset[:size]] zwraca rozmiar i przesunięcie partycji. Uwaga:

  • fetch:name jest odpowiednikiem funkcji fetch:name:0, która jest odpowiednikiem fetch:name:0:partition_size.
  • fetch:name:offset to tyle samo co fetch:name:offset:(partition_size - offset)

Dlatego fetch:name[:offset[:size]] = fetch:name:offset:(partition_size - offset).

Jeśli nie określono wartości offset ani partition_size (lub obu), używane są wartości domyślne, które w przypadku offset to 0, a w przypadku size to obliczona wartość partition_size - offset.

  • Podano offset, nieokreślony rozmiar: size = partition_size - offset
  • Żadna z nich nie jest określona: w obu przypadkach używane są wartości domyślne, size = partition_size = 0.

Na przykład fetch:foo pobiera całą partycję foo z przesunięciem 0.

Zmiany dotyczące kierowcy

Do narzędzia fastboot dodano polecenia, aby wdrożyć zmiany sterowników. Każdy z nich jest połączony z pełną definicją w tabeli komend Fastboot.

  • fastboot fetch vendor_boot out.img

    • Wywołuje funkcję getvar max-fetch-size, aby określić rozmiar fragmentu.
    • Wywołuje funkcję getvar partition-size:vendor_boot[_a], aby określić rozmiar całej partycji.
    • Połączenia fastboot fetch vendor_boot[_a]:offset:size dla każdego fragmentu. (Rozmiar fragmentu jest większy niż rozmiar vendor_boot, więc zwykle jest tylko 1 fragment).
    • Łączy dane w jeden zbiór danych, który jest zapisywany w pliku out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Jest to specjalny wariant polecenia flash. Pobiera obraz vendor_boot, tak jakby wywołano funkcję fastboot fetch.

    • Jeśli boot dostawcy jest w wersji 3, wykonuje on te czynności:
      • Zastępuje pamięć RAM dostawcy określonym obrazem.
      • Wyświetla nowy obraz vendor_boot.
    • Jeśli nagłówek bootowania dostawcy ma wersję 4, to:
      • Zastępuje cały obraz dostawcy w pamięci RAM obrazem, dzięki czemu dany obraz staje się jedynym fragmentem obrazu vendor_boot dostawcy w pamięci RAM.
      • Ponownie oblicza rozmiar i przesunięcie w tabeli ramdisk dostawcy.
      • Błyska nowy obraz vendor_boot.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Pobiera wartość vendor_boot image, tak jakby wywołano funkcję fastboot fetch.

    • Jeśli nagłówek dostawcy ma wersję 3, zwracany jest błąd.
    • Jeśli nagłówek dostawcy w bootloaderze ma wersję 4, wykonuje te czynności:

      • Znajduje fragment dostawcy ramdisk o nazwie ramdisk_<var>&lt;foo></var>. Jeśli nie zostanie znaleziony element lub jeśli zostanie znalezione kilka takich elementów, zwracany jest błąd.
      • Zastępuje fragment dostawcy ramdisku obrazem.
      • Ponownie oblicza każdy rozmiar i przesunięcie w tabeli dostawcy ramdysk.
      • Błyska nowy obraz vendor_boot.
    • Jeśli <foo> nie jest określony, usługa próbuje znaleźć ramdisk_.

mkbootimg

Nazwa default jest zarezerwowana do nazywania fragmentów ramdisk dostawcy w Androidzie 12 i nowszych. Semantyka szybkiego rozruchu flash vendor_boot:default pozostaje bez zmian, ale nie możesz nazwać fragmentów ramdisk jako default.

Zmiany w SELinux

Wprowadziliśmy zmianę w fastbootd.te, aby umożliwić obsługę flashowania dysków RAM dostawcy.