Przenieś szybki rozruch do przestrzeni użytkownika

Fastboot to nazwa i tryb programu rozruchowego. Android 10 lub nowszy obsługuje partycje z możliwością zmiany rozmiaru, przenosząc implementację fastboot z program rozruchowy do przestrzeni użytkownika. Ten relokacja umożliwia przeniesienie migającego kodu do kodu, który można utrzymywać i testować. w wspólnej lokalizacji, z użyciem wyłącznie określonych przez dostawcę części szybkiego rozruchu zaimplementowanych przez warstwa abstrakcji sprzętowej (HAL). Oprócz tego Android 12 i nowszych obsługują flashowanie dysków RAM przy użyciu dodanego polecenia fastboot.

Połącz tryb szybkiego rozruchu i przywracania

Ponieważ fastboot i odzyskiwanie w przestrzeni użytkownika są podobne, możesz je scalić w jedną partycję lub binarne. Daje to takie korzyści jak mniejsze zużycie miejsca, mniej partycji i wspólne korzystanie przez fastboot i recovery z jądra i bibliotek.

Fastbootd to nazwa demona i trybu w przestrzeni użytkownika. Aby umożliwić obsługę fastbootd, program rozruchowy musi wdrożyć nowy blok sterujący rozruchu (BCB) dowód osobisty boot-fastboot. Aby włączyć tryb fastbootd, program rozruchowy zapisuje boot-fastboot w polu polecenia wiadomości BCB i pozostawia pole Nie zmieniono recovery pola BCB (aby umożliwić ponowne uruchamianie każdego przerwanego przywracania) zadania). Pola status, stagereserved również pozostają bez zmian. Po wykryciu boot-fastboot w polu polecenia BCB bootloader wczytuje się i uruchamia obraz odzyskiwania. Następnie odzyskiwanie analizuje wiadomość BCB i przełącza się w tryb fastbootd.

