Przenieś szybki rozruch do przestrzeni użytkownika

Android 10 i nowsze wersje obsługują partycje z możliwością zmiany rozmiaru, przenosząc implementację Fastboot z programu rozruchowego do przestrzeni użytkownika. Ta relokacja umożliwia przeniesienie Flasha kodu do wspólnej, łatwej do naprawienia i testowania jego wspólnej lokalizacji, w której tylko specyficzne dla dostawcy części szybkiego rozruchu są zaimplementowane za pomocą warstwy abstrakcji sprzętowej (HAL). Dodatkowo w Androidzie 12 i nowszych można flashować dyski ramdys za pomocą dodanego polecenia szybkiego rozruchu.

Połącz tryb szybkiego rozruchu i przywracania

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.

Aby umożliwić obsługę fastbootd, program rozruchowy musi zaimplementować nowe polecenie BCB (rozruchu) systemu boot-fastboot. Aby włączyć tryb fastbootd, program rozruchowy zapisuje boot-fastboot w polu polecenia wiadomości BCB i pozostawia pole recovery BCB bez zmian (aby umożliwić ponowne uruchamianie przerwanego zadania przywracania). Pola status, stage i reserved także pozostają niezmienione. Gdy w polu poleceń BCB pojawi się komunikat boot-fastboot, program rozruchowy wczytuje się i uruchamia obraz przywracania. Następnie funkcja odzyskiwania analizuje komunikat BCB i przełącza się w tryb fastbootd.

Polecenia ADB

W tej sekcji opisano polecenie adb służące do integracji fastbootd. Polecenie to daje różne rezultaty w zależności od tego, czy zostało wykonane przez system czy przez odzyskiwanie.

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 opisujemy polecenia szybkiego rozruchu służące do integracji fastbootd, w tym nowe polecenia do flashowania partycji logicznych i zarządzania nimi. Niektóre polecenia dają różne wyniki w zależności od tego, czy zostały wykonane przez program rozruchowy czy przez 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 sufiks bieżącego przedziału, 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ż istnieć 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. To polecenie nie powiedzie się, jeśli scalenie jest niemożliwe (na przykład z urządzenia ma nieobsługiwany format). Opcjonalny parametr wipe zastępuje metadane urządzenia, zamiast przeprowadzać 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 być odblokowane.
getvar <variable> | all Wyświetla zmienną programu rozruchowego lub wszystkie zmienne. Jeśli zmienna nie istnieje, zwraca błąd.
set_active <slot>

Ustawia dane gniazdo rozruchowe A/B na active. Przy następnej próbie uruchomienia system uruchomi się z określonego gniazda.

W przypadku obsługi A/B przedziały to zduplikowane zestawy partycji, które można uruchamiać niezależnie. Przedziały noszą nazwy a, b itd. i można je rozróżnić przez dodanie do nazwy partycji sufiksów _a, _b itd.

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 wersjach do obsługi flashowania dysków RAM dostawców.

Pobiera cały rozmiar partycji i rozmiar fragmentu. Pobiera dane z każdego fragmentu, a następnie łączy je 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 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 wersjach do obsługi flashowania dysków RAM dostawców.

Pobiera obraz vendor_boot. Zwraca błąd, jeśli nagłówek rozruchowy dostawcy ma wersję 3. Jeśli jest to wersja 4, znajduje prawidłowy fragment Ramdysk dostawcy (jeśli jest dostępny). Zastępuje go danym obrazem, przelicza rozmiary i przesunięcia i wyświetla nowy element vendor_boot image.

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

Fastboot i program rozruchowy

Program rozruchowy miga dla partycji bootloader, radio i boot/recovery, po czym urządzenie uruchamia się w trybie szybkim rozruchu (przestrzeń użytkownika) i miga wszystkie pozostałe partycje. 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 obrazu przywracania/uruchamiania (np. current-slot i max-download-size).
oem <command> Polecenie zdefiniowane przez OEM.

Partycje dynamiczne

