심리스(Seamless) 업데이트라고도 하는 A/B 시스템 업데이트는 OTA (Over-The-Air) 업데이트 중에도 작동 가능한 부팅 시스템이 디스크에 남아 있도록 합니다. 이 방법은 업데이트후 장치의 비활성가능성을 줄여 주므로 수리 및 보증 센터에서 장치 교체 및 장치 리플래쉬(Reflash)가 줄어 듭니다. ChromeOS와 같은 다른 상업용 운영 체제에서도 A/B 업데이트를 성공적으로 사용됩니다.
A/B 시스템 업데이트는 다음과 같은 이점을 제공합니다.
l OTA 업데이트는 시스템 실행중에 사용자 중단없이 발생할 수 있습니다. 사용자는 OTA도중에 장치를 계속 사용할 수 있습니다. 업데이트도중 유일한 중단 시간은 장치가 업데이트된 디스크 파티션으로 재부팅되는 경우입니다.
l 업데이트 후에는 재부팅이 일반 재부팅보다 더 소요되지 않습니다.
l OTA가 되지 않는 경우 (예 : 불량 플래시로 인해) 사용자는 영향을 받지 않습니다. 사용자는 이전 OS를 계속 실행하며 클라이언트는 업데이트를 다시 시도할 수 있습니다.
l OTA 업데이트를 했지만 부팅에 실패하면 장치가 이전 파티션으로 재부팅되고 사용 가능한 상태로 유지됩니다. 클라이언트는 업데이트를 다시 시도할 수 있습니다.
l 오류 (예 : I/O 오류)는 사용되지 않은 파티션 세트에만 영향을 주며 재시도될 수 있습니다. 그러므로 사용자 경험을 저하시키지 않을 것입니다.
l 업데이트를 A/B 장치로 스트리밍할 수 있으므로 패키지를 설치하기 전에 다운로드할 필요가 없습니다. 스트리밍이란 사용자가 /data 또는 /cache에 업데이트 패키지를 저장할 충분한 여유 공간을 가질 필요가 없음을 의미합니다.
l 캐시 파티션은 더이상 OTA 업데이트 패키지를 저장하는데 사용되지 않으므로 캐시 파티션이 향후 업데이트를 위해 충분히 큰지 확인할 필요가 없습니다.
l dm-verity는 장치가 손상되지 않은 이미지를 부팅하도록 보장합니다. 장치가 잘못된 OTA 또는 dm-verity 문제로 인해 부팅되지 않으면 장치가 이전 이미지로 재부팅될 수 있습니다. (Android Verified Boot에는 A/B 업데이트가 필요하지 않습니다.)
A/B (Seamless) 시스템 업데이트에 대해
A/B 업데이트를 수행하려면 클라이언트와 시스템 모두를 변경해야 합니다. 그러나 OTA 패키지 서버는 변경이 필요하지 않습니다. 업데이트 패키지는 여전히 HTTPS를 통해 제공됩니다. Google의 OTA 인프라를 사용하는 기기의 경우 시스템 변경 사항이 모두 AOSP이며 클라이언트 코드는 Google Play 서비스에서 제공됩니다. Google의 OTA 인프라를 사용하지 않는 OEM은 AOSP 시스템 코드를 재사용할 수 있지만 자체 클라이언트를 제공해야 합니다.
자체 클라이언트를 제공하는 OEM의 경우 클라이언트는 다음을 수행해야 합니다.
l 업데이트를 할때를 결정합니다. A/B 업데이트가 백그라운드에서 발생하기 때문에 더이상 사용자가 시작하지 않습니다. 사용자 중단을 방지하려면 장치가 유휴 유지 관리 모드 (예 : 밤, Wi-Fi) 일때 업데이트를 예약하는 것이 좋습니다. 그러나 클라이언트는 원하는 휴리스틱(Heuristics)을 사용할 수 있습니다.
l OTA 패키지 서버에 로그린하여 업데이트를 가용한지 확인합니다. 이는 기기가 A/B를 지원한다는 신호를 보내고 싶다는 점을 제외하면 대부분 기존 클라이언트 코드와 동일해야 합니다. (Google의 고객은 사용자가 최신 업데이트를 확인하기 위해 '지금 확인' 버튼도 포함합니다.)
l 업데이트 패키지의 HTTPS URL로 update_engine을 호출합니다. update_engine은 업데이트 패키지를 스트리밍할때 현재 사용되지 않는 파티션의 블록을 업데이트합니다.
l update_engine 결과 코드에 따라 설치 성공 또는 실패를 서버에 보고합니다. 업데이트가 성공적으로 적용되면 update_engine은 다음 재부팅시 새 OS로 부팅하도록 부트 로더에 지시합니다. 새로운 OS가 부팅에 실패하면 부트 로더가 이전 OS로 대체되므로 클라이언트에서 작업할 필요가 없습니다. 업데이트가 실패하면 클라이언트는 자세한 오류 코드를 기반으로 다시 시도할 시기를 결정해야 합니다.
옵션으로 클라이언트는 다음을 수행할 수 있습니다.
l 사용자에게 재부팅하라는 알림을 표시합니다. 사용자가 정기적으로 업데이트하도록 권장하는 정책을 구현하려는 경우 이 알림을 클라이언트에 추가할 수 있습니다. 클라이언트가 사용자에게 확인 메시지를 표시하지 않으면 사용자는 다음 번에 다시 부팅할때 업데이트를 받게 됩니다.
l 사용자에게 새로운 OS 버전으로 부팅했는지 또는 이전 OS 버전으로 되돌아 갔는지 여부를 알려주는 알림을 표시합니다.
시스템 측면에서 A/B 시스템 업데이트는 다음 사항에 영향을 미칩니다.
l 파티션 선택 (슬롯), update_engine daemon 및 부트 로더 상호 작용
l 빌드 프로세스 및 OTA 업데이트 패키지 생성