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 컴파일 시 동작을 수정하거나 커스터마이징하는 데 사용됩니다.
댓글
댓글 쓰기