Android 10은 OTA(over-the-air) 업데이트 도중 파티션을 생성하고 크기를 변경하고 삭제할 수 있는 사용자 공간 파티션 시스템인 동적 파티션을 지원합니다. 이 문서에서는 동적 파티션이 지원되는 상태로 출시된 A/B 기기의 업데이트가 진행되는 동안 OTA 클라이언트에서 동적 파티션의 크기를 어떻게 변경하는지에 대해 설명합니다.
배경
기기에는 한 개의 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 기기 또는 동적 파티션에 지원을 추가하는 A/B 기기에 OTA 업데이트를 수행하는 경우 업데이트 매니페스트에 그룹과 파티션을 추가해야 합니다. 아래 스니펫은 동적 파티션 지원을 위한 업데이트 매니페스트에 관한 추가 정보를 보여줍니다. 각 필드에 관한 상세 문서는 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; }