Application.mk

황제낙엽 2017.03.28 18:00 조회 수 : 28

sitelink1 https://developer.android.com/ndk/guides/application_mk.html 
sitelink2  
sitelink3  

이 문서에서는 앱에서 요구하는 네이티브 모듈을 설명하는 Application.mk 빌드 파일에 대해 설명합니다. 모듈은 정적 라이브러리, 공유 라이브러리 또는 실행 파일일 수 있습니다.

이 문서를 읽기 전에 개념 및 Android.mk 페이지를 먼저 읽어보시는 것이 좋습니다. 그러면 이 페이지에서 다루는 내용에 대한 이해도가 훨씬 높아질 것입니다.

개요


Application.mk 파일은 실제로는 컴파일을 위한 여러 가지 변수를 정의하는 작은 GNU Makefile 프래그먼트입니다. 이 파일은 보통 $PROJECT가 애플리케이션의 프로젝트 디렉터리를 가리키는 $PROJECT/jni/ 아래에 있습니다. 다른 방법으로는 최상위 $NDK/apps/디렉터리의 하위 디렉터리에 이 파일을 넣는 방법이 있습니다. 예:

 

$NDK/apps/<myapp>/Application.mk

여기서 <myapp>은 NDK 빌드 시스템에 대한 앱을 설명하는 데 사용되는 짧은 이름입니다. 이것이 실제로 생성된 공유 라이브러리나 최종 패키지로 이동하는 것은 아닙니다.

변수


APP_PROJECT_PATH

이 변수는 앱의 프로젝트 루트 디렉터리의 절대 경로를 저장합니다. 빌드 시스템은 이 정보를 사용하여 불필요한 내용을 모두 빼고 생성되는 JNI 공유 라이브러리의 기본 버전을 APK 생성 도구에 알려진 특정 위치에 넣습니다.

Application.mk 파일을 $NDK/apps/<myapp>/ 아래에 두는 경우 이 변수를 정의해야 합니다. $PROJECT/jni/ 아래에 둘 경우 이 변수는 선택 사항입니다.

APP_OPTIM

이 선택적 변수는 release나 debug로 정의합니다. 애플리케이션의 모듈을 빌드할 때 이 변수를 사용해 최적화 수준을 변경합니다.

릴리스 모드가 기본값이며, 이 모드에서는 고도로 최적화된 바이너리가 생성됩니다. 디버그 모드에서는 최적화되지 않은 바이너리가 생성되는데, 디버그하기 훨씬 더 쉽습니다.

참고로, 릴리스 또는 디버그 바이너리를 디버그할 수 있습니다. 하지만 릴리스 바이너리는 디버깅 중에 제공하는 정보의 양이 적습니다. 예를 들어, 빌드 시스템은 몇 가지 변수를 최적화하여 이러한 변수를 검사하지 못하게 합니다. 또한, 코드를 다시 정렬하면 코드를 순차적으로 실행하기가 더 어려워질 수 있고, 스택 추적이 안정적으로 이루어지지 않을 수 있습니다.

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

APP_CFLAGS

이 변수는 빌드 시스템이 모듈 중 어느 하나에 대해 C 또는 C++ 소스 코드를 컴파일할 때 컴파일러로 전달하는 C 컴파일러 플래그 집합을 저장합니다. 필요로 하는 애플리케이션에 따라 Android.mk 파일 자체를 수정할 필요 없이 이 변수를 사용하여 주어진 모듈의 빌드를 변경할 수 있습니다.

이러한 플래그의 모든 경로는 최상위 NDK 디렉터리에 대한 상대 경로여야 합니다. 예를 들어, 다음과 같이 설정된 경우를 생각해봅시다.

sources/foo/Android.mk
sources/bar/Android.mk

foo/Android.mk에서 컴파일 중에 bar 소스에 경로를 추가하겠다고 지정하려면 다음 코드를 사용해야 합니다.

APP_CFLAGS += -Isources/bar

또는 다음 코드를 사용해도 됩니다.

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

-I../bar는 -I$NDK_ROOT/../bar와 같은 것이므로 효과가 없을 것입니다.

참고: android-ndk-1.5_r1에서는 이 변수가 C++ 소스가 아니라 C 소스에서만 효과가 있습니다. 그 이후의 모든 버전에서는 APP_CFLAGS가 전체 Android 빌드 시스템과 일치합니다.

APP_CPPFLAGS

이 변수는 빌드 시스템이 C++ 소스만 빌드할 때 컴파일러로 전달하는 일련의 C++ 컴파일러 플래그를 포함합니다.

참고: android-ndk-1.5_r1에서는 이 변수가 C 소스와 C++ 소스에서 모두 효과가 있습니다. 이후의 모든 NDK 버전에서는 APP_CPPFLAGS가 전체 Android 빌드 시스템과 일치합니다. C 소스와 C++ 소스에 모두 적용되는 플래그에 대해서는 APP_CFLAGS를 사용하세요.

APP_LDFLAGS

