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 sposób zmiany rozmiaru 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 przyrostka slotu. 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 partycjach. 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
- Grupa bar_a
- Partycja
vendor_a
- Partycja
product_a
- Inne partycje zaktualizowane przez Bar
- 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 poprzedniej aktualizacji) - 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
). Przykład:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
Aktualizowanie przepływu
- Inicjalizowanie metadanych partycji
super
.- Załaduj zakresy źródłowych partycji dynamicznych z poziomu metadanych. Niech M będą wczytanymi metadanymi.
-
Usuń grupy docelowe i partycje docelowe (np.
foo_t
,bar_t
) z grupy M, tak aby zawierała tylko partycje i grupy z sufiksem_s
. -
Dodaj grupy docelowe i partycje zgodnie z polem
dynamic_partition_metadata
w zaktualizowanym pliku manifestu.
Rozmiar każdej partycji można sprawdzić wnew_partition_info
. - Zapisz M do metadanych T.
- Mapuj dodane partycje w Device Mapper jako partycje do zapisu.
- Zastosuj aktualizację na urządzeniach z blokadą.
- W razie potrzeby mapuj partycje źródłowe w Device Mapper jako 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.
- Odmapuj partycje docelowe.
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 dodaje obsługę dynamicznych partycji, musisz dodać grupy i partycje do pliku manifestu aktualizacji. Fragment kodu poniżej zawiera dodatkowe informacje o pliku manifestu aktualizacji, które umożliwiają obsługę partycji dynamicznych. Szczegółowe informacje o każdym polu znajdziesz w pliku 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; }