do{학습}while

AOSP) Android.bp 작성하는 법 본문

AOSP

AOSP) Android.bp 작성하는 법

하이오야이 2024. 9. 5. 17:08

이전에 AOSP 빌드 시스템에 대해서 설명하면서 Android.bp를 언급한적이 있습니다. AOSP 빌드 스크립트 중 하나인 Android.bp를 자세히 알아보고 빌드스크립트를 어떤 방식으로 작성하는지 알아보겠습니다.
 

Android.bp의 기본적인 구조

<빌드 타입> {
    <속성>: <값>,
    <속성>: <값>,
    ...
}

 
기본적으로 Android.bp는 빌드 타입을 정하여 빌드 목적을 정하고 key:value 형태로 빌드 속성들을 설정해줄 수 있습니다.

빌드 타입

빌드 타입은 모듈의 유형을 정의합니다. 정의된 빌드 타입에 따라 출력 파일의 타입도 결정되게 됩니다.
빌드 타입을 나열하면..

package

  • 프로젝트나 특정 디렉토리 내의 라이선스 정보를 지정하고 관리
  • Android.bp 파일에서 package 모듈 타입은 Makefile에서의 include 명령어와 비슷한 역할을 합니다.

android_app

  • 안드로이드 앱을 빌드할때 사용되는 빌드 타입
  • 출력 : .apk 파일 (android application package)

android_library

  • 안드로이드 라이브러리를 빌드할때 사용되는 빌드 타입
  • .aar 형태로 다른 앱에서 .aar 파일에 포함된 리소스 코드 혹은 매니페스트을 사용 가능
  • 출력 : 리소스 코드, 매니페스트 등을 포함한 .aar (android archive)

java_library

자바 코드로 구성된 빌드하여 라이브러리를 생성하는 빌드 타입
출력 : .jar (java archive)

cc_default

  • C/C++ 코드의 기본적인 설정을 정의
  • 소스파일, 컴파일러 플래그, 라이브러리 의존성 등을 설정

cc_library

  • C/C++ 코드로 구성된 파일을 빌드하는 빌드 타입
  • 출력 : .so (동적 라이브러리), .a (정적 라이브러리)

cc_binary

  • C/C++ 코드로 구성된 파일을 빌드하는 빌드 타입
  • 출력 : .exe (실행 가능한 가능한 바이너리 파일)

rust_library

  • rust 코드로 구성된 파일을 빌드하는 빌드 타입

prebuilt_aar / prebuilt_apk

  • 이미 생성된 AAR, APK 파일 참조하여 빌드 스크립트에 포함
  • 출력 : 미리 빌드된 .aar, .apk

 

속성

빌드 시스템(Soong)에는 미리 정의된 다양한 속성들이 존재합니다. 이 속성들은 각 빌드 타입에 따라 다르게 사용됩니다.

공통 속성(모든 모듈에 적용 가능)

name

  • 모듈의 이름을 정의
  • 예 : name: "my_library"

srcs

  • 모듈에서 사용할 소스 파일들의 목록을 정의
  • 예: srcs: ["src/**/*.java", "src/**/*.kt"]
    src 디렉토리 하위에 존재하는 모든 .java, .kt파일들을 모듈 빌드 시 포함하겠다는 의미

sdk_version

  • 모듈이 사용할 Android SDK 버전을 지정
  • 예: sdk_version: "29"

min_sdk_version:

  • 모듈에서 지원할 최소 Android SDK 버전을 설정
  • 예: min_sdk_version: "21"

static_libs

  • 정적 라이브러리의 의존성을 정의
  • 예: static_libs: ["mylib_static"]

shared_libs

  • 동적 라이브러리의 의존성을 정의
  • 예: shared_libs: ["mylib_shared"]

external_include_dirs

  • 외부 헤더 파일 경로를 정의
  • 예: external_include_dirs: ["external/include"]

resource_dirs

  • Android 리소스 파일이 있는 디렉토리를 정의
  • 예: resource_dirs: ["res"]

exclude_srcs

  • 빌드에서 제외할 소스 파일을 정의
  • 예: exclude_srcs: ["src/exclude/*.java"]