빌드 시스템이 애플리케이션을 링크할 때 전달하는 링커 플래그의 집합입니다. 이 변수는 빌드 시스템이 공유 라이브러리와 실행 파일을 빌드할 때만 관련됩니다. 빌드 시스템이 정적 라이브러리를 빌드할 때는 이러한 플래그를 무시합니다.

APP_BUILD_SCRIPT

기본적으로, NDK 빌드 시스템은 jni/ 아래에서 Android.mk로 명명된 파일을 찾습니다.

이 동작을 재정의하려면 대체 빌드 스크립트를 가리키도록 APP_BUILD_SCRIPT를 정의하면 됩니다. 빌드 시스템은 절대 경로가 아닌 경로를 항상 NDK의 최상위 디렉터리에 대한 상대 경로로 해석합니다.

APP_ABI

기본적으로, NDK 빌드 시스템은 armeabi ABI에 대한 기계어 코드를 생성합니다. 이 기계어 코드는 소프트웨어 부동 소수점 연산 기능이 있는 ARMv5TE 기반 CPU에 해당합니다. APP_ABI를 사용하여 다른 ABI를 선택할 수 있습니다. 표 1은 다양한 명령 집합에 대한 APP_ABI 설정을 나타낸 것입니다.

표 1. 다양한 명령 집합에 대한 APP_ABI 설정

명령 집합
ARMv7 기반 기기에 대한 하드웨어 FPU 명령 APP_ABI := armeabi-v7a
ARMv8 AArch64 APP_ABI := arm64-v8a
IA-32 APP_ABI := x86
Intel64 APP_ABI := x86_64
MIPS32 APP_ABI := mips
MIPS64(r6) APP_ABI := mips64
지원되는 모든 명령 집합 APP_ABI := all

참고: all은 NDKr7부터 사용할 수 있습니다.

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

APP_ABI := armeabi armeabi-v7a x86 mips

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

APP_PLATFORM

이 변수는 대상 Android 플랫폼의 이름을 포함합니다. 예를 들어, android-3은 Android 1.5 시스템 이미지를 지정합니다. 플랫폼 이름과 그에 상응하는 Android 시스템 이미지의 전체 목록은 Android NDK 네이티브 API 를 참조하세요.

APP_STL

기본적으로, NDK 빌드 시스템은 Android 시스템에서 제공하는 최소 C++ 런타임 라이브러리에 대한 C++ 헤더(system/lib/libstdc++.so)를 제공합니다. 뿐만 아니라, 이 시스템에는 자체 애플리케이션을 사용하거나 이러한 애플리케이션에 링크할 수 있는 대체 C++가 구현되어 있습니다. APP_STL을 사용하여 이들 중 하나를 선택하면 됩니다. 지원되는 런타임과 이러한 런타임이 제공하는 기능에 대한 자세한 내용은 NDK 런타임과 기능을 참조하세요.

APP_SHORT_COMMANDS

전체 프로젝트에 대해 Application.mk에 있는 LOCAL_SHORT_COMMANDS와 같은 역할을 합니다. 자세한 내용은 Android.mk에서 이 변수에 대한 관련 문서를 참조하세요.

NDK_TOOLCHAIN_VERSION

GCC 컴파일러의 버전을 선택하려면 이 변수를 4.9나 4.8로 정의하세요. 버전 4.9는 64비트 ABI에 대한 기본 버전이고, 4.8은 32비트 ABI에 대한 기본 버전입니다. Clang의 버전을 선택하려면 이 변수를 clang3.4clang3.5 또는 clang으로 정의하세요. clang을 지정하면 최신 버전의 Clang이 선택됩니다.

APP_PIE

Android 4.1(API 레벨 16)부터는 Android의 동적 링커가 위치에 독립적인 실행 파일(PIE)을 지원합니다. Android 5.0(API 레벨 21)부터는 실행 파일에 PIE가 필요합니다. PIE를 사용하여 실행 파일을 빌드하려면 -fPIE 플래그를 설정하세요. 이 플래그는 코드 위치를 무작위로 지정하여 메모리 손상 버그를 악용하기 더 어렵게 만듭니다. 기본적으로, ndk-build는 프로젝트가 android-16 이상을 대상으로 하는 경우 이 값은 자동으로 true로 설정됩니다. 이를 true 또는 false로 수동 설정할 수도 있습니다.

이 플래그는 실행 파일에만 적용됩니다. 공유 라이브러리나 정적 라이브러리를 빌드할 때는 아무런 영향도 미치지 않습니다.

참고: PIE 실행 파일은 4.1 이전의 Android 릴리스에서는 실행할 수 없습니다.

이 제한 사항은 실행 파일에만 적용됩니다. 공유 라이브러리나 정적 라이브러리를 빌드할 때는 아무런 영향도 미치지 않습니다.

APP_THIN_ARCHIVE

이 프로젝트에 있는 모든 정적 라이브러리 모듈에 대해 Android.mk 파일에서 LOCAL_THIN_ARCHIVE의 기본값을 설정합니다. 자세한 내용은 Android.mk에서 LOCAL_THIN_ARCHIVE에 대한 관련 문서를 참조하세요.