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 |
|
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 |
|
reboot fastboot |
Uruchamia się ponownie w: fastbootd . |
getvar is-userspace |
|
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 W przypadku obsługi A/B przedziały to zduplikowane zestawy partycji, które można uruchamiać niezależnie. Przedziały noszą nazwy |
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
Więcej informacji: |
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
Więcej informacji znajdziesz w sekcji |
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 Więcej informacji: |
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:
Dodaj konto
fastbootd
do grupyPRODUCT_PACKAGES
w:device.mk
:PRODUCT_PACKAGES += fastbootd
.Upewnij się, że interfejsy HAL szybkiego rozruchu, HAL kontroli rozruchu i HAL stanu są zawarte w pakiecie obrazu przywracania.
Dodaj wszelkie uprawnienia SEPolicy właściwe dla urządzenia wymagane przez system
fastbootd
. Na przykładfastbootd
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 funkcjifetch:name:0
, która jest odpowiednikiemfetch:name:0:partition_size
.fetch:name:offset
jest tożsame zfetch: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ż rozmiarvendor_boot
, więc zwykle dostępny jest tylko 1 fragment. - Łączy dane razem 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 został wywołanyfastboot 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
.
- Zastępuje cały plik Ramdisk dostawcy danym obrazem, dzięki czemu podany obraz staje się jedynym fragmentem dysku ramdy dostawcy na obrazie
- Jeśli rozruch dostawcy to nagłówek wersja 3, działa tak:
fastboot flash vendor_boot:foo vendor-ramdisk.img
Pobiera element
vendor_boot image
, tak jakby został wywołanyfastboot 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
.
- Znajduje fragment pamięci RAM dostawcy o nazwie
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.