Android 10 supports dynamic partitions, a userspace partitioning system that can create, resize, and destroy partitions during over-the-air (OTA) updates.
Na tej stronie opisujemy, jak zmienić rozmiar partycji dynamicznych podczas aktualizacji urządzeń A/B, które zostały wprowadzone na rynek z obsługą partycji dynamicznych, oraz urządzeń z Androidem 9 lub starszym.
Tło
Na urządzeniu jest 1 partycja super. Ta
partycja nie ma sufiksu slotu. Urządzenie blokowe 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
urządzenie blokowe dla super musi znajdować się w
/dev/block/bootdevice/by-name/super, ale partycja
super nie musi być wymieniona w pliku
fstab.
W partycji super znajdują się 2
sloty metadanych o numerach 0 i 1, które odpowiadają
slotom A/B dla partycji. Na tej stronie sloty metadanych są
nazywane Metadane S (źródłowe) i Metadane T (docelowe). Podobnie,
partycje są określane jako system_s,
vendor_t, itd.
Przed aktualizacją Metadane S zawierają informacje o używanych partycjach dynamicznych (zwykle system_s, vendor_s, product_s, itp.). 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 Implementowanie partycji dynamicznych.
Oto przykład metadanych na urządzeniu.
- Metadane 0
- Grupa
foo_a- Partycja
system_a - Partycja
product_services_a - Inne partycje aktualizowane przez Foo
- Partycja
- Grupa bar_a
- Partycja
vendor_a - Partycja
product_a - Inne partycje aktualizowane przez Bar
- Partycja
- Grupa
foo_b(pozostałość po poprzedniej aktualizacji) - Grupa
bar_b(pozostałość po poprzedniej aktualizacji)
- Grupa
- Metadane 1
- Grupa
foo_a(pozostałość po poprzedniej aktualizacji) - Grupa
bar_a(pozostałość po poprzedniej aktualizacji) - Grupa
foo_b- Partycja
system_b - Partycja
product_services_b - Inne partycje aktualizowane przez Foo
- Partycja
- Grupa
bar_b- Partycja
vendor_b - Partycja
product_b - Inne partycje aktualizowane przez Bar
- Partycja
- Grupa
Aby zrzucić 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/superlpdump --slot 1 /dev/block/bootdevice/by-name/super
Proces aktualizacji
- Zainicjuj metadane partycji
super- Wczytaj zakresy źródłowych partycji dynamicznych z Metadanych S. Niech M będą wczytanymi metadanymi.
-
Usuń z M grupy i partycje docelowe (np.
foo_t,bar_t), aby M zawierały tylko partycje i grupy z sufiksem_s. -
Dodaj grupy i partycje docelowe zgodnie z polem
dynamic_partition_metadataw manifeście aktualizacji.
Rozmiar każdej partycji znajdziesz wnew_partition_info. - Zapisz M w Metadanych T.
- Zmapuj dodane partycje w mapowaniu urządzeń jako zapisywalne.
- Zastosuj aktualizację na urządzeniach blokowych.
- W razie potrzeby zmapuj partycje źródłowe w mapowaniu urządzeń jako tylko do odczytu. Jest to konieczne w przypadku wczytywania z boku, ponieważ partycje źródłowe nie są mapowane przed aktualizacją.
- Zastosuj pełną lub przyrostową aktualizację do wszystkich urządzeń blokowych w slocie docelowym.
- Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
- Odmapuj partycje docelowe.
Przed aktualizacją i po niej 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 manifestu aktualizacji
Podczas przeprowadzania aktualizacji OTA na urządzeniu A/B z partycjami dynamicznymi, lub na urządzeniu A/B, które dodaje obsługę partycji dynamicznych, musisz dodać grupy i partycje do manifestu aktualizacji. Poniższy fragment kodu zawiera dodatkowe informacje w manifeście aktualizacji dotyczące obsługi partycji dynamicznych. Szczegółową dokumentację każdego pola znajdziesz w 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;
}