Application.mk

이 문서는 ndk-build에서 사용하는 Application.mk 빌드 파일을 설명합니다.

이 문서를 읽기 전에 개념 페이지를 먼저 읽어보시는 것이 좋습니다.

개요

Application.mk는 ndk-build의 프로젝트 전체 설정을 지정하며, 기본적으로 애플리케이션 프로젝트 디렉터리의 jni/Application.mk에 있습니다.

변수

APP_ABI

기본적으로 NDK 빌드 시스템은 지원 중단되지 않은 모든 ABI용 코드를 생성합니다. APP_ABI 설정을 사용하여 특정 ABI용 코드를 생성할 수 있습니다. 표 1은 서로 다른 명령 세트에 대한 APP_ABI 설정을 보여줍니다.

표 1. 다양한 명령 집합을 위한 APP_ABI 설정

명령 집합
32-bit ARMv7 APP_ABI := armeabi-v7a
64-bit ARMv8(AArch64) APP_ABI := arm64-v8a
x86 APP_ABI := x86
x86-64 APP_ABI := x86_64
지원되는 모든 ABI(기본값) APP_ABI := all

같은 줄에 여러 값을 배치하고 각각의 값은 공백으로 구분하여 여러 개의 값을 지정할 수도 있습니다. 예:

APP_ABI := armeabi-v7a arm64-v8a x86

지원되는 모든 ABI 목록과 사용 및 제한사항에 관한 자세한 내용은 Android ABI를 참고하세요.

APP_ASFLAGS

프로젝트의 모든 어셈블리 소스 파일(.s.S 파일)의 어셈블러에 전달되는 플래그입니다.

APP_ASMFLAGS

모든 YASM 소스 파일의 경우 YASM에 전달되는 플래그입니다(.asm, x86/x86_64에만 적용).

APP_BUILD_SCRIPT

기본적으로 ndk-build는 Android.mk 파일이 프로젝트 루트의 상대적인 jni/Android.mk에 있다고 가정합니다.

다른 위치에서 Android.mk 파일을 로드하려면 APP_BUILD_SCRIPT를 Android.mk 파일의 절대 경로로 설정하세요.

APP_CFLAGS

프로젝트의 모든 C/C++ 컴파일을 위해 전달되는 플래그입니다.

APP_CONLYFLAGS, APP_CPPFLAGS도 참조하세요.

APP_CLANG_TIDY

프로젝트의 모든 모듈에서 clang-tidy를 사용하려면 true로 설정하세요. 기본적으로 사용 중지됩니다.

APP_CLANG_TIDY_FLAGS

프로젝트의 모든 clang-tidy 실행을 위해 전달할 플래그입니다.

APP_CONLYFLAGS

프로젝트의 모든 C 컴파일을 위해 전달되는 플래그로, C++ 코드에는 사용되지 않습니다.

APP_CFLAGS, APP_CPPFLAGS도 참조하세요.

APP_CPPFLAGS

프로젝트의 모든 C++ 컴파일을 위해 전달되는 플래그로, C 코드에는 사용되지 않습니다.

APP_CFLAGS, APP_CONLYFLAGS도 참조하세요.

APP_CXXFLAGS

APP_CPPFLAGS와 동일하지만 컴파일 명령어에서 APP_CPPFLAGS 뒤에 표시됩니다. 예:

APP_CPPFLAGS := -DFOO
APP_CXXFLAGS := -DBAR

위 구성을 사용하면 clang++ -DBAR -DFOO보다는 clang++ -DFOO -DBAR과 비슷한 컴파일 명령어가 실행됩니다.

APP_DEBUG

디버깅할 수 있는 애플리케이션을 빌드하려면 true로 설정하세요.

APP_LDFLAGS

실행 파일과 공유 라이브러리를 연결할 때 전달되는 플래그입니다.

APP_MANIFEST

AndroidManifest.xml 파일의 절대 경로입니다.

$(APP_PROJECT_PATH)/AndroidManifest.xml)이 있는 경우 기본적으로 사용됩니다.

APP_MODULES

빌드할 모듈의 명시적인 목록입니다. 이 목록의 요소는 Android.mk 파일의 LOCAL_MODULE에 표시되는 모듈의 이름입니다.

기본적으로 ndk-build는 모든 공유 라이브러리, 실행 파일 및 이들 파일의 종속 항목을 빌드합니다. 프로젝트에서 정적 라이브러리를 사용하거나, 프로젝트에 정적 라이브러리 포함되어 있거나, APP_MODULES에 정적 라이브러리 이름이 지정된 경우에만 정적 라이브러리가 빌드됩니다.

APP_OPTIM

