Przenieś szybki rozruch do przestrzeni użytkownika

Android 10 i nowsze wersje obsługują partycje z możliwością zmiany rozmiaru partycji przeniesienie implementacji szybkiego rozruchu z programu rozruchowego do przestrzeni użytkownika. Ten relokacja umożliwia przeniesienie kodu Flash do kodu, który można utrzymywać i testować. w wspólnej lokalizacji, z elementami szybkiego rozruchu specyficznymi dla dostawcy zaimplementowanymi 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

Szybki rozruch i przywracanie w przestrzeni użytkownika są podobne, więc można je połączyć w jeden partycji lub pliku binarnego. Zapewnia to takie korzyści, jak mniejsze miejsce, i mniejsza liczba partycji, a szybki rozruch i regeneracja jądro i biblioteki.

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, stage i reserved także pozostają niezmienione. Program rozruchowy wczytuje się i uruchamia obraz przywracania po sprawdzeniu, boot-fastboot w polu polecenia BCB. Przywracanie analizuje komunikat BCB. i przełączy się w tryb fastbootd.

Polecenia ADB

W tej sekcji opisano polecenie adb służące 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 Mode

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

Polecenie Opis
reboot recovery
  • Uruchamia się ponownie w trybie przywracania (program rozruchowy).
  • Uruchamia proces przywracania bezpośrednio bez ponownego uruchamiania urządzenia (fastbootd).
reboot fastboot Uruchamia się ponownie w: fastbootd.
getvar is-userspace
  • Zwraca yes (fastbootd).
  • Zwraca no (program rozruchowy).
getvar is-logical:<partition> Zwraca yes, jeśli dana partycja jest partycją logiczną, W przeciwnym razie: no. Partycje logiczne obsługują wszystkie polecenia wymienione poniżej.
getvar super-partition-name Zwraca nazwę superpartycji. Nazwa zawiera bieżący boks jeśli superpartycja jest partycją A/B (zwykle nie jest).
create-logical-partition <partition> <size> Tworzy partycję logiczną o podanej nazwie i rozmiarze. Nazwa nie może już istnieje jako partycja logiczna.
delete-logical-partition <partition> Usuwa daną partycję logiczną (efektywnie ją czyści).
resize-logical-partition <partition> <size> Zmienia rozmiar partycji logicznej do nowego rozmiaru bez zmiany jej zawartości. Błąd, jeśli nie ma wystarczającej ilości miejsca na zmianę rozmiaru.
update-super <partition> Scala zmiany w metadanych partycji nadrzędnej. Jeśli scalenie jest niemożliwe (na przykład format na urządzeniu to nieobsługiwana wersja), to nie udało się wykonać polecenia. Opcjonalny parametr wipe zastępuje metadanych, a nie przez ich scalanie.
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 znajdować się w bez blokady.
getvar <variable> | all Wyświetla zmienną programu rozruchowego lub wszystkie zmienne. Jeśli zmienna nie istnieją, zwraca błąd.
set_active <slot>

Ustawia dane gniazdo rozruchowe A/B na active. Następne spowoduje uruchomienie systemu z określonego 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 Urządzenie uruchamia się ponownie w zwykły sposób.
reboot-bootloader (lub reboot bootloader) Uruchamia urządzenie ponownie w programie rozruchowym.
fastboot fetch vendor_boot <out.img>

Używaj w Androidzie 12 i nowszych, aby: i obsługują flashowanie dysków ramdystów 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 fastboot fetch była . 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 dostawca nagłówek rozruchowy to wersja 3. Jeśli jest to wersja 4, odnajduje prawidłowy kod 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: 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. Program rozruchowy powinien obsługiwać poniższe 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 Ponownie uruchamia urządzenie.
reboot fastboot Uruchamia się ponownie w trybie fastboot.
reboot recovery Uruchamia się ponownie w celu przywracania.
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. Do modernizacji dynamicznych urządzeniach partycji, narzędzie do szybkiego rozruchu (oraz program rozruchowy) obsługuje w celu bezpośredniego flashowania partycji dynamicznej w trybie programu rozruchowego. Dla: na przykład jeśli system jest dynamiczną partycją na modernizowanym urządzeniu, użycie polecenia fastboot --force flash system włącza program rozruchowy (zamiast fastbootd), aby uruchomić 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.

