Android.bp

Android.bp

Android.bp 파일에 대해서 파악해보고, APP 빌드시에 사용되는 옵션에 대해서 살펴보자.

안드로이드 7.0 이전 버젼에서는 Android.mk 파일을 빌드로 사용하였는데, 이후 버젼에서는 Soong 빌드 시스템을 이용한 Android.bp 시스템으로 변경되었다.


참고자료

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

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


android_app 모듈

android_app은 Android Build System에서 사용되는 Android.bp 파일의 한 유형입니다. 이 모듈은 Android 애플리케이션을 빌드하기 위해 필요한 설정과 지침을 제공합니다.

android_app 모듈을 사용하면 애플리케이션의 리소스, 매니페스트 파일, 네이티브 코드 등을 포함하는 전체 패키지를 빌드할 수 있습니다.

android_app 모듈은 일반적으로 다음과 같은 필드를 포함합니다:

  • name: 애플리케이션 모듈의 이름을 지정합니다.
  • srcs: 애플리케이션에 포함되는 Java 소스 파일을 지정합니다.
  • manifest: 애플리케이션의 Android 매니페스트 파일을 지정합니다.
  • resource_dirs: 애플리케이션의 리소스 디렉토리를 지정합니다.
  • static_libs 또는 shared_libs: 애플리케이션이 종속하는 라이브러리 모듈을 지정합니다.
  • package_name: 애플리케이션의 패키지 이름을 지정합니다.
  • privileged: 시스템 권한이 있는 프라이빌리지드 애플리케이션 여부를 지정합니다.
  • platform_apis: true: 플랫폼 API에 액세스할 수 있는지를 나타내는 플래그입니다.
  • android_app 모듈은 cc_module 모듈과 상호작용할 수도 있습니다.

예를 들어, 애플리케이션에 C/C++ 네이티브 코드가 포함되어 있는 경우, cc_module 모듈을 정의하여 해당 코드를 빌드하고 android_app 모듈에서 종속성으로 지정할 수 있습니다.

Android.bp 파일을 사용하여 애플리케이션의 빌드를 정의하면 Android Build System이 해당 지침에 따라 애플리케이션을 빌드하고 패키징하여 APK(Android Package) 파일을 생성합니다.

android_app AIDL Example

// Copyright (C) 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package {
default_applicable_licenses: ["Android-Apache-2.0"],
}

android_app {
name: "PACKAGE_NAME",

manifest: "src/main/AndroidManifest.xml",

srcs: [
"src/**/*.kt",
"src/**/I*.aidl",
],

libs: [
"android.car",
],

static_libs: [
"androidx.appcompat_appcompat",
],

aidl: {
local_include_dirs: ["src/main/aidl"],
},

platform_apis: true,

certificate: "platform",

privileged: true,

}

Android.bp 파일 상세 설명

라이선싱 정보

코드는 저작권 정보와 Apache License 2.0에 따라 라이선스가 부여되었음을 나타내는 헤더로 시작합니다. 이 라이선스는 모든 사용자가 해당 코드를 Apache License 2.0에 따라 사용할 수 있다는 것을 의미합니다. 라이선스 전문은 http://www.apache.org/licenses/LICENSE-2.0에서 확인할 수 있습니다.

패키지 정보

이 애플리케이션의 Android 패키지 이름은 "PACKAGENAME"로 지정되어 있습니다. 이는 앱의 고유한 식별자로 사용됩니다.

매니페스트 파일

"src/main/AndroidManifest.xml"에 있는 매니페스트 파일의 경로가 지정되어 있습니다. 매니페스트는 Android 앱의 구성 정보를 포함하고 있습니다.

소스 코드

앱의 소스 코드 파일은 "src//*.kt"와 "src//I*.aidl"로 지정되어 있습니다. 이것은 Kotlin 파일과 "I"로 시작하는 AIDL 파일을 모두 포함합니다.

libs

