본문 바로가기

Programming/Android

Application.mk란?

Application.mk란? (https://developer.android.com/ndk/guides/application_mk?hl=ko)

  • 이 문서는 ndk-build에서 사용되는 Application.mk 빌드 파일에 대해 설명한다.
  • 개요

    • Application.mk 파일은 실제로는 컴파일을 위한 여러 가지 변수를 정의하는 작은 GNU Makefile 프래그먼트이다. 이것은 보통 $PROJECT/jni/ 아래에 위치하는데, 여기에서 PROJECT가 애플리케이션의 프로젝트 디렉토리를 포인팅한다. 다른 방법으로는 최상위 NDK/apps/ 디렉토리의 하위 디렉토리에 이 파일을 넣는 방법이 있다. 예:

      $NDK/apps/<myapp>/Application.mk
    • 여기서 은 NDK 빌드 시스템에 대한 앱을 설명하는 데 사용되는 짧은 이름이다. 이것은 실제로 생성된 공유 라이브러리나 최종 패키지 안에 들어가지는 않는다.

  • 변수

    • APP_PROJECT_PATH

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

      • 이 변수를 정의하면 이것은 ndk-build에 상응하는 모듈과 그에 종속되는 모듈만 빌드하도록 지시한다. 이것은 반드시 공백으로 구분된 모듈 이름이어야 하며, 그 형태는 Android.mk 파일의 LOCAL_MODULE 정의에 표시되는 대로 따라야 한다.
      • 이 변수가 정의되지 않은 경우, ndk-build는 설치 가능한 모든 최상위 수준 모듈의 목록을 찾는다. 다시 말해, Android.mk 파일 및 여기에 직접적으로 포함되는 모든 파일에 의해 기재된 목록이 여기에 해당된다. 그러나 가져온 모듈은 최상위 수준이 아니다.
      • 설치 가능한 모듈이란 공유 라이브러리 또는 실행 가능한 것으로, 이는 libs/$ABI/에 파일을 생성하게 된다.
      • 이 변수가 정의되지 않았고 프로젝트 내에 설치 가능한 최상위 수준 모듈이 없는 경우, ndk-build는 그 대신 모든 최상위 수준 정적 라이브러리와 그 종속성을 빌드한다. 이러한 라이브러리는 평상시와 같은 위치, 즉 obj/ 또는 obj-debug/ 아래에 배치된다.
    • APP_OPTIM

      • 이 선택적 변수는 release나 debug로 정의한다. 애플리케이션의 모듈을 빌드할 때 이 변수를 사용해 최적화 수준을 변경한다.
      • 릴리스 모드가 기본값이며, 이 모드에서는 고도로 최적화된 바이너리가 생성된다. 디버그 모드에서는 최적화되지 않은 바이너리가 생성되는데, 디버그하기 훨씬 더 쉽다.
      • 참고로 릴리스 또는 디버그 바이너리는 양쪽 다 디버그할 수 있다. 하지만 릴리스 바이너리는 디버깅 중에 제공하는 정보의 양이 적다. 예를 들어, 빌드 시스템은 몇 가지 변수를 최적화해 이러한 변수를 검사하지 못하게 한다. 또한, 코드를 다시 정렬하면 코드를 순차적으로 실행하기가 더 어려워질 수 있고, 스택 추적이 안정적으로 이루어지지 않을 수 있다.
      • 애플리케이션 매니페스트의 에서 android:debuggable 태그를 선언하면 이 변수의 기본 값이 debug로 설정된다. APP_OPTIM을 release로 설정해 이 기본값을 재정의해라.
    • APP_CFLAGS

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

      • 이러한 플래그의 모든 경로는 최상위 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 와 같은 것이므로 효과가 없을 것이다.

    • APP_CPPFLAGS

      • 이 변수는 빌드 시스템이 C++ 소스만 빌드할 때 컴파일러로 전달하는 일련의 C++ 컴파일러 플래그를 포함한다.
        C 및 C++에 플래그를 지정하려면 APP_CFLAGS를 사용해라.
    • APP_LDFLAGS

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

      • 기본적으로, NDK 빌드 시스템은 jni/ 아래에서 Android.mk로 명명된 파일을 찾는다.
      • 이 동작을 재정의하려면 대체 빌드 스크립트를 포인팅하도록 APP_BUILD_SCRIPT를 정의하면 된다. 빌드 시스템은 절대 경로가 아닌 경로를 항상 NDK의 최상위 디렉토리에 대한 상대 경로로 해석한다.
    • APP_ABI

      • 기본적으로, NDK 빌드 시스템은 지원이 중단되지 않은 모든 ABI에 대한 기계어 코드를 생성한다.
        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 |
        | 지원되는 모든 명령 집합 | APP_ABI := all |

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

        APP_ABI := armeabi-v7a arm64-v8a x86
    • APP_PLATFORM

      • 이 변수는 지원하고자 하는 최소 Android 플랫폼 버전을 포함한다. 예를 들어 android-15 값은 라이브러리가 Android 4.0.3(API 레벨 15) 미만에서는 이용할 수 없는 API를 사용하며, 구동하는 플랫폼 버전이 낮은 기기에서는 사용할 수 없다는 것을 의미한다. 플랫폼 이름과 그에 상응하는 Android 시스템 이미지의 전체목록은 Android NDK 네이티브 API를 참조해라.
      • 이 플래그를 직접 변경하는 대신, defaultConfig 내의 minSdkVersion 속성 또는 모듈 수준 build.gradle 파일의 productFlavors 블록을 설정해야 한다. 이렇게 하면 라이브러리가 적절한 버전의 Android를 구동 중인 기기에 설치된 앱에서만 사용되도록 할 수 있다. ndk-build 툴체인은 다음의 논리를 사용해 빌드하는 ABI 및 지정한 minSdkVersion을 기반으로 라이브러리의 최소 플랫폼 버전을 선택한다.
        1. ABI에 minSdkVersion과 동일한 플랫폼 버전이 존재하는 경우, ndk-build는 해당 버전을 사용한다.
        2. 그렇지 않은 경우, 즉 플랫폼 버전이 ABI의 minSdkVersion보다 낮은 경우에는 ndk-build가 그러한 플랫폼 버전 중 가장 높은 것을 사용한다.
        3. 그렇지 않은 경우, ndk-build는 다음으로 이용 가능한 플랫폼 버전 중 minSdkVersion보다 높은 것을 사용한다.
    • APP_STL

      • NDK 빌드 시스템의 기본값은 STL 'system'이다. 그 외의 선택지는 'c++_shared', 'c++_static', 'none'이다. NDK 런타임 및 기능을 참조해라.
    • APP_SHORT_COMMANDS

      • 프로젝트 전체의 Application.mk 내 LOCAL_SHORT_COMMANDS와 동일하다. 자세한 내용은 이 변수에 대한 Android.mk 문서를 참조해라.
    • APP_THIN_ARCHIVE

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

'Programming > Android' 카테고리의 다른 글

ABI에 대해 여러 개의 APK 구성  (0) 2019.07.01
AndroidManifest란?  (0) 2019.05.19
Android.mk란?  (0) 2019.05.19
ABI란?  (0) 2019.04.22
NDK란?  (0) 2019.04.17