OTA 패키지 빌드

build/make/tools/releasetools에 제공된 ota_from_target_files 도구를 사용하여 A/B 시스템 업데이트 또는 비 A/B 시스템 업데이트를 사용하는 기기의 전체 및 증분 OTA 패키지를 빌드할 수 있습니다. 이 도구는 Android 빌드 시스템에서 생성된 target-files.zip 파일을 입력으로 사용합니다.

Android 11 이상을 실행하는 기기의 경우 SKU가 다른 여러 기기를 위해 하나의 OTA 패키지를 빌드할 수 있습니다. 이러한 사용을 지원하려면 동적 디지털 지문을 사용하도록 대상 기기를 구성하고 사전 및 사후 조건 항목에 기기 이름과 디지털 지문을 포함하도록 OTA 메타데이터를 업데이트해야 합니다.

Android 8.0에서는 비 A/B 기기용 파일 기반 OTA 패키지가 지원 중단되었으며 대신 블록 기반 OTA 패키지를 사용해야 합니다. Android 7.x 이하를 실행하는 기기용 블록 기반 OTA 패키지를 생성하려면 --block 옵션을 ota_from_target_files 매개변수에 전달하세요.

전체 업데이트 빌드

전체 업데이트는 기기의 전체 최종 상태(시스템, 부팅 및 복구 파티션)가 포함된 OTA 패키지입니다. 기기에서 패키지를 받고 적용할 수 있는 한 기기의 현재 상태와 관계없이 패키지가 빌드를 설치할 수 있습니다. 예를 들어 다음 명령어는 출시 도구를 사용하여 tardis 기기용 target-files.zip 보관 파일을 빌드합니다.

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

make dist$OUT에 전체 OTA 패키지를 빌드합니다. 결과로 반환되는 .zip 파일에는 tardis 기기용 OTA 패키지를 구성하는 데 필요한 모든 것이 포함되어 있습니다. ota_from_target_files를 Python 바이너리로 빌드한 다음 호출하여 전체 또는 증분 패키지를 빌드할 수도 있습니다.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

ota_from_target_files 경로는 $PATH에 설정되고 결과로 반환되는 Python 바이너리는 out/ 디렉터리에 위치합니다.

이제 ota_update.zip을 테스트 기기로 전송할 수 있습니다(전부 테스트 키로 서명됨). 사용자 기기의 경우 출시용 빌드 서명에 설명된 것처럼 자체 비공개 키를 생성하여 사용합니다.

증분 업데이트 빌드

증분 업데이트는 기기에 이미 존재하는 데이터의 바이너리 패치가 포함된 OTA 패키지입니다. 증분 업데이트가 포함된 패키지는 일반적으로 변경되지 않은 파일이 포함되지 않기 때문에 더 작습니다. 또한 변경된 파일은 이전 버전과 매우 유사한 경우가 많으므로 패키지에 두 파일 간 차이점의 인코딩만 포함하면 됩니다.

증분 업데이트 패키지는 패키지를 구성할 때 사용된 소스 빌드가 있는 기기에만 설치할 수 있습니다. 증분 업데이트를 빌드하려면 (업데이트할) 이전 빌드의 target_files.zip 파일과 새 빌드의 target_files.zip 파일이 필요합니다. 예를 들어 다음 명령어는 출시 도구를 사용하여 tardis 기기용 증분 업데이트를 빌드합니다.

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

이 빌드는 이전 빌드와 매우 흡사하며, 증분 업데이트 패키지(incremental_ota_update.zip, 약 1MB)는 상응하는 전체 업데이트(60MB)에 비해 매우 작습니다.

증분 패키지는 증분 패키지의 시작점으로 사용되는 동일한 이전 빌드를 실행하는 기기에만 배포하세요. (make로 빌드되고 fastboot flashall로 플래시될) PRODUCT_OUT 디렉터리의 이미지 대신 (make dist로 빌드되고 fastboot update로 플래시될) PREVIOUS-tardis-target_files.zip 또는 PREVIOUS-tardis-img.zip의 이미지를 플래시해야 합니다. 다른 빌드를 포함하는 기기에 증분 패키지를 설치하려고 하면 설치 오류가 발생합니다. 설치에 실패하면 기기가 (이전 시스템을 실행하는) 동일한 작동 상태를 유지합니다. 패키지는 파일을 수정하기 전에 업데이트하는 모든 파일의 이전 상태를 확인하므로 기기가 절반만 업그레이드된 상태로 남아 있지 않습니다.

최상의 사용자 환경을 원하는 경우 3~4회의 증분 업데이트마다 전체 업데이트를 제공하세요. 이렇게 하면 사용자가 최신 출시를 설치하고 증분 업데이트의 긴 설치 시퀀스를 방지할 수 있습니다.

여러 SKU용 OTA 패키지 빌드

Android 11 이상에서는 SKU가 다른 여러 기기의 단일 OTA 패키지 사용을 지원합니다. 이러한 사용을 지원하려면 동적 디지털 지문을 사용하도록 대상 기기를 구성하고 사전 및 사후 조건 항목에 기기 이름과 디지털 지문을 포함하도록 (OTA 도구를 사용하여) OTA 메타데이터를 업데이트해야 합니다.

