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ę fastboot i odzyskiwanie.
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 |
|
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 |
|
reboot fastboot | Uruchamia się ponownie w trybie fastbootd . |
getvar is-userspace |
|
getvar is-logical: <partition> | Zwraca wartość yes , jeśli podana partycja jest partycją logiczną, w przeciwnym wypadku 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 W przypadku obsługi A/B gniazda to zduplikowane zestawy partycji, z których można niezależnie uruchamiać system. Gniazda są nazywane |
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 Aby uzyskać szczegółowe informacje, zobacz |
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 Aby uzyskać szczegółowe informacje, zobacz |
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 Aby uzyskać szczegółowe informacje, zobacz |
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:
Dodaj
fastbootd
doPRODUCT_PACKAGES
wdevice.mk
:PRODUCT_PACKAGES += fastbootd
.Upewnij się, że warstwa HAL fastboot, warstwa HAL kontroli rozruchu i warstwa HAL kondycji są spakowane jako część obrazu odzyskiwania.
Dodaj wszelkie uprawnienia SEPolicy specyficzne dla urządzenia wymagane przez
fastbootd
. Na przykładfastbootd
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 bootloadera, flashowanie poszczególnych ramdysków dostawcy w trybie bootloadera 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żnefetch:name:0
, co jest równoważnefetch:name:0:partition_size
. -
fetch:name:offset
jest równoważnefetch: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ż rozmiarvendor_boot
, więc zwykle jest tylko jedna porcja.) - Łączy dane w całość do
out.img
.
- Wywołuje funkcję
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
.
- Zastępuje cały ramdysk dostawcy podanym obrazem, tak że dany obraz staje się jedynym fragmentem RAMdysku dostawcy w obrazie
- Jeśli boot dostawcy to wersja nagłówka 3 , wykonuje następujące czynności:
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
.
- Znajduje fragment ramdysku dostawcy o nazwie
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.