본문 바로가기

AOSP

AOSP) 빌드 시스템[1] : Build System

 

위 그림은 상위 레벨의 빌드 시스템 구조를 표현한 그림입니다.

빌드 순서

위에 그림을 보면

  1. 빌드 환경 설정(./envsetup.sh)을 하고 빌드할 타겟을 결정(lunch)
  2. Product, Board, Module 정보를 로드
  3. main.mk(빌드 규칙을 설정, 컴파일, 링크, 실행파일 또는 라이브러리 생성)을 실행
  4.  시스템 이미지, 부팅 이미지 생성
  5. 최종 결과물 출력 디렉토리에 저장

Build Configuration

Core(main.mk)

main.mk를 실행함으로써 설정(빌드를 위한 초기화 작업, 전역변수 선언), 정의(매크로, 함수, 규칙), 주요 빌드 규칙 정의, 빌드 클린 규칙 정의가 이루어집니다.

Configuration

config.mk(build/make/core/config.mk)에 의거하여 다양한 빌드를 위한 전역 변수들을 설정해줍니다.

표준 변수들 중에는 빌드에 필요한 변수들도 있겠지만, 버전 업데이트가 진행되면서 사용하지 말아야하는 변수(Deprecated, Obsolete)들도 선언을 했습니다. 만약 해당 변수를 사용하게 된다면 경고 로그를 출력하기 위해 변수를 선언을 했습니다.

또는 아키텍쳐에 따라 시스템 설정을 변경하는 코드도 존재합니다.

else ifeq (,$(filter arm64 x86_64,$(TARGET_ARCH)))
  # TARGET_MAX_PAGE_SIZE_SUPPORTED > 4096 is only supported in arm64 and
  # x86_64 targets.
  TARGET_MAX_PAGE_SIZE_SUPPORTED := 4096

이 코드 같은 경우 arm64, x86_64는 페이지 크기를 4096바이트를 할당해주는 코드입니다. 이처럼 아키텍쳐에 따라 시스템 설정을 다르게 해줍니다.

Definitions

definitions.mk 파일에서는 안드로이드 빌드 시스템에서 자주 사용된느 메크로, 상수를 정의하는 파일입니다. 반복적으로 사용되는 설정을 중앙화하여 효율적으로 코드를 작성하고 재사용성을 높이기 위해 존재하는 파일입니다.

 

###########################################################
## Debugging; prints a variable list to stdout
###########################################################

# $(1): variable name list, not variable values
define print-vars
$(foreach var,$(1), \
  $(info $(var):) \
  $(foreach word,$($(var)), \
    $(info $(space)$(space)$(word)) \
   ) \
 )
endef

위 메크로 같은 경우 디버깅을 위한 메크로로서 변수 리스트를 입력을 받아 각 변수 내의 값을 출력하는 기능을 하는 메크로입니다. 

 

Makefile(build/core/Makefile)

Makefile(build/core/Makefile)은 전체 빌드 프로세스를 제어하고 다양한 모듈들의 빌드(컴파일) 순서를 정의, 플랫폼별 빌드 환경을 설정, Android.mk 또는 Android.bp에 따라 모듈별 빌드를 수행하는 역할을 합니다.

Clean Rules(cleanbuild.mk)

cleanbuild.mk는 빌드 시스템에서 빌드 결과물을 정리하는 역활을 합니다. 즉 이전에 빌드된 파일을 제거하고 깨끗한 환경에서 새롭게 빌드를 수행할 수 있게 환경을 만들어주는 파일입니다.