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 업로드는 되는데 “지원 기기 감소” 경고가 뜨는 경우
'Programmer > 모바일' 카테고리의 다른 글
| 모바일 담당자 없는 프로젝트에서 GPT로 FFmpegKit 크래시 해결하기 (0) | 2026.03.19 |
|---|---|
| iOS WebView 앱에서 음성 녹음 → 파일 생성 → 서버 업로드 구현 정리 (0) | 2026.02.04 |