Android 10 obsługuje partycje dynamiczne, czyli system partycjonowania przestrzeni użytkownika, który może tworzyć, zmieniać rozmiar i usuwać partycje podczas aktualizacji bezprzewodowych (OTA).
Na tej stronie opisujemy, jak zmieniać rozmiar partycji dynamicznych podczas aktualizacji na urządzeniach A/B z obsługą partycji dynamicznych, na których działa Android 9 lub starsza wersja.
Tło
Na urządzeniu jest 1 partycja super
. Ta partycja nie ma sufiksu przedziału. Urządzenie blokujące musi istnieć wraz z wpisem blk_device
dla /misc
w fstab
. Jeśli na przykład plik fstab
zawiera:
/dev/block/bootdevice/by-name/misc /misc # Other fields
W tym celu w pliku /dev/block/bootdevice/by-name/super
musi istnieć urządzenie blokowe dla super
, ale partycja super
nie musi być wymieniona w pliku fstab
.
W partycji super
znajdują się 2 miejsca na metadane o numerach 0 i 1 odpowiadające miejscom A/B w przypadku partycji. Na tej stronie gniazda metadanych mają nazwy Metadane S (źródło) i Metadane T (miejsce docelowe). Podobnie partycje są nazywane system_s
, vendor_t
itd.
Przed uaktualnieniem Metadata S zawiera informacje o używanych partycjach dynamicznych (zazwyczaj system_s
, vendor_s
, product_s
itd.). Podczas aktualizacji system odczytuje zakresy tych partycji, więc nie można ich usunąć.
Partycje należą do grup aktualizacji. Więcej informacji znajdziesz w artykule Wdrażanie dynamicznych partycji.
Przykład metadanych na urządzeniu:
- Metadane 0
- Grupa
foo_a
- Partycja
system_a
- Partycja
product_services_a
- Inne partycje zaktualizowane przez Foo
- Partycja
- Pasek grupy_a
- Partycja
vendor_a
- Partycja
product_a
- Inne partycje zaktualizowane przez słupek
- Partycja
- Grupa
foo_b
(pozostałości po poprzedniej aktualizacji) - Grupa
bar_b
(pozostałości po poprzedniej aktualizacji)
- Grupa
- Metadane 1
- Grupa
foo_a
(pozostałości po poprzedniej aktualizacji) - Grupa
bar_a
(pozostałości po poprzednim uaktualnieniu) - Grupa
foo_b
- Partycja
system_b
- Partycja
product_services_b
- Inne partycje zaktualizowane przez Foo
- Partycja
- Grupa
bar_b
- Partycja
vendor_b
- Partycja:
product_b
- Inne partycje zaktualizowane przez Bar
- Partycja
- Grupa
Aby wyodrębnić metadane na urządzeniu, możesz użyć narzędzia lpdump
(kod źródłowy w system/extras/partition_tools
). Na przykład:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
Aktualizowanie procesu
- Inicjalizowanie metadanych partycji
super
.- Wczytaj zakresy źródłowych partycji dynamicznych z metadanych S. Niech M będzie wartością wczytanych metadanych.
-
Usuń grupy docelowe i partycje docelowe (np.
foo_t
,bar_t
) z grupy M, tak aby zawierała tylko partycje i grupy z przyrostkiem_s
. -
Dodaj grupy docelowe i partycje zgodnie z polem
dynamic_partition_metadata
w zaktualizowanym pliku manifestu.
Rozmiar każdej partycji znajdziesz tutaj:new_partition_info
. - Zapisz M w metadanych T.
- W mapierze urządzenia mapuj dodane partycje jako umożliwiające zapis.
- Zastosuj aktualizację na urządzeniach blokujących.
- W razie potrzeby mapuj partycje źródłowe w mapierze urządzenia jako partycje tylko do odczytu. Jest to konieczne do sideloadowania, ponieważ partycje źródłowe nie są mapowane przed aktualizacją.
- Zastosuj pełną lub różnicową aktualizację do wszystkich urządzeń blokowych w docelowym gnieździe.
- Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
- Usuń mapowanie partycji docelowych.
Przed i po aktualizacji te właściwości systemu powinny mieć odpowiednie wartości:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Dodawanie grup i partycji do pliku manifestu aktualizacji
Podczas przeprowadzania aktualizacji OTA na urządzeniu A/B z dymami partycjami lub na urządzeniu A/B, które obsługuje dynamiczne partycje, musisz dodać grupy i partycje do pliku manifestu aktualizacji. Fragment kodu poniżej zawiera dodatkowe informacje o pliku manifestu aktualizacji, który obsługuje partycje dynamiczne. Szczegółową dokumentację każdego pola znajdziesz na stronie update_metadata.proto.
message DeltaArchiveManifest { optional DynamicPartitionMetadata dynamic_partition_metadata; } message DynamicPartitionMetadata { repeated DynamicPartitionGroup groups; } message DynamicPartitionGroup { required string name; optional uint64 size; // maximum size of group repeated string partition_names; }