Program rozruchowy nie może zezwalać na miganie lub usuwanie partycji dynamicznych i musi zwrócić błąd w przypadku próby wykonania tych operacji. W przypadku zmodernizowanych urządzeń partycji dynamicznych narzędzie do szybkiego rozruchu (i program rozruchowy) obsługuje tryb wymuszania, który pozwala bezpośrednio przeprowadzić aktualizację partycji dynamicznej w trybie programu rozruchowego. Jeśli na przykład system jest dynamiczną partycją na zmodernizowanym urządzeniu, użycie polecenia fastboot --force flash system powoduje, że program rozruchowy (zamiast fastbootd) może ją uruchomić.

Ładowanie w trybie wyłączonym

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

Fastbootowy kod HAL OEM

Aby całkowicie zastąpić szybki rozruch programu rozruchowego, musi on obsługiwać wszystkie istniejące polecenia. Wiele z tych poleceń pochodzi od producentów OEM i są udokumentowane, ale wymagają niestandardowej implementacji. Wiele poleceń OEM nie jest udokumentowanych. Aby obsługiwać takie polecenia, interfejs 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. 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 uprawnień do zapisu na partycji związanej z konkretnym urządzeniem, aby można było wyświetlić tę partycję. Dodatkowo implementacja szybkiego rozruchu HAL może wymagać uprawnień dotyczących konkretnych 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 za pomocą dodanego polecenia fastboot, które pobiera pełny obraz vendor_boot z urządzenia. Polecenie to wyświetli narzędzie do szybkiego rozruchu po stronie hosta, aby odczytało nagłówek rozruchowy dostawcy, zmodyfikował obraz i zainstalował nowy obraz.

Aby pobrać pełny obraz vendor_boot, dodano polecenie fetch:vendor_boot zarówno do protokołu szybkiego rozruchu, jak i jego implementacji w Androidzie 12. Jest on wprowadzony w ramach szybkiego rozruchu, ale sam program rozruchowy może nie działać. OEM może dodać polecenie 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ługiwaną przez dostawcę opcji.

Zmiany programu rozruchowego

Polecenia getvar:max-fetch-size i fetch:name są zaimplementowane w zadaniu fastbootd. Aby obsługiwać w programie rozruchowym flashowanie dysków Ramdy dostawcy, musisz zaimplementować 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. Kontroler nie może pobierać rozmiaru większego niż ta wartość.

fetch:name[:offset[:size]] wykonuje serię testów na urządzeniu. Jeśli są spełnione wszystkie te warunki, polecenie fetch:name[:offset[:size]] zwróci 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 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 jest tożsame z fetch:name:offset:(partition_size - offset)

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

Gdy offset lub partition_size (albo obie) są nieokreślone, używane są wartości domyślne, które dla offset to 0, a size to wartość obliczeniowa 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 jest powiązany z jego pełną definicją w tabeli poleceń Fastboots.

  • 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łuje funkcję fastboot fetch vendor_boot[_a]:offset:size w przypadku każdego fragmentu. Rozmiar fragmentu jest większy niż rozmiar vendor_boot, więc zwykle dostępny jest tylko 1 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 nagłówek wersja 3, działa tak:
      • Zastępuje dysk Ramdisk dostawcy danym obrazem.
      • Wyświetla nowy obraz vendor_boot.
    • Jeśli nagłówek rozruchowy dostawcy to wersja 4, wygląda to tak:
      • Zastępuje cały plik Ramdisk dostawcy danym obrazem, dzięki czemu podany obraz staje się jedynym fragmentem dysku ramdy dostawcy na obrazie 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 wartość nie zostanie znaleziona lub występuje wiele dopasowań, zwraca komunikat o błędzie.
      • 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 na potrzeby nazewnictwa fragmentów pamięci RAM dostawcy w Androidzie 12 i nowszych. Semantyka szybkiego rozruchu flash vendor_boot:default pozostaje taka sama, ale nie możesz nazwać fragmentów ramdisk jako default.

Zmiany w SELinux

W narzędziu fastbootd.te wprowadzono zmianę, która obsługuje flashowanie dysków RAM dostawców.