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.4
, clang3.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
에 대한 관련 문서를 참조하세요.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
» | Application.mk | 황제낙엽 | 2017.03.28 | 177 |
7 | ABI 관리 | 황제낙엽 | 2017.03.28 | 627 |
6 | 안드로이드의 ABI 관리 | 황제낙엽 | 2017.03.28 | 173 |
5 |
안드로이드 두지점(위도,경도) 사이의 거리
![]() | 황제낙엽 | 2017.01.25 | 343 |
4 |
[JUnit4] 테스트 클래스 만들기
![]() | 황제낙엽 | 2016.11.16 | 133 |
3 | Do it! 안드로이드 앱 프로그래밍 [개정 3판 마시멜로] | 황제낙엽 | 2016.11.07 | 196 |
2 | 안드로이드 강좌 (작성중) [1] | 황제낙엽 | 2015.01.26 | 210 |
1 |
Get the Android SDK + Installing the Eclipse Plugin + Android SDK setup + 안드로이드 ICS 크롬 디버깅
![]() | 황제낙엽 | 2013.10.22 | 276 |