Android System & AOSP Engineering/Android Automotive

AOSP, Android Open Source Project, 빌드 환경 구축 및 Emulator 실행 속도 단축 방법

임베디드 친구 2026. 7. 28. 21:19
반응형

1. AOSP(Android Open Source Project) 빌드 환경 구축 및 Emulator 실행의 필요성

Android OS의 시스템 프로그래밍 및 프레임워크 수정 작업을 수행하기 위해서는 AOSP(Android Open Source Project) 소스 코드를 직접 컴파일하고 동작을 검증해야 합니다. 특히 차량용 인포테인먼트(Automotive IVI)나 임베디드 안드로이드 디바이스 개발 환경에서는 하드웨어 타겟에 올려 포팅하기 전, PC 상에서의 빠른 프로토타이핑 및 디버깅이 중요합니다. 본 문서에서는 Ubuntu Linux 시스템 환경에서 필수 패키지 설치, Repo 도구를 통한 소스 코드 내려받기, envsetup.sh 및 lunch 명령어를 활용한 이미지 빌드, Ccache를 통한 컴파일 시간 단축, 그리고 Android Emulator 구동까지의 과정을 설명합니다.

2. AOSP 빌드 및 Emulator 구동 핵심 요약 (AOSP Build Quick Summary)

  • Prerequisites & Dependencies Setup (사전 필수 조건 및 의존성 패키지 설정) : 최소 300GB 이상의 여유 디스크 공간이 확보된 Ubuntu 22.04 LTS 환경에서 Git, Python3, OpenJDK 및 빌드 툴체인을 설치합니다.
  • Source Synchronization & Target Selection (소스코드 동기화 및 타겟 선택) : repo init -u https://android.googlesource.com/platform/manifest 명령어로 repo를 초기화하고, lunch sdk_car_x86_64-userdebug 또는 lunch aosp_x86_64-userdebug 명령을 사용해 빌드 타겟 환경을 지정합니다.
  • Build Acceleration & Emulator Execution (빌드 가속 및 에뮬레이터 실행) : 재컴파일 시간을 단축하기 위해 export USE_CCACHE=1 옵션으로 Ccache를 활성화하고, 컴파일을 하며, emulator 명령어로 에뮬레이터를 구동합니다.

3. Ubuntu 기반 AOSP 빌드 환경 구축 및 컴파일 세부 단계

AOSP 소스 코드를 문제없이 컴파일하려면 빌드 시스템 하드웨어 및 필수 라이브러리 패키지가 필요합니다. 아래 워크플로우를 통해 소스코드 다운로드부터 빌드까지 실행합니다.

AOSP 빌드를 위한 필수 환경 및 패키지 세팅

AOSP 커스텀 컴파일에 필요한 하드웨어 권장 사양과 소프트웨어 패키지 리스트는 다음과 같습니다.

구분 (Category) 최소/권장 사양 (Specification) 설명 (Description)
OS Ubuntu 22.04 LTS / 20.04 LTS 구글 공식 권장 Linux 배포판 환경
CPU 8 Cores / 16 Threads 이상 Multi-threading 빌드를 위해 높은 코어 수 권장
RAM 32GB RAM + Swap space 부족할 경우 Out-Of-Memory (OOM) 빌드 실패 발생
Storage 300GB ~ 500GB+ NVMe SSD 소스 코드 sync 및 Ccache, output 바이너리 저장용

다음 bash 터미널 명령어로 컴파일 환경 빌드에 필요한 패키지를 일괄 설치합니다.

# Update package list and install AOSP build dependencies

sudo apt-get update
sudo apt-get install -y git-core gnupg flex bison build-essential zip curl \
  zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev libgl1-mesa-dev \
  libxml2-utils xsltproc unzip fontconfig python3 python3-pip ccache

Repo Tool 초기화 및 AOSP Source Code Sync

AOSP는 수백 개의 Git 리포지토리로 분할되어 있습니다. 이를 통제하기 위하여 Google의 repo 도구를 설치합니다.


# Install repo tool to binary directory
mkdir -p ~/.bin
PATH=~/.bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod a+x ~/.bin/repo

# Create working directory and initialize Repo manifest
mkdir -p ~/aosp_source
cd ~/aosp_source
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1

