Android 10에서는 무선(OTA) 업데이트 중에 파티션을 만들고 크기를 조절하고 제거할 수 있는 사용자 공간 파티션 나누기 시스템인 동적 파티션을 지원합니다.
이 페이지에서는 Android 9 이하를 실행하는 기기에서 동적 파티션이 지원되는 상태로 A/B 기기의 업데이트가 진행되는 동안 동적 파티션의 크기를 조정하는 방법을 설명합니다.
배경
기기에는 한 개의 super
파티션이 있습니다. 이 파티션은 슬롯 서픽스가 되지 않습니다. 블록 기기는 fstab
의 /misc
항목과 함께 blk_device
에 존재해야 합니다. 예를 들어 fstab
파일이 다음을 나열하는 경우:
/dev/block/bootdevice/by-name/misc /misc # Other fields
그러면 super
의 블록 기기가 /dev/block/bootdevice/by-name/super
에 있어야 하지만 super
파티션은 fstab
파일에 나열할 필요가 없습니다.
super
파티션에는 2개의
메타데이터 슬롯이 있습니다. 두 슬롯의 번호는
파티션 A/B 슬롯에 해당하는 0과 1로 지정됩니다. 이 문서에서는 메타데이터 슬롯을
메타데이터 S(소스) 및 메타데이터 T(타겟)라고 부릅니다. 마찬가지로 파티션은 system_s
, vendor_t
등으로 지칭됩니다.
업그레이드 전에는 메타데이터 S에 사용 중인 동적 파티션 (일반적으로 system_s
, vendor_s
, product_s
등)에 대한 정보가 포함되어 있습니다. 시스템은
업데이트 도중 이러한 파티션의 크기를 읽습니다.
따라서 파티션을 삭제할 수 없습니다.
파티션은 업데이트 그룹에 속합니다. 자세한 내용은 동적 파티션 구현을 참조하세요.
기기의 메타데이터에 대한 예는 다음과 같습니다.
- 메타데이터 0
- 그룹
foo_a
- 파티션
system_a
- 파티션
product_services_a
- Foo에 의해 업데이트되는 다른 파티션
- 파티션
- 그룹
- bar_a
- 파티션
vendor_a
- 파티션
product_a
- Bar에 의해 업데이트된 다른 파티션
- 파티션
- 그룹
foo_b
(이전 업그레이드에서 남은 그룹) - 그룹
bar_b
(이전 업그레이드에서 남은 그룹)
- 그룹
- 메타데이터 1
- 그룹
foo_a
(이전 업그레이드에서 남은 그룹) - 그룹
bar_a
(이전 업그레이드에서 남은 그룹) - 그룹
foo_b
- 파티션
system_b
- 파티션
product_services_b
- Foo에 의해 업데이트되는 다른 파티션
- 파티션
- 그룹
bar_b
- 파티션
vendor_b
- 파티션
product_b
- Bar에 의해 업데이트된 다른 파티션
- 파티션
- 그룹
lpdump
도구 (system/extras/partition_tools
아래의 소스 코드)를 사용하여 기기의 메타데이터를 덤프할 수 있습니다. 예:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
업데이트 흐름
super
파티션 메타데이터를 초기화합니다.- 메타데이터 S에서 소스 동적 파티션의 크기를 로드합니다. M이 로드된 메타데이터가 되도록 합니다.
- M에
_s
서픽스가 있는 파티션과 그룹만 포함되도록 M에서 대상 그룹과 파티션 (예:foo_t
,bar_t
)을 삭제합니다. -
업데이트 매니페스트의
dynamic_partition_metadata
필드에 따라 타겟 그룹과 파티션을 추가합니다.
각 파티션의 크기는new_partition_info
에서 확인할 수 있습니다. - M을 메타데이터 T에 씁니다.
- 추가된 파티션을 기기 매퍼에 작성 가능으로 매핑합니다.
업데이트 전과 후에는 다음 시스템 속성에 각각의 값이 있어야 합니다.
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
그룹 및 파티션을 업데이트 매니페스트에 추가
동적 파티션이 있는 A/B 기기에서 OTA 업데이트를 수행할 때 또는 동적 파티션 지원을 추가하는 A/B 기기에서 업데이트 시 그룹과 파티션을 추가해야 합니다. 아래 스니펫은 동적 파티션을 지원하는 업데이트 매니페스트에 대한 추가 정보를 보여줍니다. 각 필드에 관한 상세 문서는 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; }