이 선택적 변수를 release 또는 debug로 정의하세요. 출시 바이너리는 기본적으로 빌드됩니다.

출시 모드는 최적화를 사용 설정하고 디버거와 함께 사용할 수 없는 바이너리를 생성할 수 있습니다. 디버그 모드는 디버거를 사용할 수 있도록 최적화를 사용 중지합니다.

릴리스 또는 디버그 바이너리를 디버깅할 수 있습니다. 하지만 출시 바이너리는 디버깅 중에 제공하는 정보의 양이 적습니다. 예를 들어 변수가 최적화되어 검사를 차단할 수 있습니다. 또한 코드를 다시 정렬하면 코드를 순차적으로 실행하기가 더 어려워질 수 있고 스택 트레이스가 안정적으로 이루어지지 않을 수 있습니다.

애플리케이션 매니페스트의 <application> 태그에 android:debuggable을 선언하면 이 변수의 기본값이 release가 아닌 debug가 됩니다. 이 기본값을 재정의하려면 APP_OPTIMrelease로 설정하세요.

APP_PLATFORM

APP_PLATFORM은 이 애플리케이션이 빌드된 Android API 수준을 선언하며 애플리케이션의 minSdkVersion에 상응합니다.

지정하지 않으면 ndk-build가 NDK에서 지원하는 최소 API 수준을 타겟팅합니다. 최신 NDK에서 지원하는 최소 API 수준은 항상 거의 모든 활성 기기를 지원할 수 있을 만큼 낮습니다.

예를 들어 android-16의 값은 라이브러리가 Android 4.1(API 수준 16) 미만에서는 이용할 수 없는 API를 사용하며 낮은 플랫폼 버전을 실행하는 기기에서는 사용할 수 없다는 것을 의미합니다. 플랫폼 이름과 그에 상응하는 Android 시스템 이미지의 전체 목록은 Android NDK 네이티브 API를 참고하세요.

Gradle 및 externalNativeBuild를 사용할 때는 이 매개변수를 직접 설정하면 안 됩니다. 대신 minSdkVersion 속성을 모듈 레벨 build.gradle 파일의 defaultConfig 또는 productFlavors 블록에 설정하세요. 이렇게 하면 라이브러리가 적절한 버전의 Android를 실행하는 기기에 설치된 앱에서만 사용되도록 할 수 있습니다.

NDK에는 Android의 모든 API 수준을 위한 라이브러리가 포함되어 있는 것은 아닙니다. 새로운 네이티브 API가 포함되지 않은 버전은 NDK 공간을 절약하기 위해 생략되었습니다. ndk-build는 다음과 같이 선호도의 내림차순으로 사용합니다.

  1. APP_PLATFORM과 일치하는 플랫폼 버전
  2. 다음으로 사용할 수 있는 APP_PLATFORM 미만의 API 레벨입니다. 예를 들어 APP_PLATFORMandroid-20일 때는 android-20에 새로운 네이티브 API가 없으므로 android-19가 사용됩니다.
  3. NDK에서 지원하는 최소 API 수준

APP_PROJECT_PATH

프로젝트 루트 디렉터리의 절대 경로입니다.

APP_SHORT_COMMANDS

LOCAL_SHORT_COMMANDS에 해당하는 프로젝트 전체 자세한 내용은 Android.mkLOCAL_SHORT_COMMANDS에 관한 문서를 참조하세요.

APP_STL

이 애플리케이션에 사용할 C++ 표준 라이브러리입니다.

기본적으로 system STL이 사용됩니다. c++_shared, c++_static, none을 선택할 수도 있습니다. NDK C++ 런타임 및 기능을 참고하세요.

APP_STRIP_MODE

이 애플리케이션에 포함된 모듈의 strip에 전달되는 인수입니다. 기본값은 --strip-unneeded입니다. 모듈의 모든 바이너리를 제거하지 않으려면 none으로 설정하세요. 다른 스트립 모드에 관한 자세한 내용은 스트립 문서를 참조하세요.

APP_THIN_ARCHIVE

프로젝트의 모든 정적 라이브러리에 씬 아카이브를 사용하려면 true로 설정하세요. 자세한 내용은 Android.mkLOCAL_THIN_ARCHIVE에 관한 문서를 참조하세요.

APP_WRAP_SH

이 애플리케이션과 함께 포함될 wrap.sh 파일의 경로입니다.

ABI 일반 변형에서와 마찬가지로 다음과 같이 각 ABI에 이 변수의 변형이 있습니다.

  • APP_WRAP_SH
  • APP_WRAP_SH_armeabi-v7a
  • APP_WRAP_SH_arm64-v8a
  • APP_WRAP_SH_x86
  • APP_WRAP_SH_x86_64