Fastbootowy kod HAL OEM

Aby całkowicie zastąpić szybki rozruch programu rozruchowego, musi on obsłużyć wszystkie istniejące polecenia szybkiego rozruchu. Wiele z tych poleceń pochodzi od producenta OEM i jest udokumentowane, ale wymagają niestandardowej implementacji. Wiele poleceń specyficznych dla OEM nie występuje udokumentowane. Aby obsługiwać takie polecenia, HAL fastboot określa wymagane Polecenia OEM. OEM może też wdrażać własne polecenia.

Definicja interfejsu HAL szybkiego rozruchu jest taka:

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łącz szybki rozruch

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 wszelkie uprawnienia SEPolicy właściwe dla urządzenia wymagane przez system 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 dysków RAM przy użyciu dodanego polecenia szybkiego rozruchu, które pobiera pełny vendor_boot obraz z urządzenia. Polecenie powoduje uruchomienie szybkiego rozruchu po stronie hosta odczytuje nagłówek rozruchowy dostawcy, reinstaluj i flashuje 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 nie będzie działać, ale nie sam program rozruchowy. OEM może dodawać fetch:vendor_boot do implementacji programu rozruchowego protokołu. Jeśli jednak polecenie nie zostanie rozpoznane w trybie programu rozruchowego, flashowanie dysków RAM poszczególnych dostawców w trybie programu rozruchowego nie jest obsługiwane przez dostawcę. .

Zmiany programu rozruchowego

Polecenia getvar:max-fetch-size i fetch:name są zaimplementowane 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. Wskazuje on maksymalny rozmiar, jaki urządzenie może wysłać w ramach jednej odpowiedzi DATA. Kierowca nie może pobierze rozmiar większy od tej wartości.

fetch:name[:offset[:size]] wykonuje serię testów na urządzeniu. Jeśli wszystkie z tych warunków jest spełniony, polecenie fetch:name[:offset[:size]] zwraca dane:

  • Na urządzeniu działa kompilacja możliwa do debugowania.
  • Urządzenie jest odblokowane (stan rozruchu pomarańczowy).
  • Nazwa pobranej 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 jest odpowiednikiem funkcji 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.

  • Określono przesunięcie, rozmiar nieokreślony: 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, aby wdrożyć zmiany sterowników. 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.
    • Wywołania fastboot fetch vendor_boot[_a]:offset:size za każdą 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 rozruch dostawcy to wersja nagłówka 3, wykona te działania:
      • Zastępuje dysk Ramdisk dostawcy danym obrazem.
      • Wyświetla nowy obraz vendor_boot.
    • Jeśli nagłówek rozruchowy dostawcy to version 4, wykona te działania:
      • Zastępuje cały RAMdysk dostawcy danym obrazem, tak aby staje się jedynym fragmentem pamięci RAM dostawcy w Obraz: vendor_boot.
      • Ponownie oblicza rozmiar i odsunięcie w tabeli pamięci RAM dostawcy.
      • Wyświetla nowy obraz vendor_boot.
  • fastboot flash vendor_boot:foo vendor-ramdisk.img

    Pobiera element vendor_boot image, tak jakby został wywołany fastboot fetch.

    • Jeśli nagłówek rozruchowy dostawcy to wersja 3, zwraca błąd.
    • Jeśli nagłówek rozruchowy dostawcy to wersja 4, wykonuje on te działania:

      • Znajduje fragment pamięci RAM dostawcy o nazwie foo. Jeśli nie zostanie znaleziona lub w przypadku kilku dopasowań zwraca błąd.
      • Zastępuje fragment RAMdysku dostawcy danym obrazem.
      • Ponownie oblicza każdy rozmiar i odsunięcie w tabeli pamięci RAM dostawcy.
      • Wyświetla nowy obraz vendor_boot.

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.