W systemie Android 12 ogólny obraz boot
, określany jako Generic Kernel Image (GKI) , zawiera ogólny ramdysk i jądro GKI.
W przypadku urządzeń uruchamianych z systemem Android 13 ogólny ramdysk jest usuwany z obrazu boot
i umieszczany w osobnym obrazie init_boot
. Ta zmiana pozostawia obraz boot
tylko z jądrem GKI.
W przypadku uaktualniania urządzeń, które nadal korzystają z systemu Android 12 lub starszych wersji jądra, ogólny ramdysk pozostaje tam, gdzie był, bez konieczności tworzenia nowego obrazu init_boot
.
Aby zbudować ogólny ramdysk, przenieś zasoby specyficzne dla dostawcy poza ramdysk, tak aby ogólny ramdysk zawierał tylko init
pierwszego etapu i plik właściwości, który zawiera informacje o znaczniku czasu.
Na urządzeniach, które:
Nie używaj dedykowanej partycji
recovery
, wszystkie bity odzyskiwania są przenoszone z ogólnego ramdysku do ramdyskuvendor_boot
.Należy używać dedykowanej partycji
recovery
, nie ma potrzeby wprowadzania zmian w ramdyskurecovery
, ponieważ ramdyskrecovery
jest samowystarczalny.
Architektura
Poniższe diagramy ilustrują architekturę urządzeń z systemem Android 12 lub nowszym. Urządzenie uruchamiane z systemem Android 13 ma nowy obraz init_boot
zawierający ogólny ramdysk. Urządzenia aktualizowane z Androida 12 na Androida 13 korzystają z tej samej architektury, co w przypadku Androida 12.
Uruchom z Androidem 13, bez dedykowanego odzyskiwania
Rysunek 1. Urządzenia uruchamiające się lub aktualizujące do Androida 13, z GKI, bez dedykowanego odzyskiwania
Uruchom z Androidem 13, dedykowanym odzyskiwaniem i A/B (dedykowany ramdysk)
Rysunek 2. Urządzenia uruchamiające się lub aktualizujące do Androida 13, z GKI, dedykowanym i odzyskiwaniem A/B
Zapoznaj się z tym rysunkiem, jeśli urządzenie ma partycje recovery_a
i recovery_b
.
Uruchom z systemem Android 13, odzyskiwaniem dedykowanym i innym niż A/B (dedykowany ramdysk)
Rysunek 3. Urządzenia uruchamiające się lub aktualizujące do Androida 13, z GKI, dedykowanym i innym niż A/B odzyskiwaniem
Zapoznaj się z tym rysunkiem, jeśli urządzenie ma partycję o nazwie recovery
bez przyrostka gniazda.
Uruchom lub zaktualizuj do Androida 12, bez dedykowanego odzyskiwania
Rysunek 4. Urządzenia uruchamiające się lub aktualizujące do Androida 12, z GKI, bez dedykowanego odzyskiwania
Uruchom lub zaktualizuj do Androida 12, dedykowane odzyskiwanie i A/B (dedykowany ramdysk)
Rysunek 5. Urządzenia uruchamiające się lub aktualizujące do Androida 12, z GKI, dedykowanym i odzyskiwaniem A/B
Zapoznaj się z tym rysunkiem, jeśli urządzenie ma partycje recovery_a
i recovery_b
.
Uruchom lub zaktualizuj do Androida 12, dedykowane i inne niż A/B odzyskiwanie (dedykowany ramdysk)
Rysunek 6. Urządzenia uruchamiające się lub aktualizujące do Androida 12, z GKI, dedykowanym i innym niż A/B odzyskiwaniem
Zapoznaj się z tym rysunkiem, jeśli urządzenie ma partycję o nazwie recovery
bez przyrostka gniazda.
Uaktualnij do Androida 12, odzyskiwanie jako rozruch (odzyskiwanie jako ramdisk)
Rysunek 7. Aktualizacja urządzeń do Androida 12, bez GKI, odzyskiwanie jako rozruch
Uaktualnij do Androida 12, dedykowane odzyskiwanie (dedykowany ramdysk)
Rysunek 8. Aktualizacja urządzeń do Androida 12, bez GKI, dedykowane odzyskiwanie
Zawartość obrazów rozruchowych
Obrazy rozruchowe systemu Android zawierają następujące elementy.
Dodany obraz
init_boot
dla urządzeń uruchamianych z systemem Android 13- Wersja nagłówka V4
- Ogólny obraz ramdysku
Ogólny obraz
boot
- Wersja nagłówka V3 lub V4
-
boot_signature
dla certyfikacji GKI boot.img (tylko v4). Certyfikowany plikboot.img
nie jest podpisany w celu zweryfikowania rozruchu. Producenci OEM muszą nadal podpisywać wstępnie utworzonyboot.img
kluczem AVB specyficznym dla urządzenia. - Ogólna
cmdline
poleceń (GENERIC_KERNEL_CMDLINE
) - Jądro GKI
-
- Ogólny obraz ramdysku
- Zawarte tylko w obrazach
boot
Android 12 i wcześniejszych
- Zawarte tylko w obrazach
- Wersja nagłówka V3 lub V4
obraz
vendor_boot
(aby uzyskać szczegółowe informacje, zobacz Partycje rozruchowe dostawcy )- nagłówek
vendor_boot
-
BOARD_KERNEL_CMDLINE
cmdline
-
- obraz ramdysku
vendor_boot
-
lib/modules
- Zasoby odzyskiwania (jeśli nie ma dedykowanego odzyskiwania)
-
- obraz
dtb
- nagłówek
obraz
recovery
- Wersja nagłówka V2
-
cmdline
specyficzne dla urządzenia do odzyskiwania, jeśli to konieczne - W przypadku partycji odzyskiwania innej niż A/B zawartość nagłówka musi być samodzielna; zobacz Obrazy odzyskiwania . Na przykład:
- Polecenie
cmdline
nie jest połączone z poleceniemboot
ivendor_boot
cmdline
. - Nagłówek określa odzyskiwanie DTBO, jeśli to konieczne.
- W przypadku partycji odzyskiwania A/B zawartość może być łączona lub wywnioskowana na podstawie
boot
ivendor_boot
. Na przykład: - Polecenie
cmdline
jest połączone z poleceniemboot
ivendor_boot
cmdline
. - DTBO można wywnioskować z nagłówka
vendor_boot
.
-
-
recovery
obrazu ramdysku- Zasoby odzyskiwania
- W przypadku partycji odzyskiwania innej niż A/B zawartość ramdysku musi być samodzielna; zobacz Obrazy odzyskiwania . Na przykład:
-
lib/modules
musi zawierać wszystkie moduły jądra wymagane do uruchomienia trybu odzyskiwania - Ramdysk odzyskiwania musi zawierać
init
. - W przypadku partycji odzyskiwania A/B ramdysk odzyskiwania jest poprzedzony ramdyskiem generic i
vendor_boot
, dlatego nie musi być samodzielny. Na przykład: -
lib/modules
może zawierać tylko dodatkowe moduły jądra wymagane do trybu odzyskiwania systemu, poza modułami jądra w ramdyskuvendor_boot
. - Dowiązanie symboliczne w
/init
może istnieć, ale jest przyćmione przez plik binarny/init
pierwszego etapu w obrazie rozruchowym.
- Wersja nagłówka V2
Ogólna zawartość obrazu ramdysku
Ogólny ramdysk zawiera następujące składniki.
-
init
- Dodano
system/etc/ramdisk/build.prop
-
ro. PRODUCT .bootimg.* build
rekwizytów - Puste katalogi dla punktów montowania:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
-
first_stage_ramdisk/
- Zduplikowane puste katalogi dla punktów montowania:
debug_ramdisk/
,mnt/
,dev/
,sys/
,proc/
,metadata/
- Zduplikowane puste katalogi dla punktów montowania:
Integracja obrazu rozruchowego
Flagi kompilacji kontrolują sposób init_boot
, boot
, recovery
i vendor_boot
. Wartość zmiennej tablicy logicznej musi być ciągiem true
lub być pusta (co jest wartością domyślną).
TARGET_NO_KERNEL
. Ta zmienna wskazuje, czy kompilacja korzysta z gotowego obrazu rozruchowego. Jeśli ta zmienna ma wartośćtrue
, ustawBOARD_PREBUILT_BOOTIMAGE
na lokalizację gotowego obrazu rozruchowego (BOARD_PREBUILT_BOOTIMAGE:= device/${company}/${board}/boot.img
)BOARD_USES_RECOVERY_AS_BOOT
. Ta zmienna wskazuje, czy urządzenie używa obrazurecovery
jako obrazuboot
. Podczas korzystania z GKI ta zmienna jest pusta i zasoby odzyskiwania należy przenieść dovendor_boot
.BOARD_USES_GENERIC_KERNEL_IMAGE
. Ta zmienna wskazuje, że płyta używa GKI. Ta zmienna nie wpływa na sysprops ani naPRODUCT_PACKAGES
.To jest przełącznik GKI na poziomie płyty; wszystkie wymienione poniżej zmienne są ograniczone przez tę zmienną.
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
. Ta zmienna kontroluje, czy zasoby odzyskiwania ramdysku są zbudowane navendor_boot
.Gdy ustawione na
true
, zasoby odzyskiwania są budowane tylko navendor-ramdisk/
, a nie narecovery/root/
.Gdy jest pusty, zasoby odzyskiwania są zbudowane tylko do
recovery/root/
, a nie dovendor-ramdisk/
.
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT
. Ta zmienna kontroluje, czy klucze GSI AVB są tworzone dlavendor_boot
.Po ustawieniu na
true
, jeśliBOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT
:Jest ustawione, klucze GSI AVB są budowane w
$ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/avb
.Nie jest ustawiona, klucze GSI AVB są tworzone na
$ANDROID_PRODUCT_OUT/vendor-ramdisk/avb
.
Gdy jest pusty, jeśli
BOARD_RECOVERY_AS_ROOT
:Jest ustawione, klucze GSI AVB są zbudowane na
$ANDROID_PRODUCT_OUT/recovery/root/first_stage_ramdisk/avb
.Nie jest ustawiona, klucze GSI AVB są zbudowane w
$ANDROID_PRODUCT_OUT/ramdisk/avb
.
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE
. Ta zmienna kontroluje, czy obrazrecovery
zawiera jądro, czy nie. Urządzenia uruchamiane z systemem Android 12 i korzystające z partycjirecovery
A/B muszą ustawić tę zmienną natrue
. Urządzenia uruchamiane z systemem Android 12 i korzystające z systemów innych niż A/B muszą ustawić tę zmienną na wartośćfalse
, aby zachować samodzielność obrazu odzyskiwania.BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES
. Ta zmienna kontroluje, czy$OUT/boot*.img
jest kopiowany doIMAGES/
pod plikami docelowymi.aosp_arm64
musi ustawić tę zmienną natrue
.Inne urządzenia muszą pozostawić tę zmienną pustą.
BOARD_INIT_BOOT_IMAGE_PARTITION_SIZE
. Ta zmienna kontroluje, czyinit_boot.img
jest generowany i ustawia rozmiar. Po ustawieniu ogólny ramdysk jest dodawany doinit_boot.img
zamiastboot.img
i wymaga ustawienia zmiennychBOARD_AVB_INIT_BOOT*
dla połączonego vbmeta
Dozwolone kombinacje
Składnik lub zmienna | Aktualizacja urządzenia bez partycji recovery | Aktualizacja urządzenia z partycją recovery | Uruchom urządzenie bez partycji recovery | Uruchom urządzenie z partycją recovery A/B | Uruchom urządzenie z partycją recovery innej niż A/B | aosp_arm64 |
---|---|---|---|---|---|---|
Zawiera boot | tak | tak | tak | tak | tak | tak |
Zawiera init_boot (Android 13) | nie | nie | nie | tak | tak | tak |
Zawiera vendor_boot | opcjonalny | opcjonalny | tak | tak | tak | nie |
Zawiera recovery | nie | tak | nie | tak | tak | nie |
BOARD_USES_RECOVERY_AS_BOOT | true | pusty | pusty | pusty | pusty | pusty |
BOARD_USES_GENERIC_KERNEL_IMAGE | pusty | pusty | true | true | true | true |
PRODUCT_BUILD_RECOVERY_IMAGE | pusty | true czy pusta | pusty | true czy pusta | true czy pusta | pusty |
BOARD_RECOVERYIMAGE_PARTITION_SIZE | pusty | > 0 | pusty | > 0 | > 0 | pusty |
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT | pusty | pusty | true | pusty | pusty | pusty |
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT | pusty | pusty | true | true | true | pusty |
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE | pusty | pusty | pusty | true | pusty | pusty |
BOARD_COPY_BOOT_IMAGE_TO_TARGET_FILES | pusty | pusty | pusty | pusty | pusty | true |
Urządzenia z dedykowaną partycją recovery
mogą ustawić dla PRODUCT_BUILD_RECOVERY_IMAGE
wartość true
lub pustą. W przypadku tych urządzeń, jeśli ustawiono BOARD_RECOVERYIMAGE_PARTITION_SIZE
, tworzony jest obraz recovery
.
Włącz połączoną vbmetę do rozruchu
Połączona vbmeta musi być włączona dla obrazów boot
i init_boot
. Określ następujące elementy:
BOARD_AVB_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa4096.pem
BOARD_AVB_BOOT_ALGORITHM := SHA256_RSA4096
BOARD_AVB_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_BOOT_ROLLBACK_INDEX_LOCATION := 2
BOARD_AVB_INIT_BOOT_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
BOARD_AVB_INIT_BOOT_ALGORITHM := SHA256_RSA2048
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
BOARD_AVB_INIT_BOOT_ROLLBACK_INDEX_LOCATION := 3
Aby zapoznać się z przykładem, zapoznaj się z tą zmianą .
System jako root
System jako root nie jest obsługiwany w przypadku urządzeń korzystających z GKI. Na takich urządzeniach BOARD_BUILD_SYSTEM_ROOT_IMAGE
musi być puste. System jako główny również nie jest obsługiwany w przypadku urządzeń korzystających z partycji dynamicznych.
Konfiguracje produktów
Urządzenia korzystające z ogólnego ramdysku muszą zainstalować listę plików, które mogą być zainstalowane na ramdysku. Aby to zrobić, określ następujące dane w device.mk
:
$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
Plik generic_ramdisk.mk
zapobiega również przypadkowemu instalowaniu innych plików na ramdysku przez inne pliki makefile (przenieś takie pliki do vendor_ramdisk
).
Konfigurowanie urządzeń
Instrukcje konfiguracji różnią się w zależności od urządzeń uruchamianych z systemem Android 13, aktualizowanych do systemu Android 12 i uruchamianych z systemem Android 12. System Android 13 jest skonfigurowany podobnie jak w przypadku systemu Android 12
Aktualizacja urządzeń do Androida 12:
Może zachować wartość
BOARD_USES_RECOVERY_AS_BOOT
. Jeśli to zrobią, używają starszych konfiguracji, a nowe zmienne kompilacji muszą być puste. Jeśli takie urządzenia:Można ustawić
BOARD_USES_RECOVERY_AS_BOOT
na pustą. Jeśli to zrobią, używają nowych konfiguracji. Jeśli takie urządzenia:Nie używaj dedykowanej partycji
recovery
, architektura jest taka, jak pokazano na rysunku 1 , a opcja konfiguracji urządzenia to Opcja 1 .Użyj dedykowanej partycji
recovery
, architektura jest pokazana na Rysunku 2a lub Rysunku 2b , a opcja konfiguracji urządzenia to Opcja 2a lub Opcja 2b .
Urządzenia uruchamiane z Androidem 12 muszą ustawić
BOARD_USES_RECOVERY_AS_BOOT
na puste i używać nowych konfiguracji. Jeśli takie urządzenia:Nie używaj dedykowanej partycji
recovery
, architektura jest taka, jak pokazano na rysunku 1 , a opcja konfiguracji urządzenia to Opcja 1 .Użyj dedykowanej partycji
recovery
, architektura jest pokazana na Rysunku 2a lub Rysunku 2b , a opcja konfiguracji urządzenia to Opcja 2a lub Opcja 2b .
Ponieważ aosp_arm64
buduje tylko GKI (a nie vendor_boot
ani recovery), nie jest kompletnym celem. W przypadku konfiguracji kompilacji aosp_arm64
zapoznaj się z generic_arm64
.
Opcja 1: Brak dedykowanej partycji odzyskiwania
Urządzenia bez partycji recovery
zawierają ogólny obraz boot
na partycji boot
. vendor_boot
zawiera wszystkie zasoby odzyskiwania, w tym lib/modules
(z modułami jądra dostawcy). Na takich urządzeniach konfiguracja produktu dziedziczy z generic_ramdisk.mk
.
Ustawianie wartości BOARD
Ustaw następujące wartości:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Pliki binarne inicjujące i dowiązania symboliczne
vendor_boot
może zawierać dowiązanie symboliczne /init
do /system/bin/init
oraz init_second_stage.recovery
w /system/bin/init
. Jednakże, ponieważ ogólny ramdysk jest łączony po ramdysku vendor_boot
, dowiązanie symboliczne /init
jest zastępowane. Gdy urządzenie uruchamia się w trybie odzyskiwania, plik binarny /system/bin/init
jest potrzebny do obsługi inicjowania drugiego etapu. Zawartość vendor_boot
+ ramdysk generycznych jest następująca:
-
/init
(z ogólnego ramdysku, zbudowany zinit_first_stage
) -
/system/bin/init
(zvendor_ramdisk
, zbudowany zinit_second_stage.recovery
)
Przenoszenie plików fstab
Przenieś wszystkie zainstalowane pliki fstab
na ogólny ramdysk do vendor_ramdisk
. Aby zapoznać się z przykładem, zapoznaj się z tą zmianą .
Instalowanie modułów
Jeśli chcesz, możesz zainstalować moduły specyficzne dla urządzenia na vendor_ramdisk
(pomiń ten krok, jeśli nie masz żadnych modułów specyficznych dla urządzenia do zainstalowania).
Użyj wariantu modułu
vendor_ramdisk
, gdy moduł jest instalowany na/first_stage_ramdisk
. Ten moduł powinien być dostępny po tym, jakinit
przełączy roota na/first_stage_ramdisk
ale zaniminit
przełączy roota na/system
. Aby zapoznać się z przykładami, zobacz Sumy kontrolne metadanych i Wirtualna kompresja A/B .Użyj wariantu
recovery
modułu, gdy moduł jest instalowany w/
. Ten moduł powinien być dostępny, zaniminit
przełączy root na/first_stage_ramdisk
. Aby uzyskać szczegółowe informacje na temat instalowania modułów w/
, zobacz Konsola pierwszego etapu .
Konsola pierwszego stopnia
Ponieważ konsola pierwszego etapu uruchamia się, zanim init
przełączy root na /first_stage_ramdisk
, musisz zainstalować moduły w wariancie recovery
. Domyślnie oba warianty modułów są instalowane w build/make/target/product/base_vendor.mk
, więc jeśli urządzenie makefile dziedziczy z tego pliku, nie musisz jawnie instalować wariantu recovery
.
Aby jawnie zainstalować moduły odzyskiwania, wykonaj następujące czynności.
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
Gwarantuje to, że linker
, sh
i toybox
zainstalowane w $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, który następnie zostanie zainstalowany w /system/bin
pod vendor_ramdisk
.
Aby dodać moduły potrzebne dla konsoli pierwszego stopnia (na przykład adbd), użyj następującego.
PRODUCT_PACKAGES += adbd.recovery
Gwarantuje to, że określone moduły zostaną zainstalowane w $ANDROID_PRODUCT_OUT/recovery/root/system/bin
, który następnie zostanie zainstalowany w /system/bin
pod vendor_ramdisk
.
Sumy kontrolne metadanych
Aby obsługiwać sumy kontrolne metadanych podczas pierwszego etapu montowania, urządzenia, które nie obsługują GKI, instalują wariant ramdysku następujących modułów. Aby dodać obsługę GKI, przenieś moduły do $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Aby zapoznać się z przykładem, zapoznaj się z tą listą zmian .
Wirtualna kompresja A/B
Aby obsługiwać wirtualną kompresję A/B, snapuserd
musi być zainstalowany na vendor_ramdisk
. Urządzenie powinno dziedziczyć po virtual_ab_ota/compression.mk
, który instaluje wariant vendor_ramdisk
snapuserd
.
Zmiany w procesie rozruchu
Proces uruchamiania do odzyskiwania lub do Androida nie zmienia się, z następującym wyjątkiem:
-
build.prop
przenosi się do/second_stage_resources
, abyinit
drugiego etapu mógł odczytać sygnaturę czasową kompilacji rozruchu.
Ponieważ zasoby są przenoszone z ogólnego ramdysku do ramdysku vendor_boot
, wynik połączenia ogólnego ramdysku z vendor_boot
nie ulega zmianie.
Udostępnianie e2fsck
Pliki makefile urządzenia mogą dziedziczyć z:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
, jeśli urządzenie obsługuje wirtualny A/B, ale nie obsługuje kompresji.virtual_ab_ota/compression.mk
, jeśli urządzenie obsługuje wirtualną kompresję A/B.
Pliki makefile produktu instalują $ANDROID_PRODUCT_OUT/vendor-ramdisk/first_stage_ramdisk/system/bin/e2fsck
. W czasie wykonywania init
pierwszego etapu przełącza root na /first_stage_ramdisk
a następnie wykonuje /system/bin/e2fsck
.
Opcja 2a: Dedykowana i partycja odzyskiwania A/B
Użyj tej opcji w przypadku urządzeń z partycjami recovery
A/B; oznacza to, że urządzenie ma recovery_b partition
recovery_a
i recovery_b . Do takich urządzeń należą urządzenia A/B i Virtual A/B, których partycję odzyskiwania można aktualizować, o następującej konfiguracji:
AB_OTA_PARTITIONS += recovery
vendor_boot
zawiera bity dostawcy ramdysku i modułów jądra dostawcy, w tym:
Pliki
fstab
specyficzne dla urządzenialib/modules
(zawiera moduły jądra dostawcy)
Ramdysk recovery
zawiera wszystkie zasoby odzyskiwania. Na takich urządzeniach konfiguracja produktu dziedziczy z generic_ramdisk.mk
.
Ustawianie wartości BOARD
Ustaw następujące wartości dla urządzeń z partycją recovery
A/B:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Pliki binarne inicjujące i dowiązania symboliczne
Ramdysk recovery
może zawierać dowiązanie symboliczne /init -> /system/bin/init
oraz init_second_stage.recovery
w /system/bin/init
. Jednak ponieważ ramdysk rozruchowy jest łączony po ramdysku recovery
, dowiązanie symboliczne /init
jest zastępowane. Gdy urządzenie uruchamia się w trybie odzyskiwania, plik binarny /system/bin/init
jest potrzebny do obsługi inicjowania drugiego etapu.
Gdy urządzenie uruchamia się w trybie recovery
, zawartość recovery
+ vendor_boot
+ ogólnych ramdysków jest następująca:
-
/init
(z ramdysku, zbudowany zinit_first_stage
) -
/system/bin/init
(z ramdyskurecovery
, zbudowany zinit_second_stage.recovery
i wykonany z/init
)
Gdy urządzenie uruchamia się w systemie Android, zawartość vendor_boot
+ generycznych ramdysków wygląda następująco:
-
/init
(z ogólnego ramdysku, zbudowany zinit_first_stage
)
Przenoszenie plików fstab
Przenieś wszystkie zainstalowane pliki fstab
na ogólny ramdysk do vendor_ramdisk
. Aby zapoznać się z przykładem, zapoznaj się z tą zmianą .
Instalowanie modułów
Jeśli chcesz, możesz zainstalować moduły specyficzne dla urządzenia na vendor_ramdisk
(pomiń ten krok, jeśli nie masz żadnych modułów specyficznych dla urządzenia do zainstalowania). Init
nie przełącza roota. Wariant modułów vendor_ramdisk
jest instalowany w katalogu głównym vendor_ramdisk
. Aby zapoznać się z przykładami instalowania modułów na vendor_ramdisk
, zobacz Konsola pierwszego stopnia , Sumy kontrolne metadanych i Wirtualna kompresja A/B .
Konsola pierwszego stopnia
Aby zainstalować wariant vendor_ramdisk
, użyj następujących poleceń:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Gwarantuje to, że linker
, sh
i toybox
zainstalowane w $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, który następnie zostanie zainstalowany w /system/bin
pod vendor_ramdisk
.
Aby dodać moduły potrzebne dla konsoli pierwszego stopnia (na przykład adbd), włącz wariant vendor_ramdisk
tych modułów, przesyłając odpowiednie poprawki do AOSP, a następnie użyj następujących:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Zapewnia to, że określone moduły zostaną zainstalowane w $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
. Jeśli ramdysk vendor_boot
jest ładowany w trybie odzyskiwania, moduł jest również dostępny w trybie recovery
. Jeśli ramdysk vendor_boot
nie jest załadowany w trybie odzyskiwania, urządzenie może opcjonalnie zainstalować również adbd.recovery
.
Sumy kontrolne metadanych
Aby obsługiwać sumy kontrolne metadanych podczas pierwszego etapu montowania, urządzenia, które nie obsługują GKI, instalują wariant ramdysku następujących modułów. Aby dodać obsługę GKI, przenieś moduły do $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Aby zapoznać się z przykładem, zapoznaj się z tą listą zmian .
Wirtualna kompresja A/B
Aby obsługiwać kompresję Virtual A/B, snapuserd
musi być zainstalowany na vendor_ramdisk
. Urządzenie powinno dziedziczyć po virtual_ab_ota/compression.mk
, który instaluje wariant vendor_ramdisk
snapuserd
.
Zmiany w procesie rozruchu
Podczas uruchamiania systemu Android proces uruchamiania się nie zmienia. vendor_boot
+ ogólny ramdysk jest podobny do istniejącego procesu rozruchu, z wyjątkiem tego, że fstab
ładuje się z vendor_boot
. Ponieważ system/bin/recovery
nie istnieje, first_stage_init
obsługuje go jako normalny rozruch.
Podczas uruchamiania w trybie odzyskiwania zmienia się proces uruchamiania. Recovery + vendor_boot
+ ogólny ramdysk jest podobny do istniejącego procesu odzyskiwania, ale jądro jest ładowane z obrazu boot
zamiast z obrazu recovery
. Proces rozruchu w trybie odzyskiwania jest następujący.
Bootloader uruchamia się, a następnie wykonuje następujące czynności:
- Wypycha odzyskiwanie +
vendor_boot
+ ogólny ramdysk do/
. (Jeśli producent OEM duplikuje moduły jądra w ramdysku odzyskiwania, dodając je doBOARD_RECOVERY_KERNEL_MODULES
),vendor_boot
jest opcjonalny. - Uruchamia jądro z partycji
boot
.
- Wypycha odzyskiwanie +
Kernel montuje ramdysk do
/
, a następnie wykonuje/init
z ogólnego ramdysku.Rozpoczyna się pierwszy etap init, a następnie wykonuje następujące czynności:
- Ustawia
IsRecoveryMode() == true
iForceNormalBoot() == false
. - Ładuje moduły jądra dostawcy z
/lib/modules
. - Wywołuje
DoFirstStageMount()
ale pomija montowanie, ponieważIsRecoveryMode() == true
. (Urządzenie nie zwalnia ramdysku (ponieważ/
jest nadal takie samo), ale wywołujeSetInitAvbVersionInRecovery()
.) - Uruchamia init drugiego etapu z
/system/bin/init
z dyskurecovery
.
- Ustawia
Udostępnianie e2fsck
Pliki makefile urządzenia mogą dziedziczyć z:
virtual_ab_ota/launch_with_vendor_ramdisk.mk
, jeśli urządzenie obsługuje wirtualny A/B, ale nie obsługuje kompresji.virtual_ab_ota/compression.mk
, jeśli urządzenie obsługuje wirtualną kompresję A/B.
Pliki makefile produktu instalują $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin/e2fsck
. W czasie wykonywania init
pierwszego etapu wykonuje /system/bin/e2fsck
.
Opcja 2b: Dedykowana i nie-A/B partycja odzyskiwania
Użyj tej opcji w przypadku urządzeń z partycją recovery
innej niż A/B; oznacza to, że urządzenie ma partycję o nazwie recovery
bez sufiksu gniazda. Takie urządzenia obejmują:
- urządzenia inne niż A/B;
- Urządzenia A/B i Virtual A/B, których partycji odzyskiwania nie można aktualizować. (To niezwykłe.)
vendor_boot
zawiera bity dostawcy ramdysku i modułów jądra dostawcy, w tym:
- Pliki
fstab
specyficzne dla urządzenia -
lib/modules
(zawiera moduły jądra dostawcy)
Obraz recovery
musi być samowystarczalny. Musi zawierać wszystkie wymagane zasoby do uruchomienia trybu odzyskiwania, w tym:
- Obraz jądra
- Obraz DTBO
- Moduły jądra w
lib/modules
- Init pierwszego etapu jako dowiązanie symboliczne
/init -> /system/bin/init
- Binarny init drugiego stopnia
/system/bin/init
- Pliki
fstab
specyficzne dla urządzenia - Wszystkie inne zasoby odzyskiwania, w tym plik binarny
recovery
itp. - itp.
Na takich urządzeniach konfiguracja produktu dziedziczy z generic_ramdisk.mk
.
Ustawianie wartości BOARD
Ustaw następujące wartości dla urządzeń innych niż A/B:
BOARD_USES_RECOVERY_AS_BOOT :=
BOARD_USES_GENERIC_KERNEL_IMAGE := true
BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT :=
BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE :=
BOARD_MOVE_GSI_AVB_KEYS_TO_VENDOR_BOOT := true
Pliki binarne inicjujące i dowiązania symboliczne
Ramdysk recovery
musi zawierać dowiązanie symboliczne /init -> /system/bin/init
oraz init_second_stage.recovery
w /system/bin/init
. Gdy urządzenie uruchamia się w trybie odzyskiwania, plik binarny /system/bin/init
jest potrzebny do obsługi inicjowania zarówno pierwszego, jak i drugiego etapu.
Gdy urządzenie uruchamia się w trybie recovery
, zawartość ramdysków recovery
jest następująca:
-
/init -> /system/bin/init
(z dyskurecovery
) -
/system/bin/init
(z ramdyskurecovery
, zbudowany zinit_second_stage.recovery
i wykonany z/init
)
Gdy urządzenie uruchamia się w systemie Android, zawartość vendor_boot
+ generycznych ramdysków wygląda następująco:
-
/init
(z ramdysku, zbudowany zinit_first_stage
)
Przenoszenie plików fstab
Przenieś wszystkie zainstalowane pliki fstab
na ogólny ramdysk na vendor_ramdisk
i ramdysk recovery
. Aby zapoznać się z przykładem, zapoznaj się z tą zmianą .
Instalowanie modułów
Jeśli chcesz, możesz zainstalować moduły specyficzne dla urządzenia na vendor_ramdisk
i ramdysku recovery
(pomiń ten krok, jeśli nie masz żadnych modułów specyficznych dla urządzenia do zainstalowania). init
nie przełącza roota. Wariant modułów vendor_ramdisk
jest instalowany w katalogu głównym vendor_ramdisk
. Wariant recovery
modułów jest instalowany w katalogu głównym ramdysku recovery
. Przykłady instalacji modułów na vendor_ramdisk
i ramdysku recovery
znajdują się w sekcji Konsola pierwszego stopnia i Sumy kontrolne metadanych .
Konsola pierwszego stopnia
Aby zainstalować wariant vendor_ramdisk
, użyj następujących poleceń:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
shell_and_utilities_vendor_ramdisk \
Gwarantuje to, że linker
, sh
i toybox
zainstalowane w $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
, który następnie zostanie zainstalowany w /system/bin
pod vendor_ramdisk
.
Aby dodać moduły potrzebne dla konsoli pierwszego stopnia (na przykład adbd), włącz wariant vendor_ramdisk
tych modułów, przesyłając odpowiednie poprawki do AOSP, a następnie użyj następujących:
PRODUCT_PACKAGES += adbd.vendor_ramdisk
Zapewnia to, że określone moduły zostaną zainstalowane w $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
.
Aby zainstalować wariant recovery
modułów, zamień vendor_ramdisk
na recovery
:
PRODUCT_PACKAGES += \
linker.recovery \
shell_and_utilities_recovery \
adbd.recovery \
Sumy kontrolne metadanych
Aby obsługiwać sumy kontrolne metadanych podczas pierwszego etapu montowania, urządzenia, które nie obsługują GKI, instalują wariant ramdysku następujących modułów. Aby dodać obsługę GKI, przenieś moduły do $ANDROID_PRODUCT_OUT/vendor-ramdisk/system/bin
:
PRODUCT_PACKAGES += \
linker.vendor_ramdisk \
resize2fs.vendor_ramdisk \
tune2fs.vendor_ramdisk \
Aby obsługiwać sumy kontrolne metadanych podczas pierwszego etapu montowania w odzyskiwaniu, włącz wariant odzyskiwania tych modułów i również je zainstaluj.
Zmiany w procesie rozruchu
Podczas uruchamiania systemu Android proces uruchamiania się nie zmienia. vendor_boot
+ ogólny ramdysk jest podobny do istniejącego procesu rozruchu, z wyjątkiem tego, że fstab
ładuje się z vendor_boot
. Ponieważ system/bin/recovery
nie istnieje, first_stage_init
obsługuje go jako normalny rozruch.
Podczas uruchamiania w trybie odzyskiwania proces uruchamiania się nie zmienia. Ramdysk odzyskiwania jest ładowany w taki sam sposób, jak istniejący proces odzyskiwania. Jądro jest ładowane z obrazu recovery
. Proces rozruchu w trybie odzyskiwania jest następujący.
Bootloader uruchamia się, a następnie wykonuje następujące czynności:
- Wypycha ramdysk odzyskiwania do
/
. - Uruchamia jądro z partycji
recovery
.
- Wypycha ramdysk odzyskiwania do
Kernel montuje ramdysk do
/
, a następnie wykonuje/init
, który jest dowiązaniem symbolicznym do/system/bin/init
z ramdyskurecovery
.Rozpoczyna się pierwszy etap init, a następnie wykonuje następujące czynności:
- Ustawia
IsRecoveryMode() == true
iForceNormalBoot() == false
. - Ładuje moduły jądra dostawcy z
/lib/modules
. - Wywołuje
DoFirstStageMount()
ale pomija montowanie, ponieważIsRecoveryMode() == true
. (Urządzenie nie zwalnia ramdysku (ponieważ/
jest nadal takie samo), ale wywołujeSetInitAvbVersionInRecovery()
.) - Uruchamia init drugiego etapu z
/system/bin/init
z dyskurecovery
.
- Ustawia
Sygnatury czasowe obrazu rozruchowego
Poniższy kod to przykładowy plik sygnatury czasowej obrazu boot
.
####################################
# from generate-common-build-props
# These properties identify this partition image.
####################################
ro.product.bootimage.brand=Android
ro.product.bootimage.device=generic_arm64
ro.product.bootimage.manufacturer=unknown
ro.product.bootimage.model=AOSP on ARM64
ro.product.bootimage.name=aosp_arm64
ro.bootimage.build.date=Mon Nov 16 22:46:27 UTC 2020
ro.bootimage.build.date.utc=1605566787
ro.bootimage.build.fingerprint=Android/aosp_arm64/generic_arm64:S/MASTER/6976199:userdebug/test-keys
ro.bootimage.build.id=MASTER
ro.bootimage.build.tags=test-keys
ro.bootimage.build.type=userdebug
ro.bootimage.build.version.incremental=6976199
ro.bootimage.build.version.release=11
ro.bootimage.build.version.release_or_codename=S
ro.bootimage.build.version.sdk=30
# Auto-added by post_process_props.py
persist.sys.usb.config=none
# end of file
W czasie kompilacji do ogólnego ramdysku dodawany jest plik
system/etc/ramdisk/build.prop
. Ten plik zawiera informacje o sygnaturze czasowej kompilacji.W czasie wykonywania
init
pierwszego etapu kopiuje pliki z ramdysku dotmpfs
przed zwolnieniem ramdysku, tak abyinit
drugiego etapu mógł odczytać ten plik i ustawić właściwości znacznika czasu obrazuboot
.