Android 빌드 시스템의 구조 (Soong, Makefile)
개요
Android 운영체제는 복잡한 소프트웨어 스택으로 구성되어 있으며, 이를 빌드하는 과정 또한 매우 방대합니다. Android 빌드 시스템은 이러한 빌드 과정을 체계적으로 관리하며, 현재 Soong과 기존의 Makefile 기반 빌드 시스템이 혼용되고 있습니다. 본 포스팅에서는 Android 빌드 시스템의 구조를 살펴보고, Soong과 Makefile을 비교하며 각각의 역할과 동작 방식에 대해 설명합니다.
Android 빌드 시스템 개요
Android는 초기에는 GNU Make 기반의 빌드 시스템을 사용하였으나, Android 7.0(Nougat)부터는 Soong이라는 새로운 빌드 시스템을 도입하였습니다. 현재 AOSP(Android Open Source Project)는 Soong을 기본 빌드 시스템으로 사용하며, 일부 Make 기반의 빌드 스크립트도 여전히 존재합니다.
Android 빌드 시스템의 주요 구성 요소
- Makefile 기반 빌드 시스템 (Android.mk, Android.bp 변환)
- Soong 빌드 시스템 (Android.bp 사용)
- Ninja 빌드 시스템 (Soong의 빌드 실행 엔진)
- Kati (Makefile을 Ninja 빌드 규칙으로 변환)
- Blueprint (Android.bp 파일을 해석하는 DSL)
Make 기반의 빌드 시스템
Android의 초기 빌드 시스템은 Make를 기반으로 하였으며, Android.mk
와 Android.bp
파일을 이용하여 빌드 설정을 정의하였습니다. Android의 Make 빌드 시스템은 여러 개의 Makefile을 포함하는 구조로, build/core
디렉터리에 핵심 빌드 규칙이 정의되어 있습니다.
Android.mk 예제
아래는 간단한 Android.mk
예제입니다.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_module
LOCAL_SRC_FILES := main.cpp
include $(BUILD_EXECUTABLE)
이 파일은 다음과 같은 작업을 수행합니다.
LOCAL_PATH
를 설정하여 현재 디렉터리 위치를 저장합니다.CLEAR_VARS
를 호출하여 기존 변수들을 초기화합니다.LOCAL_MODULE
을 정의하여 모듈 이름을 설정합니다.LOCAL_SRC_FILES
를 통해 빌드할 소스 파일을 지정합니다.BUILD_EXECUTABLE
을 포함하여 실행 파일을 빌드하도록 설정합니다.
그러나, Make 기반의 빌드 시스템은 대규모 프로젝트에서 성능 문제가 발생할 수 있으며, 유지보수도 어려웠습니다. 이를 해결하기 위해 Soong 빌드 시스템이 도입되었습니다.
Soong 빌드 시스템
Soong은 기존의 Make 기반 빌드 시스템을 대체하기 위해 개발된 빌드 시스템으로, Blueprint DSL을 사용하여 빌드 구성을 정의합니다. Soong은 Android.bp 파일을 사용하여 빌드를 설정하며, Ninja 빌드 시스템을 사용하여 빌드 실행을 최적화합니다.
Soong 빌드 시스템의 주요 특징
- 빠른 빌드 속도: Soong은 Make보다 빌드 속도가 빠르고 병렬 처리가 효율적입니다.
- 명확한 빌드 정의: JSON과 유사한 DSL(도메인 특정 언어, Domain-Specific Language)을 사용하여 빌드 파일을 구성합니다.
- Ninja 빌드 시스템 사용: Make보다 빠른 빌드 수행이 가능하며, 불필요한 빌드를 줄일 수 있습니다.
Android.bp 예제
아래는 Android.bp
파일의 예제입니다.
cc_binary {
name: "my_binary",
srcs: ["main.cpp"],
static_libs: ["libfoo"],
}
이 파일은 다음과 같은 역할을 합니다.
cc_binary
모듈을 정의하여 실행 파일을 빌드합니다.name
필드를 통해 실행 파일의 이름을 설정합니다.srcs
필드를 통해 소스 파일을 지정합니다.static_libs
필드를 통해 정적 라이브러리를 링크합니다.
Soong과 Make 비교
기능 | Soong | Make |
---|---|---|
빌드 속도 | 빠름 (Ninja 사용) | 상대적으로 느림 |
유지보수성 | 높은 가독성, 구조적 명확성 | 복잡한 규칙과 다중 Makefile |
빌드 파일 | Android.bp (JSON 유사 DSL) | Android.mk (GNU Make 규칙 기반) |
병렬 처리 | 효율적 | 상대적으로 비효율적 |
Soong은 구조적으로 정리된 빌드 설정을 제공하며, Make 기반의 빌드 시스템보다 유지보수가 용이합니다. 또한, Soong은 Ninja 빌드 시스템을 활용하여 불필요한 빌드를 줄이고 속도를 개선하였습니다.
빌드 시스템 실행 과정
AOSP를 빌드하는 과정은 다음과 같습니다.
- 환경 설정
source build/envsetup.sh lunch aosp_arm64-userdebug
- 빌드 실행
또는 개별 모듈만 빌드할 경우:m
m my_module
이 과정에서 Soong 빌드 시스템이 Android.bp 파일을 처리하고, Ninja를 사용하여 빌드를 실행합니다.
결론
Android 빌드 시스템은 기존의 Make 기반 시스템에서 Soong으로 점진적으로 전환되었습니다. Soong은 빌드 성능과 유지보수성을 개선하며, Ninja를 활용하여 빌드 시간을 단축합니다.
개발자가 AOSP 환경에서 빌드를 수행할 때는 Soong과 Android.bp 파일을 이해하고 활용하는 것이 중요합니다. 기존의 Make 기반 빌드 시스템을 사용하던 개발자는 Soong으로의 전환을 고려해야 하며, 새로운 모듈을 추가할 경우 Android.bp를 작성하는 것이 필요합니다.
향후 Android 빌드 시스템은 Soong을 중심으로 더욱 발전할 것으로 예상되며, AOSP 내에서도 지속적인 개선이 이루어지고 있습니다.
'Android > Framework' 카테고리의 다른 글
HAL이 필요한 이유 (0) | 2025.03.19 |
---|---|
커스텀 Android 빌드 환경 구성하기 (0) | 2025.03.18 |
Android 시스템 부팅 과정 개요 (0) | 2025.03.16 |
Android의 전체 아키텍처 개요 (0) | 2025.03.15 |
Android의 역사와 발전 과정 (0) | 2025.03.14 |