2017-04-19 3 views
0

필자는 Android API를 사용하는 내 응용 프로그램의 고유 부분에 대해 (FBH)를 사용하여 API 레벨을 15로 지정하고 대상 API를 17로 지정하는 Android 앱을 보유하고 있습니다. 일반적으로 android-15 (<ndk>/platforms/android-15) AFAIK는 NDK를 통해 최소 목표가 설정되어야하기 때문에.Android NDK에서 Android Manifest의 최소 API보다 높은 API를 사용하는 것이 맞습니까?

그러나, 당신은 NDK 측에 android-21최소을 사용하지 않는 strtold 같은 기호를 제대로 정의되지 않는 NDK의 R14의 연타 + LLVM의 STL에 버그가있는 것 같습니다.

제 질문은 에 컴파일 된 *.so을 사용하고 15의 최소 SDK 및 17의 대상 SDK를 대상으로하는 APK를 사용했을 때의 반향은 무엇입니까? 이걸로 도망 갈 수 있을까?

+0

대상 API를 21로 올리면 어떨까요? 최소 15 개를 유지할 수 있으며 문제가 있다는 것에 대해 걱정할 필요가 없습니다. 런타임 권한을 피하려고 필사적으로 노력하고 있습니까? –

+0

런타임 권한이 API 23 –

+1

에서 실행됩니다. "하지만, 'strtold'와 같은 기호가 제대로 정의되지 않으면 NDK r14에 Clang + LLVM STL에 버그가있는 것 같습니다. NDK 측. " 이것은 버그가 아닙니다. 'android-21'은'strtold'을 가진 안드로이드의 첫 번째 버전입니다. –

답변

0

짧은 대답 : 아니오. Common Problems doc을 참조하십시오.

NDK의 대상 API 수준은 Java에서 targetSdkVersion과 매우 다른 의미입니다. NDK 타겟 API 레벨은 앱의 최소 API 레벨입니다. ndk-build에서 이것은 귀하의 APP_PLATFORM 설정입니다.

라이브러리가 처음 호출 될 때가 아니라로드 될 때 기능 참조가 (일반적으로) 해결되므로 항상 존재하지는 않는 API를 참조 할 수 없으며 API 수준 검사로 API 사용을 보호 할 수 없습니다. 그들이 전혀 언급되지 않았다면, 반드시 참석해야합니다.

좀 더 길고, 더 답답한 답변입니다. 특별한 경우에만 실제로 높지 않습니다. 예를 들어 NDK에는 android-20이 없습니다. 이 경우 android-19로 돌아갈 것이므로 NDK 대상 API를 minSdkVersion이 19 인 android-20으로 설정하는 것이 좋습니다. 실제로 안드로이드 19를 사용하게 될 것이기 때문입니다.

+0

우리는 계속 서로 부딪 히고있는 것처럼 보입니다 :-P –

+0

STL을 정적으로 연결하고 있다면이게 정말로 중요한가요? –

+0

여기도 여기에 없어요. C 라이브러리는 정적으로 링크되지 않습니다. –

0

ndk에서 최소값을 지정하는 것이 머리말을 포함하고 해당 안드로이드 릴리스와 함께 제공되는 라이브러리에 대한 링크를 포함한다는 것을 기억한다면. 이것은 이론 상으로는 1)만큼 오래 될 것입니다. 라이브러리는 이전 버전에 존재하며 2) 라이브러리는 이전 버전과 호환되는 ABI입니다. 즉, 클래스 정의 나 존재 여부, 심볼의 부재 또는 위치가 바이너리에서 변경되지 않았 음을 의미합니다. 일반적으로 리눅스는 ABI 호환성을 유지하는 데는 탁월합니다.하지만 안드로이드와 함께 사용하는 것은 쉽지 않습니다. Google은 언제 어디서나 추가하고 제거하는 것처럼 보입니다. 사실상 아무 이유없이 그것을 좋아할 것입니다. 이전 버전에서 ABI 호환성을 깨 버리거나 보존 할 때 광고를하지 않습니다.

최신 버전의 플랫폼에 연결된 라이브러리를로드하려고하면 최신 버전의 Android에서도 loadlibrary 코드로 경고합니다. 어느 쪽이 좋게 보이지 않습니다. (나는 이것을 상상했을 것임)

이 모든 것은 당신이 아마 그렇게해서는 안된다고 말하고 있습니다. 아마도 LLVM STL을 사용하지 않거나 정적으로 연결하는 것이 좋습니다. LLVM STL은 플랫폼 21 이전의 장치에는 포함되어 있지 않으므로 정의되지 않은 심볼의 소스이므로 해당 슬롯과 대상을 연결할 수 없습니다 그 장치들.

+0

두 번째 및 세 번째 단락이 올바르지 않습니다. NDK STL은 장치에 제공되지 않지만 사용자의 응용 프로그램과 함께 제공됩니다. libC++는 android-21 (또는 더 새로운 것)까지는 사용할 수없는 것을 사용하지만, 그 정의는 구형 장치의'libandroid_support '에 의해 제공됩니다. –

+0

호기심에서 각 앱이 자신의 사본을 번들로 묶어 놓으면 런타임 링크를 동적으로 연결하는 것이 무엇입니까? 나는 그들이 여전히 가능한 한 메모리에서 중복 제거된다고 가정한다. 예를 들어, Microsoft는 앱과 런타임을 묶는 것을 좋아하지 않습니다. 대신 그들은 당신이 핫픽스 런 타임 등을 허용하기 위해 설치 프로그램을 번들하는 것을 선호합니다. –

+0

앱에 공유 라이브러리가 여러 개인 경우, 정적 공유 라이브러리가 아닌 공유 STL을 사용해야합니다. 공유 라이브러리가 하나뿐이라면 실제로 정적 라이브러리를 사용하는 것이 좋습니다. –