Przenoszenie Fastboot do przestrzeni użytkownika

Android 10 i nowsze obsługują partycje o zmiennym rozmiarze, przenosząc implementację fastboot z bootloadera do przestrzeni użytkownika. Ta relokacja umożliwia przeniesienie kodu flashowego do łatwej w utrzymaniu i testowalnej wspólnej lokalizacji, przy czym tylko specyficzne dla dostawcy części fastboot są zaimplementowane przez warstwę abstrakcji sprzętu (HAL). Ponadto Android 12 i nowsze obsługują flashowanie ramdysków za pomocą dodanego polecenia fastboot.

Ujednolicenie szybkiego uruchamiania i odzyskiwania

Ponieważ szybkie uruchamianie i odzyskiwanie w przestrzeni użytkownika są podobne, możesz połączyć je w jedną partycję lub plik binarny. Zapewnia to takie korzyści, jak mniejsze zużycie miejsca, ogólna liczba partycji oraz możliwość współdzielenia jądra i bibliotek przez funkcję szybkiego uruchamiania i odzyskiwania.

Aby obsługiwać fastbootd , program ładujący musi zaimplementować nowe polecenie bloku kontroli rozruchu (BCB) boot-fastboot . Aby przejść do trybu fastbootd , program ładujący zapisuje boot-fastboot w polu poleceń komunikatu BCB i pozostawia pole recovery BCB niezmienione (aby umożliwić ponowne uruchomienie wszelkich przerwanych zadań odzyskiwania). Pola status , stage i reserved również pozostają niezmienione. Program ładujący ładuje się i uruchamia obraz odzyskiwania po wyświetleniu boot-fastboot w polu poleceń BCB. Następnie Recovery analizuje komunikat BCB i przełącza się do trybu fastbootd .

Polecenia ADB

W tej sekcji opisano polecenie adb służące do integracji fastbootd . Polecenie ma różne wyniki w zależności od tego, czy jest wykonywane przez system, czy przez odzyskiwanie.

Komenda Opis
reboot fastboot
  • Uruchamia się ponownie w trybie fastbootd (system).
  • Wchodzi bezpośrednio do fastbootd bez ponownego uruchamiania (odzyskiwania).

Polecenia Fastboota

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 polecenia dają różne wyniki, w zależności od tego, czy zostały wykonane przez program ładujący, czy przez fastbootd .

Komenda Opis
reboot recovery
  • Uruchamia się ponownie w trybie odzyskiwania (bootloader).
  • Wchodzi do odzyskiwania bezpośrednio bez ponownego uruchamiania ( fastbootd ).
reboot fastboot Uruchamia się ponownie w trybie fastbootd .
getvar is-userspace
  • Zwraca yes ( fastbootd ).
  • Zwraca no (bootloader).
getvar is-logical: <partition> Zwraca wartość yes , jeśli podana partycja jest partycją logiczną, w przeciwnym przypadku no . Partycje logiczne obsługują wszystkie polecenia wymienione poniżej.
getvar super-partition-name Zwraca nazwę super partycji. Nazwa zawiera sufiks bieżącego gniazda, jeśli super partycja jest partycją A/B (zwykle tak nie jest).
create-logical-partition <partition> <size> Tworzy partycję logiczną o podanej nazwie i rozmiarze. Nazwa nie może już istnieć jako partycja logiczna.
delete-logical-partition <partition> Usuwa podaną partycję logiczną (skutecznie czyści partycję).
resize-logical-partition <partition> <size> Zmienia rozmiar partycji logicznej do nowego rozmiaru bez zmiany jej zawartości. Niepowodzenie, jeśli nie ma wystarczającej ilości miejsca do przeprowadzenia zmiany rozmiaru.
update-super <partition> Łączy zmiany w metadanych super partycji. Jeśli scalanie nie jest możliwe (na przykład format na urządzeniu jest nieobsługiwany), wykonanie polecenia zakończy się niepowodzeniem. Opcjonalny parametr wipe zastępuje metadane urządzenia zamiast wykonywać scalanie.
flash <partition> [ <filename> ] Zapisuje plik na partycji flash. Urządzenie musi być w stanie odblokowanym.
erase <partition> Usuwa partycję (nie jest wymagane bezpieczne usuwanie). Urządzenie musi być w stanie odblokowanym.
getvar <variable> | all Wyświetla zmienną programu ładującego lub wszystkie zmienne. Jeśli zmienna nie istnieje, zwraca błąd.
set_active <slot>

Ustawia dany slot startowy A/B jako active . Przy następnej próbie rozruchu system zostanie uruchomiony z określonego gniazda.

