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, które zostały wprowadzone na rynek z obsługą partycji dynamicznych, oraz na urządzeniach z Androidem 9 i starszym.
Tło
Na urządzeniu jest 1 partycja super. Ten
podział nie ma sufiksu w postaci 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
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 super partycji znajdują się 2 gniazda metadanych o numerach 0 i 1, które odpowiadają gniazdom A/B dla partycji. Na tej stronie gniazda metadanych są nazywane Metadane S (źródło) i Metadane T (miejsce docelowe). Podobnie partycje są oznaczane jako system_s, vendor_t itd.
Przed uaktualnieniem metadane S zawierają informacje o używanych partycjach dynamicznych (zwykle system_s, vendor_s, product_s itd.). System odczytuje zakresy tych partycji podczas aktualizacji, więc nie można ich usunąć.
Partycje należą do grup aktualizacji. Więcej informacji znajdziesz w artykule Wdrażanie dynamicznych partycji.
Przykładowe metadane na urządzeniu:
- Metadane 0
- Grupa
foo_a- Partycja
system_a - Partycja
product_services_a - Inne partycje zaktualizowane przez Foo
- Partycja
- Group bar_a
- Partycja
vendor_a - Partycja
product_a - Inne partycje zaktualizowane 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 zaktualizowane przez Foo
- Partycja
- Grupa
bar_b- Partycja
vendor_b - Partycja
product_b - Inne partycje zaktualizowane przez Bar
- Partycja
- Grupa
Możesz użyć narzędzia lpdump (kod źródłowy w system/extras/partition_tools), aby zrzucić metadane na urządzeniu. Na przykład:
lpdump --slot 0 /dev/block/bootdevice/by-name/superlpdump --slot 1 /dev/block/bootdevice/by-name/super
Aktualizowanie przepływu
- Zainicjuj metadane partycji
super.- Wczytaj zakresy źródłowych partycji dynamicznych z metadanych S. Niech M będą wczytanymi metadanymi.
-
Usuń z M grupy docelowe i podziały (np.
foo_t,bar_t), tak aby M zawierało tylko podziały i grupy z sufiksem_s. -
Dodaj grupy docelowe i podziały zgodnie z polem
dynamic_partition_metadataw pliku manifestu 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 blokujących.
- W razie potrzeby zmapuj partycje źródłowe w mapowaniu urządzenia jako tylko do odczytu. Jest to konieczne w przypadku wczytywania z zewnątrz, ponieważ partycje źródłowe nie są mapowane przed aktualizacją.
- Zastosuj pełną lub przyrostową aktualizację do wszystkich urządzeń blokowych w docelowym slocie.
- Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
- Odłącz 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 pliku manifestu aktualizacji
Podczas przeprowadzania aktualizacji OTA na urządzeniu A/B z dynamicznymi 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 manifeście aktualizacji, które obsługują partycje dynamiczne. Szczegółową dokumentację każdego pola 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;
}