본문 바로가기

Programmer/모바일

Android NDK libc++_shared.so 16KB 페이지 사이즈 경고 해결 정리

1. 문제 상황

Google Play Console에 AAB 업로드 시 아래와 같은 경고가 발생했다.

APK does not support 16 KB devices
4 KB LOAD section alignment, but 16 KB is required

 

APK Analyzer로 확인해보면 문제의 원인은 다음 네이티브 라이브러리들이었다.

  • libc++_shared.so
  • libopencv_java4.so
  • FFmpeg 관련 so 파일들

특히 libc++_shared.so가 16KB 페이지 사이즈 정렬을 만족하지 않아
Android 14 / 16KB page size 디바이스에서 설치 불가 경고가 발생했다.


2. libc++_shared.so란?

libc++_shared.so는

  • Android NDK에서 제공하는 C++ 표준 라이브러리 런타임
  • 여러 네이티브 라이브러리가 공유해서 사용하는 공통 라이브러리

즉,

  • OpenCV
  • FFmpeg
  • 자체 native-lib

이 모두가 간접적으로 의존하고 있다.

이 파일이 문제 있으면 앱 전체가 문제


3. 처음에 시도했던 잘못된 접근

❌ 1) libc++_shared.so 삭제

  • 빌드는 되지만
  • 런타임에서 native crash 발생
  • OpenCV / FFmpeg 사용 불가

❌ 2) OpenCV 최신 버전만 교체

  • libopencv_java4.so는 교체되지만
  • libc++_shared.so는 그대로
  • 경고 해결 안 됨

❌ 3) zipalign, strip 등 후처리

  • ELF LOAD section alignment는 변경 불가
  • 효과 없음

4. 근본 원인

핵심 원인 한 줄 요약

libc++_shared.so가 16KB page size로 빌드되지 않았기 때문

 

Android 14부터 일부 기기들은

  • 메모리 페이지 크기 = 16KB
  • 기존 4KB 정렬 ELF는 로딩 불가

즉, NDK 빌드 단계에서 이미 16KB 정렬이 되어 있어야 한다


5. 해결 방법 (정답)

libc++_shared → static 링크로 변경

공유 라이브러리(libc++_shared.so)를 사용하지 않고 정적 라이브러리(c++_static)로 빌드

5-1. build.gradle 설정

 
android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                arguments(
                    "-DANDROID_STL=c++_static",
                    "-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-z,max-page-size=16384",
                    "-DCMAKE_EXE_LINKER_FLAGS=-Wl,-z,max-page-size=16384"
                )
            }
        }

        ndk {
            abiFilters "arm64-v8a"
        }
    }
}

포인트

  • c++_static 사용 → libc++_shared.so APK에 포함되지 않음
  • 각 so가 자기 안에 C++ 런타임을 포함
  • 16KB 정렬 정상 반영

6. 결과

APK Analyzer 결과

  • ❌ libc++_shared.so → 완전히 사라짐
  • ✅ 모든 so 파일 → 16KB LOAD section alignment 만족
  • ✅ Google Play Console 경고 제거

7. 추가로 발생한 경고 (정상 동작)

“6,294개 기기 더 이상 지원하지 않음”

원인

ndk { abiFilters "arm64-v8a" }
  • armeabi-v7a 미지원
  • 32bit 기기 제외

의도한 동작이며 정책 위반 아님
OpenCV / FFmpeg 사용하는 앱에서는 흔한 선택


8. 결론

요약

  • 문제의 핵심은 OpenCV가 아니라 libc++_shared.so
  • 16KB page size 대응은 후처리로 해결 불가
  • 빌드 단계에서 static STL 사용이 유일한 현실적 해결책

한 줄 결론

Android 14 + NDK + OpenCV 사용 시
libc++_shared.so를 쓰지 말고 c++_static으로 빌드하자


9. 참고 대상

이 글은 다음과 같은 사람에게 특히 도움이 된다.

  • OpenCV / FFmpeg 사용하는 Android 앱
  • Google Play Console 16KB 경고로 막힌 경우
  • AAB 업로드는 되는데 “지원 기기 감소” 경고가 뜨는 경우