W przypadku obsługi A/B gniazda to zduplikowane zestawy partycji, z których można niezależnie uruchamiać system. Gniazda są nazywane a , b itd. i rozróżniane poprzez dodanie przyrostków _a , _b itd. do nazwy partycji.

reboot Normalnie uruchamia ponownie urządzenie.
reboot-bootloader (lub reboot bootloader ) Ponownie uruchamia urządzenie w bootloaderze.
fastboot fetch vendor_boot <out.img>

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

Pobiera rozmiar całej partycji i rozmiar porcji. Pobiera dane dla każdego fragmentu, a następnie łączy dane w plik <out.img>

Aby uzyskać szczegółowe informacje, zobacz fastboot fetch vendor_boot <out.img> .

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

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

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

Aby uzyskać szczegółowe informacje, zobacz fastboot flash vendor_boot:default <vendor-ramdisk.img> .

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

Pobiera obraz vendor_boot . Zwraca błąd, jeśli nagłówek rozruchowy dostawcy jest w wersji 3. Jeśli jest to wersja 4, znajduje poprawny fragment RAMdysku dostawcy (jeśli jest dostępny). Zastępuje go podanym obrazem, ponownie oblicza rozmiary i przesunięcia oraz wyświetla nowy vendor_boot image .

Aby uzyskać szczegółowe informacje, zobacz fastboot flash vendor_boot: <foo> <vendor-ramdisk.img>

Fastboot i bootloader

Program ładujący flashuje partycje bootloader , radio i boot/recovery , po czym urządzenie uruchamia się w trybie fastboot (przestrzeń użytkownika) i flashuje wszystkie pozostałe partycje. Program ładujący powinien obsługiwać następujące polecenia.

Komenda Opis
download Pobiera obraz do flashowania.
flash recovery <image> / flash boot <image> / flash bootloader <image> / Miga partycja recovery/boot i program ładujący.
reboot Ponownie uruchamia urządzenie.
reboot fastboot Uruchamia się ponownie do fastboota.
reboot recovery Ponowne uruchomienie do odzyskiwania.
getvar Pobiera zmienną programu ładującego wymaganą do flashowania obrazu odzyskiwania/rozruchu (na przykład current-slot i max-download-size ).
oem <command> Polecenie zdefiniowane przez OEM.

Partycje dynamiczne

Program ładujący nie może zezwalać na flashowanie ani kasowanie partycji dynamicznych i musi zwrócić błąd w przypadku próby wykonania tych operacji. W przypadku modernizowanych urządzeń z partycjami dynamicznymi narzędzie fastboot (i program ładujący) obsługuje tryb wymuszania bezpośredniego flashowania partycji dynamicznej w trybie programu ładującego. Na przykład, jeśli system jest partycją dynamiczną na zmodernizowanym urządzeniu, użycie polecenia fastboot --force flash system umożliwia programowi ładującemu (zamiast fastbootd ) flashowanie partycji.

Ładowanie w trybie wyłączenia

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

Fastboot OEM HAL

Aby całkowicie zastąpić fastboot programu ładującego, 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ń specyficznych dla OEM nie jest udokumentowanych. Aby obsłużyć takie polecenia, warstwa HAL fastboot określa wymagane polecenia OEM. Producenci OEM mogą również wdrażać własne polecenia.

Definicja fastboot HAL jest następująca:

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łączenie fastbootd

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

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

  2. Upewnij się, że warstwa HAL fastboot, warstwa HAL kontroli rozruchu i warstwa HAL kondycji są spakowane jako część obrazu odzyskiwania.

  3. Dodaj wszelkie uprawnienia SEPolicy specyficzne dla urządzenia wymagane przez fastbootd . Na przykład fastbootd wymaga dostępu do zapisu na partycji specyficznej dla urządzenia, aby sflashować tę partycję. Ponadto implementacja fastboot HAL może również wymagać uprawnień specyficznych dla urządzenia.

Aby sprawdzić poprawność funkcji fastboot w przestrzeni użytkownika, uruchom pakiet Vendor Test Suite (VTS) .

Flashowanie ramdysków dostawcy

Android 12 i nowsze zapewniają obsługę flashowania ramdysków z dodanym poleceniem fastboot, które pobiera pełny obraz vendor_boot z urządzenia. Polecenie powoduje, że narzędzie fastboot po stronie hosta odczyta nagłówek rozruchowy dostawcy, ponownie zobrazuje i wgra nowy obraz.

