Aktualizacje OTA dla urządzeń A/B z partycjami dynamicznymi

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
    • Pasek grupy_a
      • Partycja vendor_a
      • Partycja product_a
      • Inne partycje zaktualizowane przez słupek
    • Grupa foo_b (pozostałości po poprzedniej aktualizacji)
    • Grupa bar_b (pozostałości po poprzedniej aktualizacji)
  • 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
    • Grupa bar_b
      • Partycja vendor_b
      • Partycja: product_b
      • Inne partycje zaktualizowane przez Bar

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

  1. Inicjalizowanie metadanych partycji super.
    1. Wczytaj zakresy źródłowych partycji dynamicznych z metadanych S. Niech M będzie wartością wczytanych metadanych.
    2. 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.
    3. Dodaj grupy docelowe i partycje zgodnie z polem dynamic_partition_metadata w zaktualizowanym pliku manifestu.
      Rozmiar każdej partycji znajdziesz tutaj: new_partition_info.
    4. Zapisz M w metadanych T.
    5. W mapierze urządzenia mapuj dodane partycje jako umożliwiające zapis.
  2. Zastosuj aktualizację na urządzeniach blokujących.
    1. 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ą.
    2. Zastosuj pełną lub różnicową aktualizację do wszystkich urządzeń blokowych w docelowym gnieździe.
    3. Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
  3. 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;
}