Android 10 obsługuje partycje dynamiczne – system partycjonowania przestrzeni użytkownika, który umożliwia tworzenie, zmianę rozmiaru i niszczenie partycji podczas aktualizacji OTA.
Na tej stronie opisano, jak zmienić rozmiar partycji dynamicznych podczas aktualizacji dla urządzeń A/B, które zostały uruchomione z obsługą partycji dynamicznych, dla urządzeń z systemem Android 9 i starszym .
Tło
Na urządzeniu jest jedna super
partycja. Ta partycja nie ma przyrostka gniazda. Urządzenie blokowe musi istnieć wraz z wpisem blk_device
dla /misc
w fstab
. Na przykład, jeśli plik fstab
zawiera listę:
/dev/block/bootdevice/by-name/misc /misc # Other fields
Wtedy urządzenie blokowe dla super
musi istnieć w /dev/block/bootdevice/by-name/super
, ale super
partycja nie musi być wymieniona w pliku fstab
.
W super
partycji znajdują się dwa miejsca na metadane , ponumerowane 0 i 1, odpowiadające slotom A/B dla partycji. Na tej stronie przedziały metadanych nazywane są Metadane S (źródło) i Metadane T (cel). Podobnie partycje są określane jako system_s
, vendor_t
i tak dalej.
Przed aktualizacją Metadane S zawierają informacje o używanych partycjach dynamicznych (zazwyczaj system_s
, vendor_s
, product_s
itd.). System odczytuje zasięgi tych partycji podczas aktualizacji, więc nie można ich usunąć.
Partycje należą do grup aktualizacji . Aby uzyskać szczegółowe informacje, zobacz Implementowanie partycji dynamicznych .
Przykład metadanych na urządzeniu jest następujący.
- Metadane 0
- Grupa
foo_a
-
system_a
partycji_a - Podziel
product_services_a
na partycje - Inne partycje zaktualizowane przez Foo
-
- Pasek grupowy_a
-
vendor_a
partycji_a -
product_a
partycji_a - Inne partycje zaktualizowane przez Bar
-
- Grupa
foo_b
(pozostałość z poprzedniej aktualizacji) - Grupa
bar_b
(pozostałość z poprzedniej aktualizacji)
- Grupa
- Metadane 1
- Grupa
foo_a
(pozostałość z poprzedniej aktualizacji) - Grupa
bar_a
(pozostałość z poprzedniej aktualizacji) - Grupa
foo_b
-
system_b
partycji_b - Podziel
product_services_b
na partycje - Inne partycje zaktualizowane przez Foo
-
-
bar_b
grupowy_b-
vendor_b
partycji_b - Podziel
product_b
- Inne partycje zaktualizowane przez Bar
-
- Grupa
Możesz użyć narzędzia lpdump
(kod źródłowy w system/extras/partition_tools
), aby zrzucić metadane na swoje urządzenie. Na przykład:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
Aktualizuj przepływ
- Zainicjuj metadane
super
partycji.- Załaduj zakresy źródłowych partycji dynamicznych z Metadanych S. Niech M będzie załadowanymi metadanymi.
- Usuń grupy docelowe i partycje (na przykład
foo_t
,bar_t
) z M, tak aby M zawierał tylko partycje i grupy z przyrostkiem_s
. - Dodaj grupy docelowe i partycje zgodnie z polem
dynamic_partition_metadata
w manifeście aktualizacji.
Rozmiar każdej partycji można znaleźć wnew_partition_info
. - Zapisz M do Metadanych T.
- Zamapuj dodane partycje w programie mapującym urządzenia jako nadające się do zapisu.
- Zastosuj aktualizację na urządzeniach blokowych.
- Jeśli to konieczne, zamapuj partycje źródłowe w programie mapującym urządzenia jako tylko do odczytu. Jest to konieczne w przypadku ładowania bocznego, ponieważ partycje źródłowe nie są mapowane przed aktualizacją.
- Zastosuj aktualizację pełną lub delta do wszystkich urządzeń blokowych w gnieździe docelowym.
- Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
- Odmapuj partycje docelowe.
Przed i po aktualizacji następujące właściwości systemu powinny mieć odpowiednie wartości:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Dodaj grupy i partycje do manifestu aktualizacji
Podczas wykonywania aktualizacji OTA na urządzeniu A/B z partycjami dynamicznymi lub urządzeniu A/B, które dodaje obsługę partycji dynamicznych, należy dodać grupy i partycje do manifestu aktualizacji. Poniższy fragment przedstawia dodatkowe informacje na temat manifestu aktualizacji dotyczącego obsługi partycji dynamicznych. Szczegółową dokumentację dotyczącą każdego pola można znaleźć 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; }