Aby pobrać pełny obraz vendor_boot , dodano polecenie fetch:vendor_boot zarówno do protokołu fastboot, jak i do implementacji protokołu fastbootd w systemie Android 12. Należy pamiętać, że fastbootd to implementuje , ale sam bootloader może nie. Producenci OEM mogą dodać polecenie fetch:vendor_boot do implementacji protokołu w programie ładującym. Jeśli jednak polecenie nie zostanie rozpoznane w trybie programu ładującego, flashowanie poszczególnych ramdysków dostawcy w trybie programu ładującego nie jest opcją obsługiwaną przez dostawcę.

Zmiany w bootloaderze

Polecenia getvar:max-fetch-size i fetch:name są zaimplementowane w fastbootd . Aby obsługiwać flashowanie ramdysków dostawcy w bootloaderze, musisz zaimplementować te dwa polecenia.

Zmiany w Fastbootdzie

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. Kierowca nie może pobrać rozmiaru większego niż ta wartość.

fetch:name[:offset[:size]] wykonuje serię kontroli urządzenia. Jeśli wszystkie poniższe warunki są spełnione, komenda fetch:name[:offset[:size]] zwraca dane:

  • Na urządzeniu działa kompilacja z możliwością debugowania.
  • Urządzenie jest odblokowane (stan rozruchu pomarańczowy).
  • Pobrana nazwa partycji to vendor_boot .
  • Wartość size mieści się w zakresie 0 < size <= max-fetch-size .

Kiedy zostaną one zweryfikowane, fetch:name[:offset[:size]] zwraca rozmiar partycji i przesunięcie. Zwróć uwagę na następujące kwestie:

  • fetch:name jest równoważne fetch:name:0 , co jest równoważne fetch:name:0:partition_size .
  • fetch:name:offset jest równoważne fetch:name:offset:(partition_size - offset)

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

Gdy nie określono offset lub partition_size (lub obu), używane są wartości domyślne, które dla offset wynoszą 0, a dla size jest obliczoną wartością partition_size - offset .

  • Określono przesunięcie, rozmiar nieokreślono: size = partition_size - offset
  • Żadne nie zostało określone: ​​wartości domyślne używane dla obu, size = partition_size - 0.

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

Zmiany kierowców

Do narzędzia fastboot dodano polecenia umożliwiające wprowadzenie zmian w sterownikach. Każde z nich jest powiązane z pełną definicją w tabeli poleceń Fastboot .

  • fastboot fetch vendor_boot out.img

    • Wywołuje funkcję getvar max-fetch-size w celu określenia rozmiaru porcji.
    • Wywołuje getvar partition-size:vendor_boot[_a] aby określić rozmiar całej partycji.
    • Wywołuje funkcję fastboot fetch vendor_boot[_a]:offset:size dla każdej porcji. (Rozmiar porcji jest większy niż rozmiar vendor_boot , więc zwykle jest tylko jedna porcja.)
    • Łączy dane w całość do 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 to wersja nagłówka 3 , wykonuje następujące czynności:
      • Zastępuje ramdysk dostawcy podanym obrazem.
      • Miga nowy obraz vendor_boot .
    • Jeśli nagłówek rozruchowy dostawcy to wersja 4 , wykonuje następujące czynności:
      • Zastępuje cały ramdysk dostawcy podanym obrazem, tak że dany obraz staje się jedynym fragmentem RAMdysku dostawcy w obrazie vendor_boot .
      • Ponownie oblicza rozmiar i przesunięcie w tabeli RAMdysku dostawcy.
      • Miga nowy obraz vendor_boot .
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

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

    • Jeśli nagłówek rozruchowy dostawcy jest w wersji 3, zwraca błąd.
    • Jeśli nagłówek rozruchowy dostawcy jest w wersji 4, wykonuje następujące czynności:

      • Znajduje fragment ramdysku dostawcy o nazwie foo . Jeśli nie zostanie znaleziony lub istnieje wiele dopasowań, zwraca błąd.
      • Zastępuje fragment dysku RAM dostawcy podanym obrazem.
      • Przelicza każdy rozmiar i przesunięcie w tabeli RAMdysku dostawcy.
      • Miga nowy obraz vendor_boot .

mkbootimg

default nazwa jest zarezerwowana do nadawania nazw fragmentom ramdysku dostawcy w systemie Android 12 i nowszych wersjach. Chociaż semantyka fastboot flash vendor_boot:default pozostaje taka sama, nie możesz nazywać fragmentów ramdysku default .

Zmiany w SELinuxie

W fastbootd.te wprowadzono zmianę, aby obsługiwać flashowanie ramdysków dostawców.