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

Android 10 obsługuje partycje dynamiczne – system partycjonowania przestrzeni użytkownika, który umożliwia tworzenie, zmianę rozmiaru i niszczenie partycji podczas aktualizacji OTA.

Na tej stronie opisano, jak zmienić rozmiar partycji dynamicznych podczas aktualizacji dla urządzeń A/B, które zostały uruchomione z obsługą partycji dynamicznych, dla urządzeń z systemem Android 9 i starszym .

Tło

Na urządzeniu jest jedna super partycja. Ta partycja nie ma przyrostka gniazda. Urządzenie blokowe musi istnieć wraz z wpisem blk_device dla /misc w fstab . Na przykład, jeśli plik fstab zawiera listę:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Wtedy urządzenie blokowe dla super musi istnieć w /dev/block/bootdevice/by-name/super , ale super partycja nie musi być wymieniona w pliku fstab .

W super partycji znajdują się dwa miejsca na metadane , ponumerowane 0 i 1, odpowiadające slotom A/B dla partycji. Na tej stronie przedziały metadanych nazywane są Metadane S (źródło) i Metadane T (cel). Podobnie partycje są określane jako system_s , vendor_t i tak dalej.

Przed aktualizacją Metadane S zawierają informacje o używanych partycjach dynamicznych (zazwyczaj system_s , vendor_s , product_s itd.). System odczytuje zasięgi tych partycji podczas aktualizacji, więc nie można ich usunąć.

Partycje należą do grup aktualizacji . Aby uzyskać szczegółowe informacje, zobacz Implementowanie partycji dynamicznych .

Przykład metadanych na urządzeniu jest następujący.

  • Metadane 0
    • Grupa foo_a
      • system_a partycji_a
      • Podziel product_services_a na partycje
      • Inne partycje zaktualizowane przez Foo
    • Pasek grupowy_a
      • vendor_a partycji_a
      • product_a partycji_a
      • Inne partycje zaktualizowane przez Bar
    • Grupa foo_b (pozostałość z poprzedniej aktualizacji)
    • Grupa bar_b (pozostałość z poprzedniej aktualizacji)
  • Metadane 1
    • Grupa foo_a (pozostałość z poprzedniej aktualizacji)
    • Grupa bar_a (pozostałość z poprzedniej aktualizacji)
    • Grupa foo_b
      • system_b partycji_b
      • Podziel product_services_b na partycje
      • Inne partycje zaktualizowane przez Foo
    • bar_b grupowy_b
      • vendor_b partycji_b
      • Podziel 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 swoje urządzenie. Na przykład:

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

Aktualizuj przepływ

  1. Zainicjuj metadane super partycji.
    1. Załaduj zakresy źródłowych partycji dynamicznych z Metadanych S. Niech M będzie załadowanymi metadanymi.
    2. Usuń grupy docelowe i partycje (na przykład foo_t , bar_t ) z M, tak aby M zawierał tylko partycje i grupy z przyrostkiem _s .
    3. Dodaj grupy docelowe i partycje zgodnie z polem dynamic_partition_metadata w manifeście aktualizacji.
      Rozmiar każdej partycji można znaleźć w new_partition_info .
    4. Zapisz M do Metadanych T.
    5. Zamapuj dodane partycje w programie mapującym urządzenia jako nadające się do zapisu.
  2. Zastosuj aktualizację na urządzeniach blokowych.
    1. Jeśli to konieczne, zamapuj partycje źródłowe w programie mapującym urządzenia jako tylko do odczytu. Jest to konieczne w przypadku ładowania bocznego, ponieważ partycje źródłowe nie są mapowane przed aktualizacją.
    2. Zastosuj aktualizację pełną lub delta do wszystkich urządzeń blokowych w gnieździe docelowym.
    3. Zamontuj partycje, aby uruchomić skrypt poinstalacyjny, a następnie odmontuj partycje.
  3. Odmapuj partycje docelowe.

Przed i po aktualizacji następujące właściwości systemu powinny mieć odpowiednie wartości:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Dodaj grupy i partycje do manifestu aktualizacji

Podczas wykonywania aktualizacji OTA na urządzeniu A/B z partycjami dynamicznymi lub urządzeniu A/B, które dodaje obsługę partycji dynamicznych, należy dodać grupy i partycje do manifestu aktualizacji. Poniższy fragment przedstawia dodatkowe informacje na temat manifestu aktualizacji dotyczącego obsługi partycji dynamicznych. Szczegółową dokumentację dotyczącą każdego pola można znaleźć 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;
}