비 A/B 시스템 업데이트

A/B 파티션이 없는 이전 Android 기기의 경우 일반적으로 플래시 공간에 다음 파티션이 포함됩니다.

부팅
Linux 커널과 (RAM 디스크에 로드되는) 최소 루트 파일 시스템을 포함합니다. 시스템 파티션과 다른 파티션을 마운트하고 시스템 파티션에 있는 런타임을 시작합니다.
시스템
AOSP(Android 오픈소스 프로젝트)에서 소스 코드를 사용할 수 있는 시스템 애플리케이션 및 라이브러리가 포함되어 있습니다. 일반 작업 중 이 파티션은 읽기 전용으로 마운트됩니다. 이 파티션의 콘텐츠는 OTA 업데이트 중에만 변경됩니다.
공급업체
AOSP(Android 오픈소스 프로젝트)에서 소스 코드를 사용할 수 없는 시스템 애플리케이션 및 라이브러리가 포함되어 있습니다. 일반 작업 중 이 파티션은 읽기 전용으로 마운트됩니다. 이 파티션의 콘텐츠는 OTA 업데이트 중에만 변경됩니다.
사용자 데이터
사용자 등이 설치한 애플리케이션에서 저장한 데이터를 저장합니다. 이 파티션은 일반적으로 OTA 업데이트 프로세스에 의해 변경되지 않습니다.
캐시
일부 애플리케이션에서 사용하고 다운로드된 OTA 업데이트 패키지의 저장에 사용되는 임시 보존 영역(이 파티션에 액세스하려면 특수 앱 권한이 필요함)입니다. 다른 프로그램에서는 파일이 언제든지 사라질 수 있다는 점을 예상하고 이 공간을 사용합니다. 일부 OTA 패키지를 설치하면 이 파티션이 완전히 삭제될 수 있습니다. 캐시에는 OTA 업데이트의 업데이트 로그도 들어 있습니다.
복구
패키지를 읽고 그 콘텐츠를 사용하여 다른 파티션을 업데이트하는 특수 복구 바이너리와 커널을 포함하고 있는 2차 전체 Linux 시스템을 포함하고 있습니다.
기타
OTA 패키지가 적용되는 동안 기기가 다시 시작될 때 실행한 작업에 관해 일부 정보를 숨기기 위해 복구에서 사용하는 작은 파티션입니다.

OTA 업데이트의 수명

일반적인 OTA 업데이트에는 다음 단계가 포함됩니다.

  1. 기기는 OTA 서버를 통해 정기적으로 체크인하고 업데이트 패키지의 URL 및 사용자에게 표시할 설명 문자열을 포함하여 업데이트 사용 가능 여부를 알립니다.
  2. 다운로드를 캐시나 데이터 파티션으로 업데이트하고 암호화 서명을 /system/etc/security/otacerts.zip의 인증서와 비교하여 확인합니다. 사용자에게 업데이트를 설치하라는 메시지가 표시됩니다.
  3. 부팅 파티션의 커널 대신 복구 파티션의 커널과 시스템이 부팅되는 복구 모드로 기기가 재부팅됩니다.
  4. 복구 바이너리는 init로 시작됩니다. 다운로드한 패키지를 가리키는 명령줄 인수를 /cache/recovery/command에서 찾습니다.
  5. 복구는 복구 파티션에 포함된 RAM 디스크의 일부인 /res/keys의 공개 키를 기준으로 패키지의 암호화 서명을 확인합니다.
  6. 데이터는 패키지에서 가져와 필요에 따라 부팅, 시스템 및 공급업체 파티션을 업데이트하는 데 사용됩니다. 시스템 파티션에 남아 있는 새 파일 중 하나에는 새 복구 파티션의 콘텐츠가 포함되어 있습니다.
  7. 기기를 정상적으로 재부팅합니다.
    1. 새로 업데이트된 부팅 파티션이 로드되어 마운트되고 새로 업데이트된 시스템 파티션의 바이너리 실행을 시작합니다.
    2. 정상적인 시작의 일부로 시스템은 복구 파티션의 콘텐츠를 원하는 콘텐츠(이전에 /system에 파일로 저장된 콘텐츠)와 비교하여 확인합니다. 콘텐츠가 다르므로 복구 파티션은 원하는 콘텐츠로 다시 플래시됩니다. 후속 부팅 시에는 복구 파티션에 이미 새 콘텐츠가 포함되어 있으므로 다시 플래시할 필요가 없습니다.

시스템 업데이트가 완료되었습니다! 업데이트 로그는 /cache/recovery/last_log.#에서 확인할 수 있습니다.

업데이트 패키지

업데이트 패키지는 실행 바이너리 META-INF/com/google/android/update-binary가 포함된 .zip 파일입니다. 패키지의 서명을 확인한 후 recovery는 이 바이너리를 /tmp로 추출하고 바이너리를 실행하여 다음 인수를 전달합니다.

  • 업데이트 바이너리 API 버전 번호. 인수가 업데이트 바이너리 변경으로 전달된 경우 이 번호는 증가합니다.
  • 명령어 파이프의 파일 설명자. 업데이트 프로그램은 이 파이프를 사용하여 명령어를 다시 복구 바이너리로 전송할 수 있습니다(대부분 진행 상황을 사용자에게 표시하는 등의 UI 변경사항에 사용됨).
  • 업데이트 패키지 .zip 파일의 파일 이름.

업데이트 패키지는 정적으로 연결된 모든 바이너리를 업데이트 바이너리로 사용할 수 있습니다. OTA 패키지 구성 도구는 여러 설치 작업을 할 수 있는 간단한 스크립트 언어를 제공하는 업데이터 프로그램(bootable/recovery/updater)을 사용합니다. 기기에서 실행되는 다른 모든 바이너리는 대체 가능합니다.

업데이터 바이너리, edify 구문 및 기본 함수에 관한 자세한 내용은 OTA 패키지 내부를 참고하세요.

이전 버전에서 이전

Android 2.3/3.0/4.0 버전에서 이전할 때 주요 변경사항은 미리 정의된 이름이 있는 C 함수 세트에서 모든 기기별 기능을 C++ 객체로 변환하는 것입니다. 다음 표에는 거의 동일한 목적을 실행하는 이전 함수와 새 메서드가 나와 있습니다.

C 함수 C ++ 메서드
device_recovery_start() Device::RecoveryStart()
device_toggle_display()
device_reboot_now()
RecoveryUI::CheckKey()
(RecoveryUI::IsKeyPressed())
device_handle_key() Device::HandleMenuKey()
device_perform_action() Device::InvokeMenuItem()
device_wipe_data() Device::WipeData()
device_ui_init() ScreenRecoveryUI::Init()

이전 함수를 새 메서드로 변환하는 것은 상당히 간단해야 합니다. 새 make_device() 함수를 추가하여 새 기기 서브클래스의 인스턴스를 만들고 반환해야 합니다.