AOSP Automotive Cuttlefish: 하드웨어 의존성 없는 AAOS 개발 혁명

자동차 산업이 SDV(Software Defined Vehicle)로 전환되면서 임베디드 개발자들에게 가장 큰 병목 구간은 늘 '하드웨어'였습니다. AAOS(Android Automotive OS) 프로젝트를 진행할 때마다 수천만 원을 호가하는 IHU(In-Vehicle Infotainment Head Unit) 프로토타입을 기다리거나, 제한적인 수량의 보드를 팀원들과 공유해야 하는 상황은 생산성을 심각하게 저하시킵니다. 이러한 물리적 제약을 깨기 위해 구글이 내놓은 해답이 바로 Cuttlefish입니다. 이것은 단순한 에뮬레이터가 아닌, 클라우드와 로컬 리눅스 환경에서 실제 하드웨어와 거의 동일한 동작을 보장하는 가상 Automotive 플랫폼입니다.

Goldfish를 넘어선 가상화: 왜 Cuttlefish인가?

과거 안드로이드 앱 개발에 주로 사용되던 Goldfish 에뮬레이터(QEMU 기반)는 커널과 HAL(Hardware Abstraction Layer)의 동작 방식이 실제 디바이스와는 괴리가 있었습니다. 반면 Cuttlefish는 안드로이드의 핵심인 virtio 표준을 기반으로 설계되었습니다. 이는 가상 머신 위에서 돌아가지만, 프레임워크와 HAL 레벨에서는 실제 픽셀(Pixel) 폰이나 Automotive 하드웨어와 동일한 드라이버 인터페이스를 사용한다는 뜻입니다.

특히 AAOS 개발자에게 Cuttlefish가 강력한 이유는 VHAL(Vehicle HAL) 시뮬레이션 능력 때문입니다. 실제 차량 CAN 네트워크에 연결하지 않고도 기어 변경, 속도 조절, HVAC 제어 등의 이벤트를 완벽하게 모사할 수 있습니다.

참고: Cuttlefish는 호스트 커널의 KVM(Kernel-based Virtual Machine)을 사용하므로, 중첩 가상화(Nested Virtualization)가 지원되는 리눅스 환경(Ubuntu 22.04 LTS 권장)이 필요합니다.

실전 구축: Automotive 빌드 타겟 설정

AOSP 소스 코드를 내려받은 후, 일반적인 모바일 타겟이 아닌 Automotive 특화 타겟을 빌드해야 합니다. 필자가 현업에서 CI/CD 파이프라인에 통합할 때 사용하는 표준 빌드 절차는 다음과 같습니다.

// 1. AOSP 소스 초기화 및 동기화 (시간이 오래 걸리므로 주의)
repo init -u https://android.googlesource.com/platform/manifest -b master
repo sync -c -j8

// 2. 환경 설정 로드
source build/envsetup.sh

// 3. Automotive Cuttlefish 타겟 선택 (x86_64 아키텍처)
// 'auto' 키워드가 포함된 타겟을 선택해야 AAOS 기능이 활성화됩니다.
lunch aosp_cf_x86_64_auto-trunk_staging-userdebug

// 4. 빌드 실행
m

// 5. Cuttlefish 인스턴스 실행 (WebRTC 모드 활성화)
// --start_webrtc: 브라우저를 통해 원격으로 화면을 제어할 수 있게 함
launch_cvd --start_webrtc --daemon

위 명령어가 성공적으로 실행되면, 로컬호스트의 8443 포트(https://localhost:8443)를 통해 브라우저에서 실행 중인 AAOS 화면을 볼 수 있습니다. 이는 개발자가 별도의 디스플레이 장치 없이도 IVI 시스템의 UI/UX를 검증할 수 있게 해줍니다.

성능 주의: Cuttlefish 실행 시 RAM이 최소 8GB 이상 여유가 있어야 원활합니다. 메모리 부족 시 launch_cvd 프로세스가 OOM Killer에 의해 강제 종료될 수 있습니다.

VHAL 디버깅 및 가상 센서 활용

단순히 화면만 띄우는 것이라면 기존 에뮬레이터와 다를 바 없습니다. Cuttlefish의 진가는 adb를 통한 차량 속성(Vehicle Property) 주입에 있습니다. VHAL 인터페이스를 통해 실제 센서 데이터를 모킹(Mocking) 할 수 있습니다.

// 차량 속도(PERF_VEHICLE_SPEED)를 100km/h로 설정하는 예시
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/default \
    --set 0x11600207 --float 100.0

// 기어 상태를 'DRIVE'로 변경
adb shell dumpsys android.hardware.automotive.vehicle.IVehicle/default \
    --set 0x11400400 --int 8

이러한 방식은 운전 중 발생할 수 있는 엣지 케이스(Edge Case)를 테스트할 때 매우 유용합니다. 물리적인 차량에서는 재현하기 힘든 고속 주행 중 에러 상황이나, 특정 기어 변속 시퀀스에서의 앱 동작을 안전하게 검증할 수 있습니다.

기능 Android Emulator (Goldfish) Cuttlefish (AAOS)
실행 환경 Android Studio 위주 AWS, GCP, 로컬 리눅스 서버
HAL 정확도 낮음 (QEMU 의존) 높음 (VirtIO 기반, 실제 하드웨어 유사)
VHAL 지원 기본적 지원 완전한 제어 가능 (Multi-Display 포함)
CI/CD 통합 어려움 (GUI 의존성) 매우 용이 (Headless 모드 최적화)

Conclusion

AOSP Automotive Cuttlefish는 더 이상 선택이 아닌 필수 개발 도구입니다. 하드웨어 리드타임 때문에 소프트웨어 개발이 지연된다는 것은 현대의 SDV 경쟁에서 뒤처진다는 것을 의미합니다. 지금 당장 팀의 로컬 서버에 Cuttlefish 환경을 구축하고, 물리 장비 없이도 AAOS의 전체 스택을 빌드하고 테스트하는 자유를 누리십시오. 하드웨어는 최종 검증을 위한 도구일 뿐, 개발의 병목이 되어서는 안 됩니다.

Post a Comment