Aktualizacja OTA na urządzeniach z użyciem partycji dynamicznych

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
    • Grupa bar_a
      • Partycja vendor_a
      • Partycja product_a
      • Inne partycje zaktualizowane przez Bar
    • 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 poprzedniej aktualizacji)
    • 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). Przykład:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Aktualizowanie przepływu

  1. Inicjalizowanie metadanych partycji super.
    1. Załaduj zakresy źródłowych partycji dynamicznych z poziomu metadanych. Niech M będą wczytanymi metadanymi.
    2. 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.
    3. Dodaj grupy docelowe i partycje zgodnie z polem dynamic_partition_metadata w zaktualizowanym pliku manifestu.
      Rozmiar każdej partycji można sprawdzić w new_partition_info.
    4. Zapisz M do metadanych T.
    5. Mapuj dodane partycje w Device Mapper jako partycje do zapisu.
  2. Zastosuj aktualizację na urządzeniach z blokadą.
    1. 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ą.
    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. 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;
}