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, 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 /miscfstab. 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.

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
    • Group bar_a
      • Partycja vendor_a
      • Partycja product_a
      • Inne partycje zaktualizowane przez Bar
    • Grupa foo_b (pozostałość po poprzedniej aktualizacji)
    • Grupa bar_b (pozostałość po poprzedniej aktualizacji)
  • 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
    • Grupa bar_b
      • Partycja vendor_b
      • Partycja product_b
      • Inne partycje zaktualizowane przez Bar

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/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Aktualizowanie przepływu

  1. Zainicjuj metadane partycji super.
    1. Wczytaj zakresy źródłowych partycji dynamicznych z metadanych S. Niech M będą wczytanymi metadanymi.
    2. 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.
    3. Dodaj grupy docelowe i podziały zgodnie z polem dynamic_partition_metadata w pliku manifestu aktualizacji.
      Rozmiar każdej partycji znajdziesz w new_partition_info.
    4. Zapisz M w metadanych T.
    5. Zmapuj dodane partycje w mapowaniu urządzeń jako zapisywalne.
  2. Zastosuj aktualizację na urządzeniach blokujących.
    1. 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ą.
    2. Zastosuj pełną lub przyrostową aktualizację do wszystkich urządzeń blokowych w docelowym slocie.
    3. Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
  3. 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;
}