Android NDK r14
안드로이드 NDK (Native Development Kit) r14 버전이 공개되었습니다. 안드로이드 스튜디오의 SDK Manager를 통해 설치하거나 다음 링크를 통해
다운로드할 수 있습니다. r14의 새로운 점은 무엇일까요? 전체 변경 사항은
여기에서 확인할 수 있습니다. 주요 사항은 다음과 같이 정리해볼 수 있습니다.
- 모든 플랫폼 헤더를 통합 헤더로 업데이트했습니다(아래에서 자세히 다룸).
- 이제 Clang을 포함한 LTO가 Darwin과 Linux에서 작동합니다.
- libc++가 업데이트되었습니다. 이제 특수한 소멸자가 있는 정적 함수에 대해 thread_local를 사용할 수 있습니다(Clang만 해당).
- RenderScript가 돌아왔습니다!
통합 헤더
NDK에서 안드로이드 플랫폼 헤더 파일을 제공하는 방법이 개선되었습니다. 이제 API 레벨마다 각각의 헤더 세트를 제공하는 대신 하나의 단일 헤더 세트가 제공됩니다.
#if __ANDROID_API__ >= __ANDROID_API_FOO__ 전처리기 지시문을 통해, 각 플랫폼 버전별로 지원되는 API만 헤더 파일에 포함됩니다.
이전에는 주기적으로 플랫폼 헤더를 확인 후 개별 API 레벨에 맞는 새로운 헤더 파일을 생성했습니다. 따라서, 만약 기존 헤더 파일에 버그가 발생있는 경우, 예외적인 경우를 제외하면, 새롭게 만들어진 최신 버전의 헤더 파일에만 버그가 수정되었습니다. 이제는 NDK API 레벨에 관계없이 버그 수정이 가능합니다.
따라서, 안드로이드 플랫폼 대상 버전과 관계없이 최신 Linux UAPI 헤더에 액세스할 수 있게 됩니다. 이는 주로 기존 Linux 코드(특히 로우 레벨 코드)를 이식하는 개발자분들에게는 큰 도움이 될 것 입니다. 다만, 주의할 점이 있습니다. 단지 헤더 파일에 정의되어 있다고 해서 기기에서 모든 syscall을 지원할 수 있는새로운 커널로 실행하고 있다는 의미는 아닙니다. 지원하지 않는 함수를 호출하는 경우
ENOSYS 오류가 발생합니다.
통합 헤더에는 Linux 헤더 외에 OpenGL, OpenSLES 등의 최신 헤더도 포함되어 있습니다. 기존에는 KitKat까지 GLES3 라이브러리를 사용할 수 없었지만, 이제 Ice Cream Sandwich에서 GLES3 헤더에 액세스할 수 있습니다. 여전히
dlopen/
dlsym을 통해 모든 API 호출을 사용해야 하지만, 최소한 이 함수를 호출하는 데 필요한 모든 상수와
#defines에 액세스할 수 있습니다. 앞으로 출시될 r16 버전에서는 이전 헤더를 모두 제거할 예정입니다. 통합 과정이 부드럽게 진행될 수 있도록, 새로운 통합 헤더를 테스트하시고, 문제가 발생하면 저희에게 알려주세요.
주의 사항
API
#ifdef 가드는 OpenGL에 있는 가드처럼 타사 헤더에 존재하지 않습니다. 이 경우 대상 API 레벨에서 사용할 수 없는 API를 사용하면 컴파일 오류가 아닌 링크 오류(정의되지 않은 참조)가 나타납니다.
GCC를 사용하는 독립 실행형 툴체인은 기본적으로 지원되지 않으며 앞으로도 그럴 것입니다. GCC를 사용하려면 컴파일 시
-D__ANDROID_API__=$API를 전달하세요.
빌드 시 통합 헤더 사용
개발자들이 쉽게 적응할 수 있도록, 기본적으로 기존 플랫폼 버전 별 헤더가 적용되며, 통합 헤더를 사용하기 위해서는 빌드 방식에 따라 다음과 같은 약간의 추가적인 설정이 필요합니다. 참고로, r15 버전에서는 통합 해더가 Default 옵션으로 적용될 예정입니다.
ndk-build
Application.mk에서
APP_UNIFIED_HEADERS := true
다음과 같이 명령줄로부터 이 속성을 설정할 수도 있습니다.
$ ndk-build APP_UNIFIED_HEADERS=true
externalNativeBuild로 Gradle을 통해 ndk-build를 사용하는 경우, build.gradle에서 다음 구성 설정을 지정하세요.
android {
...
defaultConfig {
...
externalNativeBuild {
ndkBuild {
...
arguments "APP_UNIFIED_HEADERS=true"
}
}
}
}
CMake
빌드 구성 시
ANDROID_UNIFIED_HEADERS=ON으로 설정하세요. 대개
cmake -DANDROID_UNIFIED_HEADERS=ON $OTHER_ARGS를 사용하여 CMake를 호출하는 형식을 취합니다.
externalNativeBuild로 Gradle을 통해 CMake를 사용 중인 경우 다음 코드를 사용할 수 있습니다.
android {
...
defaultConfig {
...
externalNativeBuild {
cmake {
...
arguments "-DANDROID_UNIFIED_HEADERS=ON"
}
}
}
}
독립 실행형 툴체인
독립 실행형 툴체인 생성 시
--unified-headers를 전달하세요. 이전 스크립트
make-standalone-toolchain.sh에서는 현재 이 옵션을 사용할 수 없고
make_standalone_toolchain.py에서만 사용할 수 있습니다.
시험용 Gradle 플러그인
곧 출시 예정입니다!
여기를 클릭해 살펴보세요.
맞춤 빌드 시스템이란?
추가 정보가 필요하세요? 빌드 시스템에 통합 헤더에 대한 지원을 추가하는 방법은
여기에서 찾을 수 있습니다.
통합 헤더에 대한 추가 정보는
관련 문서와
버그 추적을 참조하세요. 다음 릴리스를 미리 보려는 경우
마스터 브랜치에 최신 버전의 설명서가 있습니다.