exclude_shared_libs

  • 빌드에서 제외할 동적 라이브러리를 정의
  • 예: exclude_shared_libs: ["exclude_lib_shared"]

manifest

  • AndroidManifest.xml 파일의 경로를 지정
  • 예: manifest: "AndroidManifest.xml"

compile_multilib

  • 32비트 또는 64비트 빌드 옵션을 설정 ("both", "32", "64" 중 선택)
  • 예: compile_multilib: "both"

Package에 사용되는 속성

default_applicable_licenses

  • 기본 라이선스 정의
  • 예 : default_applicable_licenses: ["Android-Apache-2.0"]
    디렉토리 내의 모든 모듈과 파일이 Android-Apache-2.0 라이선스를 따름

android_library에 사용되는 속성

libs

  • Java 또는 Kotlin에서 사용하는 라이브러리 의존성을 설정
  • 예: libs: ["androidx.core_core", "androidx.appcompat_appcompat"]

static_libs

  • 정적으로 연결될 라이브러리의 목록을 정의
  • 예: static_libs: ["mylib_static"]

resource_dirs

  • 리소스 파일을 포함하는 디렉토리 목록을 정의
  • 예: resource_dirs: ["res"]

aidl

  • AIDL 파일의 경로를 정의
  • 예: aidl: ["src/**/*.aidl"]

cc_library (C/C++ 라이브러리 빌드에 사용)

defaults

  • cc_default모듈의 설정을 참조
  • 예 : defaults: ["<cc_default모듈의 이름>"]

shared_libs

  • 이 라이브러리가 의존하는 동적 라이브러리들을 정의
  • 예: shared_libs: ["liblog", "libc"]

static_libs

  • 이 라이브러리가 의존하는 정적 라이브러리들을 정의
  • 예: static_libs: ["libutils"]

cflags

  • C/C++ 컴파일러에 전달할 플래그를 정의
  • 예: cflags: ["-Wall", "-Werror"]

include_dirs

  • 추가 헤더 파일 경로를 정의
  • 예: include_dirs: ["include", "external/include"]

android_app (APK 빌드 모듈에 사용)

privileged

  • 시스템 권한이 필요한 앱인지 여부를 정의
  • 예: privileged: true

certificate

  • APK 서명에 사용할 인증서를 지정
  • 예: certificate: "platform"

aaptflags

  • aapt 도구에 전달할 추가 플래그를 정의
  • 예: aaptflags: ["--no-compress"]

java_library (Java 라이브러리 빌드에 사용)

jars

  • 빌드 시 추가할 외부 JAR 파일을 지정
  • 예: jars: ["prebuilt/mylib.jar"]

lint

  • Java Lint 옵션을 설정
  • 예: lint: { fatal: ["NewApi"] }

prebuilt_aar / prebuilt_apk (미리 빌드된 AAR/APK 모듈)

aar

  • 미리 빌드된 AAR 파일의 경로를 지정
  • 예: aar: "libs/mylib.aar"

apk

  • 미리 빌드된 APK 파일의 경로를 지정
  • 예: apk: "prebuilt/app.apk"

rust_library (Rust 라이브러리 빌드에 사용)

crate_name

  • Rust crate의 이름을 지정
  • 예: crate_name: "mylib"

features

  • 활성화할 Rust crate의 기능 목록을 지정
  • 예: features: ["serde", "async"]

Android.bp를 공부하고...

Android.bp는 Android.mk에 비해 구조적으로 더 명확하게 정리되어 있다고 느꼈습니다. 빌드 시스템에서 무엇을 빌드하려고 하는지 한눈에 파악하기 쉬웠고, 모듈에 관련된 속성들이 그룹화 시킬 수 있어 가독성이 높아졌다는 느낌을 받았습니다.

참고

https://source.android.com/docs/setup/reference/androidbp?hl=ko

 

Android.bp 파일 형식  |  Android 오픈소스 프로젝트  |  Android Open Source Project

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Android.bp 파일 형식 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 디자인적으로 Android.bp 파일은 간단

source.android.com

https://ci.android.com/builds/submitted/12336103/linux/latest/view/soong_build.html

 

Artifact Viewer

 

ci.android.com