Android SDK 버전 속성

Android 애플리케이션은 build.gradle 파일에 여러 SDK 버전 속성을 설정할 수 있습니다. Android build.gradle 문서에서는 이러한 속성이 일반적으로 애플리케이션에 무엇을 의미하는지 설명합니다. 이 문서에서는 NDK 빌드에 이러한 속성이 미치는 영향을 설명합니다.

compileSdkVersion

이 속성은 NDK 빌드에 영향을 주지 않습니다. NDK의 API 가용성은 대신 minSdkVersion의 영향을 받습니다. C++ 기호가 처음에 호출될 때(자바에서처럼) 느리게 결정되기보다 라이브러리 로드 시간에 빠르게 결정되기 때문입니다. minSdkVersion에서 사용할 수 없는 기호를 사용하면 최신 API가 없는 OS 버전에서 이러한 API의 호출 여부와 상관없이 라이브러리가 로드되지 않습니다.

targetSdkVersion

자바와 마찬가지로 앱의 targetSdkVersion은 네이티브 코드의 런타임 동작을 변경할 수 있습니다. 가능한 경우 시스템에서 동작 변경은 targetSdkVersion이 변경이 도입된 OS 버전 이상인 앱에만 적용됩니다.

애플리케이션 개발자는 일반적으로 앱의 targetSdkVersion을 알지만 이 API는 사용자가 선택할 targetSdkVersion을 알 수 없는 라이브러리 개발자에게 유용합니다.

런타임 시 android_get_application_target_sdk_version()을 호출하여 애플리케이션에서 사용하는 targetSdkVersion을 가져올 수 있습니다. 이 API는 API 수준 24 이상에서 사용할 수 있습니다. 이 함수에는 다음 서명이 있습니다.

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

기타 동작 변경사항은 기기 API 수준에 따라 다를 수 있습니다. android_get_device_api_level()을 호출하여 애플리케이션이 실행되는 기기의 API 수준을 가져올 수 있습니다. 이 함수에는 다음 서명이 있습니다.

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

maxSdkVersion

이 속성은 NDK 빌드에 영향을 주지 않습니다.

minSdkVersion

build.gradle 파일에서 설정된 minSdkVersion은 빌드 시간에 사용할 수 있는 API를 결정하고(자바 빌드와 다른 이유를 알아보려면 compileSdkVersion 참고) 코드와 호환되는 최소 버전의 OS를 결정합니다.

애플리케이션의 minSdkVersion__ANDROID_API__ 매크로를 통해 전처리기에서 사용할 수 있습니다. 이 매크로는 Clang에서 자동으로 정의되므로 사용을 위해 헤더를 포함할 필요가 없습니다. NDK 빌드에서는 이 매크로가 항상 정의됩니다.

minSdkVersion은 NDK에서 코드를 컴파일할 때 사용할 수 있는 기능을 결정하는 데 사용됩니다. 예를 들어 이 속성은 libc에서 사용되는 FORTIFY 기능을 결정하고 이전 버전의 Android와 호환되지 않는 바이너리의 성능이나 크기를 개선할 수도 있습니다(GNU 해시 또는 RELR). 새 API를 사용하지 않더라도 이 속성은 코드의 최소 지원 OS 버전에 계속 적용됩니다. 그런데도 라이브러리가 이전 버전의 OS에서 로드될 수 있습니다. NDK 버전이나 OS 버전, 개별 기기에 따라 다를 수 있으므로 이 속성에 의존하지 마세요.