# Synchronize source code trees
repo sync -c -j$(nproc) --no-clone-bundle --no-tags

envsetup.sh 및 lunch 타겟 설정을 통한 소스코드 컴파일

소스 코드 다운로드가 완료되면 환경 변수를 로드하고, 컴파일 대상 타겟(Target)을 지정합니다. 예제에서는 Emulator 환경에서 실행하기 위해 x86_64로 지정되었습니다.


# Load AOSP build shell environment and functions
source build/envsetup.sh

# Select target product and build variant using lunch
# Option 1: Standard x86_64 Emulator (aosp_x86_64-userdebug)
# Option 2: Automotive x86_64 Emulator (sdk_car_x86_64-userdebug)
lunch aosp_x86_64-userdebug

# Execute build with all available CPU threads
m -j$(nproc)

빌드가 성공적으로 완료되면 $OUT 경로(out/target/product/generic_x86_64/)에 system.img, vendor.img, userdata.img 등 시스템 바이너리 파일이 생성됩니다.
실제 Target Device에서는 generic_x86_64 경로가 Target Device 이름을 따라갑니다.

4. AOSP 컴파일 시간 단축 및 Emulator 디버깅 팁

실무 시스템 개발 환경에서 전체 빌드(Clean Build)시간을 최소화하기 위한 설정 및 디버깅 노하우입니다.

Ccache (Compiler Cache) 활성화를 통한 재빌드 속도 향상

Ccache를 구성하면 이전 컴파일 결과를 캐싱하여 변경 사항이 없는 C/C++ 소스코드 파일 컴파일 시간을 획기적으로 줄일 수 있습니다.


# Configure environment variables for Ccache
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
export CCACHE_DIR=~/.ccache

# Set Ccache size limit (Recommended 50GB to 100GB)
ccache -M 50G

Android Emulator 옵션 제어를 통한 시스템 구동 및 테스트

빌드가 종료된 상태에서 Shell 환경 내에서 즉시 에뮬레이터를 실행합니다. GPU 가속 옵션 및 램 용량 옵션을 추가할 수 있습니다.


# Run Android Emulator using compiled images
emulator -show-kernel -writable-system -no-snapshot-load

# Check connected emulator instance via ADB
adb devices
adb shell getprop ro.build.version.release

5. AOSP 빌드 및 Emulator 실행 도중 발생하는 오류 및 해결책

Out Of Memory (OOM) 사망 현상 및 빌드 중단

  • 문제 상황: soong_ui 또는 ninja 컴파일러 구동 중 c++: fatal error: Killed signal terminated program 에러 메시지와 함께 컴파일 과정이 강제 종료됩니다.
  • 해결책: RAM 용량이 부족할 때 컴파일러 병렬 프로세스가 메모리를 과도하게 점유하여 발생하는 현상입니다. Swap 메모리 공간을 확대하거나, 빌드 쓰레드 수를 제한합니다.

# Create a 32GB Swap file to prevent OOM errors
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Run build with lower job count if RAM is limited
m -j8

Emulator 실행 시 KVM (Kernel-based Virtual Machine) 권한 오류

  • 문제 상황: emulator 실행 시 emulator: ERROR: x86_64 emulation requires hardware acceleration! 에러 메시지가 출력되며 구동이 거부됩니다.
  • 해결책: Linux 하드웨어 가속 모듈인 /dev/kvm 접근 권한이 현재 계정에 없기 때문입니다. 아래 명령어로 사용자 권한을 부여합니다.
# Grant current user permission to access KVM hardware virtualization

sudo apt-get install -y qemu-kvm
sudo adduser $USER kvm
sudo chown $USER /dev/kvm

# Logout and log in again to apply group permission changes

6. 결론

Ubuntu Linux 환경에서 AOSP 환경을 세팅하고 소스코드를 내려받아 에뮬레이터 용 타겟 이미지를 생성하는 기본 절차를 확인하였습니다. 빌드 환경 가속을 위해 Ccache 세팅 및 Swap 공간 확보를 진행해야 하며, /dev/kvm 권한 조정을 통해 빌드된 이미지 파일이 Emulator 상에서 정상 출력되도록 관리할 수 있습니다.

반응형