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

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
    • Grupa bar_a
      • Partycja vendor_a
      • Partycja product_a
      • Inne partycje aktualizowane 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 aktualizowane przez Foo
    • Grupa bar_b
      • Partycja vendor_b
      • Partycja product_b
      • Inne partycje aktualizowane przez Bar

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

Proces aktualizacji

  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 i partycje docelowe (np. foo_t, bar_t), aby M zawierały tylko partycje i grupy z sufiksem _s.
    3. Dodaj grupy i partycje docelowe zgodnie z polem dynamic_partition_metadata w manifeście 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 blokowych.
    1. 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ą.
    2. Zastosuj pełną lub przyrostową aktualizację do wszystkich urządzeń blokowych w slocie docelowym.
    3. Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
  3. 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;
}