SKU에 관한 정보

SKU의 형식은 결합된 빌드 매개변수 값의 변형으로 일반적으로 현재 build_fingerprint 매개변수의 선언되지 않은 하위 집합입니다. OEM에서 SKU에 CDD가 승인한 빌드 매개변수의 모든 조합을 사용할 수 있으며 이 SKU에 단일 이미지를 사용할 수 있습니다. 예를 들어 다음 SKU에는 여러 변형이 있습니다.

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA는 기기 수준입니다(예: Pro, Premium, Plus).
  • modifierB는 하드웨어 변형입니다(예: 라디오).
  • modifierC는 일반(예: 북미, 유럽, 중동, 아프리카, 중국) 또는 국가/언어별(예: 일본어, 영어, 중국어) 지역입니다.

많은 OEM에서 여러 SKU에 단일 이미지를 사용한 다음 기기가 부팅된 후 런타임에 최종 제품 이름 및 기기 지문을 가져옵니다. 이 프로세스를 통해 플랫폼 개발 프로세스가 단순화되어 부분적으로 맞춤설정되었지만 제품 이름이 다른 기기에서 공통 이미지(예: tardistardispro)를 공유할 수 있습니다.

동적 디지털 지문 사용

디지털 지문은 ro.product.brand, ro.product.name, ro.product.device와 같은 빌드 매개변수의 연결로 정의됩니다. 기기의 디지털 지문은 시스템 파티션 디지털 지문에서 가져오며 기기에서 실행되는 이미지 및 바이트의 고유 식별자로 사용됩니다. 동적 디지털 지문을 만들려면 기기 부팅 시 기기의 build.prop 파일에 있는 동적 로직을 사용하여 부트로더 변수의 값을 가져온 후 이 데이터를 사용하여 기기의 동적 디지털 지문을 만드세요.

예를 들어 tardistardispro 기기에 동적 디지털 지문을 사용하려면 아래와 같이 다음 파일을 업데이트하세요.

  • 다음 행을 포함하도록 odm/etc/build_std.prop 파일을 업데이트합니다.

    ro.odm.product.device=tardis
    
  • 다음 행을 포함하도록 odm/etc/build_pro.prop 파일을 업데이트합니다.

    ro.odm.product.device=tardispro
    
  • 다음 행을 포함하도록 odm/etc/build.prop 파일을 업데이트합니다.

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

이 행에서는 ro.boot.product.hardware.sku 부트로더 속성(읽기 전용)의 값을 기반으로 기기 이름, 디지털 지문, ro.build.fingerprint 값을 동적으로 설정합니다.

OTA 패키지 메타데이터 업데이트

OTA 패키지에는 OTA 패키지의 사전 조건, 사후 조건 등 패키지를 설명하는 메타데이터 파일(META-INF/com/android/metadata)이 포함됩니다. 예를 들어 다음 코드는 tardis 기기를 타겟팅하는 OTA 패키지의 메타데이터 파일입니다.

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

pre-device, pre-build-incremental, pre-build 값은 OTA 패키지를 설치할 수 있는 기기의 상태를 정의합니다. post-build-incrementalpost-build 값은 OTA 패키지가 설치된 후 예상되는 기기의 상태를 정의합니다. pre-post- 필드의 값은 상응하는 다음 빌드 속성에서 가져옵니다.

  • pre-device 값은 ro.product.device 빌드 속성에서 가져옵니다.
  • pre-build-incrementalpost-build-incremental 값은 ro.build.version.incremental 빌드 속성에서 가져옵니다.
  • pre-buildpost-build 값은 ro.build.fingerprint 빌드 속성에서 가져옵니다.

Android 11 이상을 실행하는 기기에서는 OTA 도구의 --boot_variable_file 플래그를 사용하여 기기의 동적 디지털 지문을 만드는 데 사용되는 런타임 변수 값이 포함된 파일의 경로를 지정할 수 있습니다. 그런 다음 데이터는 (파이프 문자 |를 구분 기호로 사용하여) pre-post- 조건에 기기 이름과 디지털 지문을 포함하도록 OTA 메타데이터를 업데이트하는 데 사용됩니다 --boot_variable_file 플래그의 구문과 설명은 다음과 같습니다.

  • 구문: --boot_variable_file <path>
  • 설명: ro.boot.* 속성의 가능한 값이 포함된 파일의 경로를 지정합니다. 일부 ro.product.* 속성이 import 문으로 재정의될 때 가능한 런타임 디지털 지문을 계산하는 데 사용됩니다. 파일에는 행당 하나의 속성이 포함되며 각 행의 형식은 prop_name=value1,value2입니다.

예를 들어 속성이 ro.boot.product.hardware.sku=std,pro인 경우 tardistardispro 기기의 OTA 메타데이터는 아래와 같습니다.

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

Android 10을 실행하는 기기에서 이 기능을 지원하려면 참조 구현을 참고하세요. 이 변경 목록은 build.prop 파일의 import 문을 조건부로 파싱하며 이에 따라 속성 재정의가 인식되고 최종 OTA 메타데이터에 반영됩니다.