해당 애플리케이션이 의존하는 네이티브 라이브러리(Native library)를 지정하는 데 사용(Java나 Kotlin으로 작성된 코드뿐만 아니라 C/C++로 작성된 네이티브 코드도 포함할 수 있습니다. "android.car" 라이브러리를 사용합니다.

static_libs

이 속성은 해당 애플리케이션이 의존하는 정적 라이브러리(static library)를 지정하는 데 사용되며, 빌드될 때 함께 컴파일되고 애플리케이션에 포함됩니다.

"androidx.appcompat_appcompat" 라이브러리를 사용합니다. 라이브러리는 앱에서 필요로 하는 기능들을 제공합니다.

"androidx.appcompat_appcompat"는 AndroidX 라이브러리 중 하나로, 앱의 호환성과 일관성을 제공하기 위해 사용되는 지원 라이브러리입니다. 이 라이브러리는 Android 프레임워크의 기능과 레이아웃을 이전 버전의 Android OS와 호환되도록 지원하며, 또한 최신 Android 버전과도 호환성을 유지할 수 있도록 도와줍니다.


AIDL

AIDL (Android Interface Definition Language) 디렉토리의 경로가 "src/main/aidl"로 지정되어 있습니다. AIDL은 Android 앱 간의 인터페이스를 정의하기 위해 사용되는 언어입니다.

해당 부분이 설정되어 있어야, AIDL 파일 간의 통신이 가능하게 됩니다.

플랫폼 API

"platform_apis"가 true로 설정되어 있습니다. 이는 이 앱이 Android 플랫폼 API에 접근할 수 있음을 의미합니다.

안드로이드 플랫폼 API를 사용해야 하는지 여부 설정. false로 설정할 경우 Android API 사용 불가합니다.

인증서:

"certificate"는 "platform"으로 설정되어 있습니다. 이는 앱이 플랫폼 인증서로 서명되었음을 나타냅니다.

특권 앱:

"privileged"가 true로 설정되어 있습니다. 이는 이 앱이 특정 시스템 권한을 갖고 실행되는 특권 앱임을 의미합니다.

애플리케이션을 특권(privileged) 애플리케이션으로 설정하는 데 사용합니다.

특권 애플리케이션은 시스템의 특정 권한과 기능에 액세스할 수 있는 특권을 가지고 있습니다. 

이러한 특권은 일반적으로 안드로이드 플랫폼의 핵심 기능이나 시스템 레벨의 작업을 수행하는 데 필요합니다.

위의 코드 조각은 Android 애플리케이션의 기본 빌드 구성을 정의하는데 사용되며, 빌드 시스템에 의해 이에 따라 앱이 빌드 및 패키징됩니다.

AIDL 옵션 

AIDL(Automation Interface Definition Language)은 Android 앱 간의 인터페이스를 정의하기 위해 사용되는 언어입니다. 주로 서로 다른 앱 또는 프로세스 간에 통신이 필요한 경우에 사용되며, Android 시스템 서비스와 앱 간의 통신, IPC(Inter-Process Communication)를 가능하게 합니다.

해당 AIDL 속성들을 설명하겠습니다:

include_dirs (문자열 리스트): 

aidl 도구에 전달되는 최상위 디렉토리입니다. 이 디렉토리는 aidl 도구가 인터페이스를 컴파일할 때 사용되는 import문의 경로를 설정하는 데 사용됩니다.

local_include_dirs (문자열 리스트): 

Android.bp 파일을 기준으로 하는 디렉토리입니다. 이 디렉토리에 있는 aidl 파일들은 aidl 도구에서 컴파일할 때 사용됩니다.

export_include_dirs (문자열 리스트): 

해당 모듈에 의존하는 모듈의 aidl 소스에 추가할 include 디렉토리입니다. 또한 해당 모듈 자체의 aidl에도 사용됩니다.

generate_traces (부울): 

이 인터페이스에 대해 systrace를 생성할지 여부를 결정합니다. systrace는 Android 시스템의 작업을 추적하고 성능을 분석하는 데 사용되는 도구입니다.

generate_get_transaction_name (부울): 

Binder#GetTransaction 이름 메소드를 생성할지 여부를 나타냅니다. 이 메소드는 Binder 트랜잭션의 이름을 가져오는 데 사용됩니다.

enforce_permissions (부울): 

모든 인터페이스에 필수 권한(annotation)을 추가해야하는지 여부를 지정합니다. 이를 통해 IPC를 통한 통신에 보안을 강화할 수 있습니다.

enforce_permissions_exceptions (문자열 리스트): 

권한(annotation)이 필요하지 않은 인터페이스를 허용하는 인터페이스의 예외 목록입니다. 일시적으로 권한이 필요하지 않은 인터페이스를 설정할 때 사용됩니다.

flags (문자열 리스트):

 AIDL 컴파일러에 전달되는 플래그 리스트입니다. 이 플래그들은 AIDL 컴파일 시 동작을 수정하거나 커스터마이징하는 데 사용됩니다.

댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super