Polecenia ADB

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

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 podwójny sufiks, jeśli superpartycja jest partycją A/B (zazwyczaj tak 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ą (efektywnie ją czyści).
resize-logical-partition <partition> <size> Zmienia rozmiar partycji logicznej na nowy, nie zmieniając jej zawartości. Nie powiedzie się, jeśli nie ma wystarczającej ilości 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ą bootloadera lub wszystkie zmienne. Jeśli zmienna nie istnieją, zwraca błąd.
set_active <slot>

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

Dla obsługi A/B przedziały to zduplikowane zestawy partycji, które można uruchomić niezależnie od siebie. Przedziały mają nazwy a, b itd. i rozróżniać je przez dodanie sufiksów _a, _b i tak dalej z nazwą partycji.

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 cały rozmiar partycji i rozmiar fragmentu. Pobiera dane dla każdego fragmentu, a następnie łączy dane w <out.img>

Więcej informacji: fastboot fetch vendor_boot <out.img>.

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

Używaj w Androidzie 12 i nowszych wersjach, aby umożliwić błyskawiczne flashowanie plików ramdystw dostawcy.

Jest to specjalny wariant polecenia flash. Wykonuje funkcję 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 3 lub 4.

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

fastboot flash vendor_boot:<foo> <vendor-ramdisk.img> Używaj w Androidzie 12 i nowszych do: zawierają też obsługę flashowania dysków Ramdystów dostawcy.

Pobiera obraz vendor_boot. Zwraca błąd, jeśli nagłówek rozruchu 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 danym obrazem, przelicza rozmiary i przesunięcia oraz miga nową vendor_boot image.

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

Fastboot i program rozruchowy

Program rozruchowy miga: bootloader, radio i boot/recovery partycji, po czym urządzenie uruchamia się w trybie fastboot (przestrzeń użytkownika) i miga wszystkich innych partycji. Bootloader powinien obsługiwać te polecenia.

Polecenie Opis
download Pobiera obraz do flasha.
flash recovery <image>/ flash boot <image>/ flash bootloader <image>/ Flashes recovery/boot partition and bootloader.
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 flashowania odtwarzania/uruchamiania obraz (np. current-slot i max-download-size).
oem <command> Polecenie zdefiniowane przez OEM.

Partycje dynamiczne

Program rozruchowy nie może zezwalać na flashowanie ani usuwanie partycji dynamicznych i muszą zwrócić błąd, jeśli zostanie podjęta próba tych operacji. W przypadku urządzeń z dynamiczną partycją, które zostały zmodernizowane, narzędzie fastboot (i bootloader) obsługuje tryb wymuszania, aby bezpośrednio zaflashować dynamiczną partycję w trybie bootloadera. 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łączonym

Jeśli urządzenie obsługuje ładowanie w trybie wyłączonym lub w inny sposób włącza się automatycznie po podłączeniu zasilania, implementacja Polecenie fastboot oem off-mode-charge 0 musi omijać te tryby specjalne, dzięki czemu urządzenie uruchomi się, jakby użytkownik naciskał przycisk zasilania.

Fastboot OEM HAL

Aby całkowicie zastąpić fastboot, fastboot musi obsługiwać wszystkie istniejące polecenia fastboot. Wiele z tych poleceń pochodzi od producenta OEM i jest udokumentowane, ale wymagają niestandardowej implementacji. Wiele poleceń dla OEM nie jest zdokumentowanych. Do obsługi takich poleceń interfejs HAL fastboot określa wymagane Polecenia OEM. Producenci OEM mogą 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ć funkcję fastbootd na urządzeniu:

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

  2. Sprawdź, czy interfejsy HAL do szybkiego rozruchu, HAL kontroli rozruchu i HAL kontroli stanu są spakowane jako część obrazu odzyskiwania.

  3. Dodaj uprawnienia SEPolicy wymagane przez fastbootd. Dla: np. fastbootd wymaga uprawnień do zapisu na partycji określonej dla urządzenia, aby i Flasha partycję. Dodatkowo implementacja technologii HAL szybkiego rozruchu może wymagają uprawnień dla poszczególnych urządzeń.

Aby sprawdzić szybki rozruch przestrzeni użytkownika, uruchom pakiet Vendor Test Suite (VTS).

Dysk twardy dostawcy 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 z protokołem szybkiego rozruchu i implementacją protokołu na Androidzie 12. Pamiętaj, że fastbootd implementuje tę funkcję, ale sam bootloader może tego nie robić. OEM może dodawać fetch:vendor_boot do implementacji programu rozruchowego protokołu. 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ą wdrażane w fastbootd. Aby obsługiwać w programie rozruchowym flashowanie plików ramdystw dostawcy, musisz zaimplementuj te 2 polecenia.

Zmiany w trybie Fastbootd

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 z tych warunków jest spełniony, 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 zakresie 0 < size <= max-fetch-size.

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

  • fetch:name jest odpowiednikiem funkcji fetch:name:0, która jest odpowiednikiem funkcji 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 właściwości offset lub partition_size (albo obu), w parametrze używane są wartości domyślne, które dla offset to 0, a dla size to obliczona wartość partition_size - offset.

  • Podana wartość przesunięcia, nieokreślony rozmiar: size = partition_size - offset
  • Nie określono: wartości domyślne są używane w obu przypadkach (size = partition_size – 0).

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

Zmiany sterowników

Do narzędzia fastboot dodano polecenia, które umożliwiają wprowadzanie zmian w sterownikach. Każdy z nich to znajdziesz w tabeli szybkiego rozruchu. .

  • 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 wystarczy tylko jeden fragment).
    • Łączy dane razem do out.img.
  • fastboot flash vendor_boot:default vendor-ramdisk.img

    Jest to specjalny wariant polecenia Flash. Pobiera Obraz vendor_boot, tak jakby został wywołany fastboot fetch.

    • Jeśli boot dostawcy jest w wersji 3, wykonuje on te czynności:
      • Zastępuje pamięć RAM dostawcy podanym 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 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 rozruchowy dostawcy to wersja 3, zwraca błąd.
    • Jeśli nagłówek dostawcy w bootloaderze ma wersję 4, wykonuje te czynności:

      • Znajduje fragment pliku ramdisk dostawcy o nazwie ramdisk_<var>&lt;foo></var>. Jeśli nie ma ich lub wiele dopasowań, zwraca błąd.
      • Zastępuje fragment RAMdysku dostawcy danym obrazem.
      • Ponownie oblicza każdy rozmiar i przesunięcie w tabeli dostawcy ramdisk.
      • Błyska nowy obraz vendor_boot.
    • Jeśli <foo> nie jest określony, próbuje znaleźć ramdisk_.

mkbootimg

Nazwa default jest zarezerwowana do nadawania nazw fragmentom Ramdysków dostawcy w Androida 12 lub nowszego, Podczas uruchamiania szybkiego uruchamiania flash vendor_boot:default semantyka jest taka sama, więc nie możesz nazywać fragmentów ramdysk default

Zmiany w SELinux

Zmiana została wprowadzona w fastbootd.te pozwalają na flashowanie dysków ramdystów dostawcy.