이 문서는 ndk-build
에서 사용하는 Application.mk
빌드 파일을 설명합니다.
이 문서를 읽기 전에 개념 페이지를 먼저 읽어보시는 것이 좋습니다.
개요
Application.mk
는 ndk-build의 프로젝트 전체 설정을 지정하며, 기본적으로 애플리케이션 프로젝트 디렉터리의 jni/Application.mk
에 있습니다.
변수
APP_ABI
기본적으로 NDK 빌드 시스템은 지원이 중단되지 않은 모든 ABI용 코드를 생성합니다. APP_ABI
설정을 사용해 특정 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_OPTIM
을 release
로 설정하세요.
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는 다음과 같이 선호도의 내림차순으로 사용합니다.
APP_PLATFORM
과 일치하는 플랫폼 버전- 다음으로 사용할 수 있는
APP_PLATFORM
미만의 API 레벨입니다. 예를 들어APP_PLATFORM
이android-20
일 때는 android-20에 새로운 네이티브 API가 없으므로android-19
가 사용됩니다. - NDK에서 지원하는 최소 API 수준
APP_PROJECT_PATH
프로젝트 루트 디렉터리의 절대 경로입니다.
APP_SHORT_COMMANDS
LOCAL_SHORT_COMMANDS
의 프로젝트 범위 버전입니다. 자세한 내용은 Android.mk의 LOCAL_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.mk의 LOCAL_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