본문으로 이동

빌드 오류 해부

앱이 16 KB 메모리 페이지 크기를 지원해야 한다는 경고, 이렇게 해결합니다

Play Console은 문제 하나만 알려 주고 누구 책임인지는 말해 주지 않습니다. 번들 안의 어떤 네이티브 라이브러리가 아직 4 KB 메모리 페이지 기준으로 빌드되어 있다는 뜻입니다. 이 글에서는 정확히 어떤 .so 파일인지 찾아내고, 그 파일을 담아 온 의존성이 무엇인지 알려 드리며, 사용하시는 프레임워크에서 가장 짧은 해결 경로와, 다시 업로드하기 전에 빌드가 깨끗하다는 것을 증명할 명령어까지 드립니다.

2027년 2월 1일 출시 차단 시작
API 35+ 적용 범위, 64비트 기기
2**14 최소 ELF 정렬
.so 네이티브 코드부터 확인

지금 살아 있는 기한은 어느 쪽인가

경고 단계, 출시 차단은 아직 시행 전
161 요건을 못 맞춘 업데이트가 차단되기까지 남은 일수
2 어딘가에서 읽으셨을 이전 기한 두 개, 둘 다 대체됨
2025년 11월 1일 최초 2026년 5월 31일 연장 2027년 2월 1일 현행 오늘

2026년 8월 5일에 마지막으로 갱신된 Google의 현행 문서는, Android 15(API 레벨 35) 이상을 타깃으로 하는 앱은 64비트 기기에서 16 KB 메모리 페이지 크기를 지원해야 하며 2027년 2월 1일부터는 그렇지 않은 업데이트를 출시할 수 없다고 밝히고 있습니다. 검색 결과에서 2025년 11월 1일이나 2026년 5월 31일을 보셨다면, 날짜가 바뀌기 전에 쓰인 글입니다.

빠른 답변

Google Play는 Android 15(API 레벨 35) 이상을 타깃으로 하는 앱이 64비트 기기에서 16 KB 메모리 페이지 크기를 지원하도록 요구하며, 2027년 2월 1일부터는 그렇지 않은 업데이트를 출시할 수 없습니다. 라이브러리와 SDK를 포함해 Java나 Kotlin으로만 작성된 앱은 이미 요건을 충족합니다. 네이티브 .so 라이브러리를 담고 있는 앱은 그 전부를 다시 빌드하거나 교체하기 전까지는 통과하지 못합니다. 되도록 Android Gradle Plugin 8.5.1+NDK r28+ 를 쓰시고, 빌드가 서로 다른 두 검사를 모두 통과해야 합니다. 모든 ELF LOAD 세그먼트가 최소 2**14 에 정렬되어야 하고, 앱 번들이 PAGE_ALIGNMENT_16K 를 보고해야 합니다. 프레임워크를 올린 것은 증거가 되지 않습니다. 증거는 결과물입니다. 이 경고를 지우느라 진행 중이던 비공개 테스트(closed testing)가 멈췄다면, 다시 빌드하시는 동안 테스터 쪽은 PrimeTestLab이 계속 돌립니다.

경고는 짧고, 기껏해야 파일 이름 하나를 알려 주며, 빌드가 끝났다고 생각한 다음에야 찾아옵니다. 그래서 늘 같은 세 가지 잘못된 길로 접어듭니다. 이미 바뀐 기한을 믿거나, 프레임워크만 올려 놓고 일이 끝났다고 여기거나, 로컬 APK 하나만 확인하고 정작 Google이 빌드에 쓰는 번들은 들여다보지 않는 것입니다. 이 글은 문제가 실제로 풀리는 순서대로 짰습니다. 확인하고, 원인을 지목하고, 고치고, 증명합니다. 모든 내용은 2026년 8월 5일 기준이며, Google의 페이지 크기 가이드가 마지막으로 갱신된 바로 그날 대조했습니다. 근거가 공식 릴리스 노트가 아니라 유지보수자의 이슈 트래커인 경우에는 사실로 반올림하지 않고 카드에 그대로 밝혀 두었습니다.

세 단계로 해결하기

이 오류의 진짜 해결책은 언제나 같은 세 동작을 같은 순서로 밟는 것입니다. 정렬되지 않은 네이티브 라이브러리를 찾아내고, 그 파일을 담고 있는 의존성을 업데이트하고, 업로드하려는 결과물을 확인합니다. 곧바로 2단계로 건너뛰기 때문에 그토록 많은 개발자가 프레임워크를 올리고 다시 빌드한 뒤에도 경고가 그대로 돌아오는 것을 보게 됩니다.

요구사항 자체는 범위가 좁습니다. Google의 페이지 크기 가이드는 Android 15(API 레벨 35) 이상을 타깃으로 하는 앱이 64비트 기기에서 16 KB 메모리 페이지 크기를 지원해야 하며, 2027년 2월 1일부터는 그렇지 않은 업데이트를 출시할 수 없다고 밝힙니다. 적용 대상은 네이티브 코드뿐입니다. 앱과 그 안의 모든 라이브러리와 SDK가 순수 Java 또는 Kotlin이라면 이미 16 KB 기기를 지원한다고 Google이 명시합니다. 문제는 이 경고를 본 개발자 대부분이 자기가 그 범주에 든다고 믿지만 실제로는 아니라는 점입니다.

01

문제가 되는 .so 찾아내기

Android Studio에서 Build > Analyze APK...로 출시용 APK를 열고 lib/arm64-v8alib/x86_64를 펼친 뒤 Alignment 열을 보십시오. 표시되는 파일 이름을 전부 적어 두십시오. 그 파일 이름이 손에 쥘 수 있는 유일하게 믿을 만한 검색 키입니다.

찾기 도구 열기
02

그 파일을 담고 있는 쪽 업데이트하기

직접 컴파일한 바이너리는 툴체인으로 해결됩니다. AGP 8.5.1 이상과 NDK r28 이상이면 됩니다. 반면 플러그인, SDK, 엔진, AAR 안에 들어온 바이너리는 그것을 빌드한 쪽만 고칠 수 있으므로, 해야 할 일은 그 패키지를 올리거나 교체하거나 다시 빌드된 결과물을 요청하는 것입니다.

내 프레임워크의 최단 경로 찾기
03

업그레이드가 아니라 결과물 확인하기

서로 독립된 두 검사를 모두 통과해야 합니다. 모든 ELF LOAD 세그먼트가 2**14 이상에 정렬되어야 하고, bundletool이 출시용 번들에 대해 PAGE_ALIGNMENT_16K를 보고해야 합니다. 하나를 통과했다고 해서 다른 하나에 대해 아무것도 증명되지 않습니다.

확인용 명령어 만들기

한 화면에 담은 판단 전체

의존성 버전을 하나라도 바꾸기 전에 이 흐름을 따라가 보십시오. 2분쯤 걸리는데, 맞는 것을 고치는 일과 애초에 문제가 아니었던 패키지 열한 개를 올리는 일의 차이가 여기서 갈립니다.

출시용 APK 안에 .so 파일이 든 lib 폴더가 있습니까?

아니오

이미 충족

APK에 네이티브 코드가 없습니다. Google은 라이브러리와 SDK를 포함해 Java나 Kotlin만 쓰는 앱은 이미 16 KB 기기를 지원한다고 밝힙니다. 그래도 한 번 테스트해 볼 가치는 있고, 업로드한 것과 같은 빌드를 들여다봤는지 확인해 둘 가치도 있습니다.

APK Analyzer 또는 check_elf_alignment.sh가 정렬되지 않은 라이브러리를 지목합니까?

출처를 찾고 올리기

그 정확한 파일 이름을 공급하는 프레임워크, 플러그인, SDK, 엔진이 무엇인지 찾아 그 패키지를 업데이트하십시오. 내 NDK가 남이 미리 빌드해 둔 바이너리를 다시 쓰지는 못합니다.

아니오

출시용 번들에 대해 bundletool dump config는 무엇을 보고합니까?

4K

PAGE_ALIGNMENT_4K

라이브러리는 멀쩡한데 패키징이 문제입니다. AGP 8.5.1 이상으로 올리고 다시 빌드하시거나, 올릴 수 없다면 레거시 패키징 우회책을 적용하십시오.

16K

PAGE_ALIGNMENT_16K

패키징은 올바릅니다. 이제 Play가 생성한 APK를 실제 16 KB 환경에서 테스트하고, 페이지 크기가 고정되어 있다고 가정하는 실행 코드가 없는지 점검하십시오.

한 줄로 정리한 함정

정렬 검사를 전부 통과한 로컬 APK는 업로드한 번들이 올바르다는 것을 증명하지 않습니다. Google은 Android Gradle Plugin 8.3부터 8.5까지가, 내 컴퓨터의 APK는 완벽해 보여도 Play가 그 번들로 빌드한 APK의 ZIP 정렬은 제대로 되지 않은 번들을 만들 수 있다고 특별히 경고합니다. 이 어긋남이 "성공한" 수정 뒤에도 경고가 살아남는 가장 흔한 이유입니다.

Play Console 경고가 실제로 뜻하는 것

Google이 문서로 밝힌 결과는 정확합니다. 2027년 2월 1일부터 Android 15(API 레벨 35) 이상을 타깃으로 하면서 16 KB를 지원하지 않는 업데이트를 출시할 수 없게 됩니다. 업데이트에 대한 출시 차단이지, 이미 게시된 앱이 그날 스토어에서 내려간다는 말이 아닙니다. 그때까지 대부분의 개발자가 보는 것은 업로드가 막히는 거절이 아니라 호환성 경고입니다.

표현이 중요한 이유는, 이 이야기의 공포 버전이 정확한 버전보다 빨리 퍼지기 때문입니다. Google이 실제로 보여 주는 문구를 읽고 나면 적용 범위는 좁고 다룰 만한 크기가 됩니다.

Play Console · App bundle details

App must support 16 KB memory page sizes

Action by Feb 1, 2027
Consequence You won't be able to release app updates
Also shown Extension granted

Google이 페이지 크기 가이드에 실은 Play Console 스크린샷을 그대로 재구성했습니다. 라벨은 그 스크린샷에 있는 그대로 영어로 두었습니다. 실제 Console은 한국어로 표시할 수 있고, 화면 구성과 보이는 버튼도 계정에 따라 다를 수 있습니다.

이 카드를 읽을 때 흔히 두 가지를 잘못 읽습니다. 첫째, "Action by Feb 1, 2027"은 삭제까지 남은 카운트다운이 아닙니다. 같은 페이지의 Google 본문도 결과를 그런 업데이트를 출시할 수 없다는 것으로 설명합니다. 둘째, Extension granted라는 문자열이 Google 스크린샷에 보이기는 하지만, 그것이 지금 나에게 연장 신청 절차가 열려 있다는 근거는 되지 않습니다. 본인 Play Console 안에서 그 선택지가 실제로 보일 때만 연장이 있다고 판단하십시오.

읽으신 기한은 어느 쪽인가요?

세 개의 날짜가 돌아다니고 있고 살아 있는 것은 하나뿐입니다. 보신 날짜를 고르시면, 2026년 8월 5일에 마지막으로 갱신된 Google의 현행 문서와 대조해 상태를 알려 드립니다.

도구 01

기한 판별기

날짜를 고르시면 아직 유효한지 알려 드립니다.

Google은 이 기한을 한 번 이상 옮겼습니다. 2027년 2월 1일을 기준으로 출시 계획을 세우기 전에, 직접 페이지 크기 가이드를 열고 하단의 "Last updated" 표시를 확인하십시오. 이 습관 하나가 이 글을 포함해 어떤 기사에 인쇄된 날짜보다 값집니다.

16 KB 요구사항이 내 앱에도 해당되나요

이것을 결정하는 것은 프레임워크가 아니라 생성된 APK의 내용물입니다. lib 아래에 .so 파일이 있다면 C++ 파일을 한 번도 열어 본 적이 없어도 적용 대상이고, 하나도 없다면 이미 16 KB 기기를 지원한다는 것이 Google 자신의 안내입니다.

순수 Java 또는 Kotlin 앱

이 부분에서 Google은 분명합니다. 앱과 그 안의 모든 라이브러리와 SDK가 Java 또는 Kotlin만 쓴다면 그 앱은 이미 16 KB 기기를 지원합니다. 다만 예기치 못한 회귀를 잡기 위해 16 KB 환경에서 테스트해 보라고 권장하는데, 에뮬레이터 한 번 돌리는 비용입니다.

함정은 "그 안의 모든 라이브러리와 SDK"라는 표현입니다. 데이터베이스, 분석, 크래시 리포팅, 미디어, 지도, 머신러닝, 보안 의존성 중 하나만으로도, 소스에는 Kotlin밖에 없는 프로젝트에 네이티브 바이너리가 들어올 수 있습니다. "나는 C++를 안 썼다"는 증거가 아닙니다. 증거는 lib 폴더입니다.

Flutter, React Native, Unity, Kivy, 노코드 빌더

이 스택들은 설계상 네이티브 런타임, 엔진 바이너리, 플러그인 라이브러리를 함께 담기 때문에 거의 언제나 적용 대상입니다. Google은 네이티브 라이브러리를 쓰는 서드파티 앱 빌더를, 작성자가 C나 C++를 전혀 쓰지 않았어도 앱이 영향을 받는 경로로 명시적으로 언급합니다. 달라지는 것은 네이티브 코드가 있느냐가 아니라 문제가 되는 조각을 어느 패키지가 넣었느냐입니다. 그래서 파일 이름의 출처를 밝히는 일이 어떤 업그레이드보다 먼저 옵니다.

확인하는 방법, 정확히

Android Studio Build Analyze APK... lib/

출시용 APK를 열고 lib를 펼친 뒤 그 안의 ABI 폴더를 보십시오. 보통 arm64-v8ax86_64입니다. 공유 오브젝트 파일이 하나라도 있으면 앱이 네이티브 코드를 쓰고 있다는 뜻입니다. .so 파일도 lib 폴더도 없다면 이 APK는 네이티브 코드를 전혀 쓰지 않습니다. 분석기의 Alignment 열은 정렬에 문제가 있는 파일에 경고를 띄우는데, "뭔가 잘못됐다"에서 파일 이름까지 가는 가장 빠른 길입니다.

도구 02

해당 여부 진단

01 지금 앱의 타깃은 무엇입니까?

02 APK Analyzer로 출시용 APK를 열어 보십시오. lib 폴더가 있습니까?

03 앱을 가장 잘 설명하는 것은 무엇입니까?

04 출시용 번들에 bundletool dump config를 돌려 보셨습니까?

4 KB 바이너리가 16 KB 기기에서 실패하는 이유

메모리 페이지는 커널이 한 번에 매핑하는 가장 작은 블록입니다. Android는 오랫동안 4 KB 페이지를 써 왔고, Android 15부터 16 KB 페이지로 구성된 기기를 지원하기 시작했습니다. 네이티브 라이브러리는 자기 세그먼트가 어떤 정렬을 기준으로 링크되었는지를 기록해 두는데, 그 값이 기기의 페이지 크기보다 작으면 로더가 세그먼트를 페이지 경계에 놓을 수 없습니다.

구조는 이게 전부이고, 계속 마주치게 될 그 숫자도 이것으로 설명됩니다. 정렬은 2의 거듭제곱으로 표시합니다. 2**12는 4096바이트, 2**14는 16384바이트입니다. Google의 규칙은 네이티브 라이브러리의 모든 LOAD 세그먼트가 2**14 이상에 정렬되어야 한다는 것입니다. 2**14로 빌드된 라이브러리는 4 KB 기기와 16 KB 기기 모두에서 동작합니다. 16384가 4096의 깔끔한 배수이기 때문입니다. 반대로 2**12로 빌드된 라이브러리는 작은 페이지 크기에서만 동작합니다. 이 비대칭 때문에 해결책은 언제나 "정렬을 올린다"이지 "기기를 판별한다"가 아닙니다.

도구 03

페이지 시각화

라이브러리가 보고하는 정렬 값을 고르시면, 16 KB 페이지를 쓰는 기기에서 그 세그먼트가 시작할 수 있는 위치를 보여 드립니다.

통과

라이브러리 바깥에는 완전히 별개인 두 번째 제약이 하나 더 있습니다. APK 안에 압축하지 않고 저장된 네이티브 라이브러리는 ZIP 아카이브 안에서도 16 KB 경계에 놓여야 합니다. 이것은 패키징 속성이고, zipalign으로 확인하며 빌드 플러그인이 설정합니다. 안에 든 라이브러리가 전부 완벽하게 정렬되어 있어도 이쪽이 틀어질 수 있습니다. 이 두 개념을 분리해서 기억하는 것이 이 섹션에서 가져가실 수 있는 가장 쓸모 있는 한 가지입니다.

숫자 읽는 법

llvm-objdump 출력에서 2**14가 보이면 통과입니다. 2**13이나 2**12는 실패입니다. 부분 점수도 없고 "거의 다 됐다"도 없습니다. 한 ABI의 한 라이브러리에서 정렬되지 않은 LOAD 세그먼트가 하나만 있어도 계정에 경고가 그대로 남습니다.

프레임워크별 가장 짧은 해결법

프레임워크의 준비 상태와 앱의 요건 충족은 서로 다른 이야기입니다. React Native 0.77과 Unity의 지원 버전들은 실제로 문서화된 기준선입니다. Flutter에는 검증 가능한 보편적 최소 버전이 없습니다. 어느 경우든 업그레이드는 프레임워크 자신의 바이너리를 고칠 뿐, 서드파티 플러그인은 있던 그대로 요건을 못 맞춘 채 남습니다.

도구 04

프레임워크 찾기

    
                

    이걸 해도 여전히 실패할 수 있는 것

    기준선을 한 표에 모으면

    프레임워크 문서로 확인된 기준선 가장 짧은 행동 확신 수준
    Flutter 검증된 보편 최소 버전 없음, 문서로 확인된 준비 기준점은 3.38 (기본 NDK r28) 현재 안정 버전, 네이티브 플러그인 업데이트, 정리, 재빌드, 라이브러리 전수 확인 부분 확인
    React Native 0.77 지원되는 업그레이드 경로, 그다음 네이티브 모듈과 공급업체 SDK 업데이트 확인됨
    Unity 6.1 계열 6000.1 이상 에디터 업그레이드, 패키지와 플러그인 업데이트, 재빌드 확인됨
    Unity 6 LTS 6000.0.38f1 이상 위와 동일 확인됨
    Unity 2022 LTS 2022.3.56f1 이상 위와 동일 확인됨
    Unity 2021 2021.3.48f1 이상, 확장 LTS 자격 필요 자격이 있으면 업그레이드, 없으면 지원되는 에디터로 이전 확인됨
    Unity Burst 1.8.21 이상 lib_burst_generated.so 가 지목되면 Burst 업그레이드 확인됨
    네이티브 Android NDK r28+ 와 AGP 8.5.1+ 내 코드 재컴파일, 미리 빌드된 의존성 전부 업데이트 확인됨
    오래된 NDK에 고정 r27 이하 + 링커 옵션 두 개 max-page-sizecommon-page-size 추가, 모든 라이브러리 재빌드 동작하지만 권장 아님
    Kivy 또는 Python 빌더 보편적으로 확인된 버전 없음 빌더와 레시피 업데이트, 정확한 파일 이름을 상위에 전달 공급업체에 달림
    노코드 빌더 보편적으로 확인된 버전 없음 공급업체의 요건 충족 빌드 스택에서 재생성, 파일 이름 전달 공급업체에 달림

    확신 수준 라벨은 이 페이지 어디에서나 같은 뜻입니다. 확인됨은 현행 1차 출처가 직접 그렇게 밝힌 경우입니다. 부분 확인은 믿을 만한 출처가 핵심 주장은 뒷받침하지만 세부 구현까지는 아닌 경우입니다. 보고됨은 근거가 공식 릴리스 노트가 아니라 유지보수자의 이슈 트래커나 개발자 보고인 경우입니다.

    오류를 일으키는 라이브러리를 정확히 찾기

    파일 이름이 조사의 전부입니다. libfoo.so가 문제의 바이너리라는 것을 아는 순간, 질문은 "16 KB 지원을 어떻게 고치지"가 아니라 "libfoo.so는 어느 패키지가 넣는 것이고 더 새로운 버전이 있는가"로 바뀝니다. 뒤쪽 질문에는 답이 있고, 앞쪽 질문에는 없습니다.

    APK Analyzer에서 시작하십시오

    Build > Analyze APK...를 열고 출시용 APK를 불러온 뒤 lib를 펼치십시오. 안에는 ABI마다 폴더가 하나씩 있고, 보통 arm64-v8ax86_64입니다. Alignment 열이 정렬에 문제가 있는 파일에 경고를 표시합니다. Android Studio 자체의 경고와 Lint도 요건을 못 맞춘 네이티브 라이브러리를 짚어 주므로, 같은 사실이 여러 곳에서 보일 수 있습니다.

    버전 번호를 하나라도 건드리기 전에 표시된 파일 이름을 전부 적어 두십시오. 두 ABI 폴더를 따로 확인하십시오. arm64-v8a는 통과하는데 x86_64가 실패하거나 그 반대인 경우는 아주 흔합니다. 서로 다른 바이너리이고 서로 다른 파이프라인에서 빌드되었을 수 있기 때문입니다.

    명령줄 출력 판독하기

    터미널이 편하시다면, Google이 제공하는 check_elf_alignment.sh가 APK에 대해 ALIGNED 또는 UNALIGNED를 보고하고, llvm-objdump로 라이브러리 하나를 직접 들여다볼 수도 있습니다. 둘 다 Android SDK Build-Tools 35.0.0 이상이 필요합니다. 무엇이 출력되든 아래에 붙여 넣으시면 다시 읽어 드립니다.

    도구 05

    ELF 판독기

    llvm-objdump -p file.so | grep LOAD, check_elf_alignment.sh, zipalign -c -P 16의 출력을 붙여 넣으십시오. 모든 처리는 브라우저 안에서 이루어지고 어디로도 업로드되지 않습니다.

    출력을 붙여 넣고 판독하기를 누르십시오.

    어느 의존성이 담고 있는지 알아내기

    Play Console도 APK Analyzer도 파일 이름만 주고 소유자는 알려 주지 않습니다. 아래에 입력하시면 그 바이너리에 대해 알려진 내용을 근거의 질과 함께 알려 드리고, 파일 이름이 이미 들어간 검색 명령어까지 드립니다.

    도구 06

    라이브러리 소유자 조회

    파일 이름을 입력하거나 고르시면 추정 소유자를 알려 드립니다.

    ./gradlew app:dependencies는 해석된 의존성 그래프를 보여 줍니다. 직접 추가한 적도 없는 라이브러리를 끌어온 전이 패키지를 이렇게 찾습니다. 다만 특정 .so가 어느 결과물 안에 들어 있는지는 바로 알려 주지 않으니, 의심되는 AAR 의 압축을 풀어 보는 작업과 짝지어 쓰십시오. Google이 요구하는 절차가 아니라 실무에서 쓰는 진단 기법입니다.

    로컬 APK가 아니라 앱 번들을 확인하십시오

    내 컴퓨터의 APK와 Google Play가 번들에서 생성하는 APK는 서로 다른 결과물입니다. ELF 정렬은 라이브러리 하나하나 안에 있고, ZIP 정렬은 아카이브를 어떻게 묶었는지에 관한 속성이며, 번들은 그중 무엇을 쓸지 Play에 알려 주는 설정을 지니고 있습니다. 이 셋은 서로 어긋날 수 있고, 사용자가 실제로 설치하는 것을 결정하는 것은 마지막 하나입니다.

    이 문제의 가장 답답한 형태가 여기서 나옵니다. 개발자는 전부 업그레이드하고, 로컬 APK를 들여다보고, 깨끗한 출력을 확인하고, 업로드하는데 경고는 그대로 남아 있습니다. 확인한 것들이 틀린 게 아닙니다. Play가 평가하는 대상을 한 번도 확인하지 않았을 뿐입니다.

    내가 확인한 것

    내 컴퓨터의 app-release.apk

    내 하드웨어에서 Gradle이 직접 빌드한, 내 패키징 동작이 반영된 파일입니다. 여기서 zipalign을 통과했다는 것은 이 파일이 올바르게 묶였다는 것을 증명합니다.

    Play가 평가하는 것

    app-release.aab 에서 생성된 APK

    번들이 요청한 정렬을 써서 Google이 빌드한 파일입니다. 번들이 4 KB라고 말하면, 로컬 APK가 아무리 깨끗했어도 이쪽은 틀린 것입니다.

    그러니 업로드하려는 번들에 대해 매번 이것을 실행하십시오.

    bundletool dump config --bundle=app-release.aab | grep alignment

    원하는 결과는 PAGE_ALIGNMENT_16K입니다. PAGE_ALIGNMENT_4K는 번들이 bundletool에 네이티브 라이브러리를 4 KB 경계로 패키징하라고 말하고 있다는 뜻이므로, Play가 그 번들로 빌드하는 APK는 전부 틀리게 됩니다. Google은 Android Gradle Plugin 8.3부터 8.5까지가 바로 이 어긋남을 만들 수 있다고 특별히 경고합니다. 로컬 빌드는 정렬된 것처럼 보이는데, Play가 번들로 빌드한 앱은 16 KB 기기에서 제대로 설치되지 않습니다. 권장되는 해결책은 Android Gradle Plugin 8.5.1 이상으로 올리는 것입니다.

    내 파일 이름이 들어간 명령어 전부

    파일 이름을 한 번만 입력하십시오. 아래 명령어가 전부 그 이름으로 다시 쓰이고, 각 탭마다 통과로 인정되는 정확한 출력을 보여 드립니다. 결과가 좋은 것인지 짐작할 일이 없습니다.

    도구 07

    명령어 실험실

    
                
    통과
    실패

    "APK Analyzer가 정렬됐다고 한다"에서 멈추지 마십시오

    APK 점검을 통과한 것은 네 가지 검사 중 하나이지 결승선이 아닙니다. ELF LOAD 정렬, APK의 ZIP 정렬, 번들 설정, 그리고 Play가 실제로 생성하는 결과물의 실행 동작을 모두 확인하십시오. 이 중 하나만 실패해도, 고쳤다고 믿은 빌드 뒤에 경고가 계정에 그대로 남습니다.

    AGP와 NDK, 그리고 패키징 함정

    버전 두 개가 대부분의 무게를 집니다. NDK r28 이상은 네이티브 코드를 기본적으로 16 KB 정렬로 컴파일하고, Android Gradle Plugin 8.5.1 이상은 압축되지 않은 네이티브 라이브러리를 16 KB ZIP 경계에 올바르게 배치합니다. 다만 둘 중 어느 것도 의존성 안에 미리 컴파일되어 들어온 바이너리를 고쳐 주지는 못합니다.

    위험한 중간 지대는 Android Gradle Plugin 8.3에서 8.5까지입니다. 이 범위에서는 로컬 빌드가 완전히 멀쩡해 보이는데도 bundletool이 Play용으로 번들에서 만들어 내는 APK를 ZIP 정렬하지 않을 수 있고, 결과에 대한 Google의 표현은 단호합니다. 그 번들로 빌드된 앱은 제대로 설치되지 않습니다. 8.5.0을 쓰고 계시고 로컬 APK가 떠올릴 수 있는 모든 검사를 통과한다면, 가장 먼저 배제해야 할 것이 이것입니다.

    도구 08

    툴체인 점검기

    
                

    빌드 설정 참고표

    상황 설정 비고
    권장 NDK r28 이상 기본적으로 16 KB 정렬된 네이티브 결과물 생성
    권장 AGP 8.5.1 이상 압축되지 않은 네이티브 라이브러리를 16 KB ZIP 경계에 배치
    NDK r27 이하 -Wl,-z,max-page-size=16384 모든 네이티브 타깃에 필수인 링커 옵션
    NDK r27 이하 -Wl,-z,common-page-size=16384 최대 페이지 크기 옵션과 함께 사용
    ndk-build LOCAL_LDFLAGS += ... 네이티브 타깃마다 두 옵션 모두 적용
    CMake target_link_options(...) 해당하는 타깃마다 두 옵션 모두 적용
    AGP를 올릴 수 없음 jniLibs.useLegacyPackaging = true 네이티브 라이브러리를 압축, 설치 용량 증가
    AGP 8.0 이하 android.bundle.enableUncompressedNativeLibs=false 위 옵션과 함께 쓰는 추가 레거시 속성
    실행 코드 getpagesize() 또는 sysconf(_SC_PAGESIZE) 고정된 4096 값과 PAGE_SIZE 상수 가정을 대체

    패키징으로는 고칠 수 없는 부분

    직접 쓰신 C나 C++가 페이지 크기를 가정하고 있다면 어떤 빌드 옵션도 구해 주지 못합니다. 고정된 4096 값과 PAGE_SIZE 상수에 기대는 부분을 없애고, 실행 시점에 getpagesize() 또는 sysconf(_SC_PAGESIZE)로 실제 값을 조회하고, 모든 mmap() 호출과 손으로 페이지 정렬하고 있는 인자를 전부 다시 보십시오. 이것은 앱이 16 KB 기기에 깨끗하게 설치되고 번들 검사도 통과한 다음, 메모리 매핑을 처음 건드리는 순간 죽는 유형의 실패입니다.

    작업 순서

    패키징보다 컴파일러 쪽을 먼저 고치십시오. 레거시 패키징 우회책을 먼저 적용하면, 안의 라이브러리는 여전히 4 KB 페이지 기준으로 빌드된 채로 APK가 zipalign을 통과하기 시작합니다. 진짜 문제를 초록색 결과 뒤에 숨겨 버리는 셈입니다.

    실제 16 KB 환경에서 테스트하기

    테스트가 의미를 갖는지는 명령어 한 줄이 결정합니다. adb shell getconf PAGE_SIZE16384를 반환해야 합니다. 세션을 시작할 때마다 실행하십시오. 조용히 4 KB 모드로 부팅된 에뮬레이터는 망가진 빌드가 무엇을 던져도 다 통과하게 놔둡니다.

    현실적인 길이 셋, 전문적인 길이 둘 있습니다. 오늘 당장 닿을 수 있는 쪽을 고르십시오. 페이지 크기 실패를 잡아낸다는 목적에서는 이들 사이에 품질 차이가 없습니다.

    도구 09

    테스트 환경 고르기

      한계

      그다음, 어떤 테스트를 하기 전에도 매번

      adb shell getconf PAGE_SIZE

      출력이 16384가 아니면 진행하지 마십시오.

      실제로 돌려 봐야 할 것

      환경이 확인되고 나면, 쓸모 있는 테스트는 "실행이 되는가"가 아닙니다. 네이티브 실패는 네이티브 코드를 건드리는 기능에 몰리므로 그쪽을 의도적으로 돌리십시오. 콜드 실행, 앱 안에서의 화면 이동, 카메라, 데이터베이스 읽기와 쓰기, 미디어 재생과 녹화, 인증, 백그라운드 작업, 머신러닝이나 증강현실 기능, 모든 네이티브 플러그인이 닿는 화면, 그리고 직접 쓰신 코드 중 메모리 매핑을 쓰는 부분입니다. 방금 올린 라이브러리가 떠받치는 기능이 있다면, 바로 그 기능이 테스트입니다.

      호환 모드는 통과가 아닙니다

      Android는 4 KB로 정렬된 일부 앱을 호환 경로를 통해 16 KB 기기에서 돌릴 수 있고, 그럴 때 첫 실행에서 경고가 보이기도 합니다. Google은 그래도 안정성과 신뢰성을 위해 제대로 된 16 KB 정렬을 권장합니다. 호환 모드가 끼어들어서 겨우 돌아가는 앱은 고쳐진 앱이 아니며, 그 상태로 출시한다는 것은 진짜 실패가 아직 앞에 남아 있다는 뜻입니다.

      고쳐서 올렸는데 경고가 살아남는 이유

      "이미 고쳤는데요"라고 하시는 경우는 거의 전부 열세 가지 구체적인 상황 중 하나이고, 그중 열한 가지는 지금 눈앞에 있는 결과물만으로 증명할 수 있습니다. 해당하는 증상을 고르시면 대개 다 읽기 전에 원인을 아시게 됩니다.

      도구 10

      경고 지속 진단

      가장 유력한 원인

      가장 빠른 행동

      피하십시오

      이 중 두 경우는 자신 있는 답 대신 단서를 다는 편이 맞습니다. Google Play가 업로드된 번들을 다시 평가하는 데 얼마나 걸리는지 못 박은 1차 출처는 없습니다. 그러니 업로드 직후에 경고가 계속 남아 있다면, 처리 시간에 대해 어디서 읽은 특정 숫자를 믿는 대신, 새 버전 코드가 최신 버전 및 app bundle 화면에 나타나는지 확인하고 나중에 다시 보는 것이 정직한 대응입니다. 그리고 호환 모드가 끼어들어서 겨우 돌아가는 앱은 고쳐진 것이 아니라 눈감아 준 것입니다.

      계속 이름이 오르내리는 서드파티 라이브러리

      여기 있는 것은 보고된 사례이지, 각각이 얼마나 흔한지를 매긴 순위도 아니고 특정 버전이 여러분 빌드를 고쳐 준다는 약속도 아닙니다. 어떤 패키지든 어느 릴리스에서나 네이티브 결과물을 추가하거나 제거하거나 교체할 수 있습니다. 최종 권위는 언제나 본인 출시용 번들 안에 들어 있는 바이너리입니다.

      파일 이름이 낯익어 보일 때 출발점으로 쓰시고, 그다음에는 해당 프로젝트의 현재 릴리스와 열린 이슈로 확인하십시오. 근거가 릴리스 노트가 아니라 유지보수자의 이슈 트래커인 경우에는 카드에 그렇게 적어 두었습니다.

      도구 11

      보고된 라이브러리 목록

      ObjectBox Java 미확인

      libobjectbox-jni.so

      예전 Android 네이티브 라이브러리가 16 KB 환경에서 실패했습니다. 어느 버전에서 고쳐졌는지는 여기 싣기에 충분할 만큼 확인되지 않았습니다. ObjectBox의 현재 릴리스 노트에서 16 KB 지원이 추가된 버전을 확인하시고, 버전만 믿지 말고 빌드된 APK 안의 바이너리를 확인하십시오.

      ObjectBox Dart 및 Flutter 미확인

      번들로 들어오는 Android 라이브러리

      ObjectBox의 Dart SDK는 자체 Android 라이브러리를 함께 담습니다. 어느 버전에서 고쳐졌는지는 여기 싣기에 충분할 만큼 확인되지 않았습니다. ObjectBox의 현재 릴리스 노트를 확인하신 다음, 빌드가 실제로 해석해 가져오는 결과물을 직접 확인하십시오.

      sqlite3 네이티브 라이브러리 보고됨

      libsqlite3.so

      영향을 받은 Flutter와 AWS Amplify 패키징에서 오래된 3.43.0 의존성이 나타났습니다. 이슈 근거는 16 KiB 지원이 추가된 버전으로 3.46.1+1 을 지목합니다. 선언한 버전만이 아니라 실제로 해석된 의존성 버전을 확인하십시오. 프레임워크 패키지가 더 낮은 버전을 고정해 둘 수 있습니다.

      Android용 SQLCipher 부분 확인

      sqlcipher-android

      예전 android-database-sqlcipher 패키지는 상위에서 지원이 종료되었고, 유지되는 sqlcipher-android 패키지로 대체되었습니다. 최소 수정 버전으로 실을 만큼 확인된 버전이 없으므로, 현재 유지되는 패키지로 옮기신 뒤 버전 번호를 믿는 대신 빌드된 앱에서 모든 ABI를 검증하십시오.

      FFmpegKit과 그 포크들 미확인

      미디어 처리 바이너리

      원래의 FFmpegKit 저장소는 운영이 종료되었고, 어디에나 안전하다고 할 만한 요건 충족 릴리스는 확인되지 않았습니다. 포크마다 품질이 다릅니다. 빌드가 정확히 어떤 포크를 해석해 가져오는지 확인하고, 그 ABI 결과물을 직접 들여다보고, 어느 하나를 해결책으로 채택하기 전에 유지보수 상태와 출처를 따져 보십시오.

      Realm JavaScript 보고 충돌

      Realm 및 JNI 바이너리

      보고 내용이 서로 어긋납니다. 20.1.0 버전이 지목되었고, 이후 보고에서는 20.2.0 이 Realm 바이너리 하나는 고쳤지만 다른 JNI 바이너리는 여전히 문제였다고 합니다. 책임 있게 하나의 안전한 버전을 지목할 수 없으므로, 올린 다음 Realm이 넣는 라이브러리를 하나하나 확인하십시오.

      MediaPipe Tasks Vision 보고됨

      libmediapipe_tasks_vision_jni.so

      2**12 정렬로 보고되었습니다. 참고한 이슈에서는 수정 릴리스가 확정되지 않았으므로, 호환성을 버전별 문제로 다루십시오. 현재 릴리스 노트를 확인하고, 올리고, 본인 빌드 안의 바이너리를 검증하십시오.

      OpenCV Android 보고됨

      OpenCV Android 결과물

      OpenCV 5.0.0 Android 결과물에 대해 정렬 문제가 보고되었습니다. 저장소 이슈는 CI 수정을 언급하지만, 특정 릴리스 결과물이 안전하다고 확정되지는 않았습니다. 의존하고 계신 바로 그 AAR을 내려받아 압축을 풀고 라이브러리를 직접 확인하십시오.

      Unity Burst 확인됨

      lib_burst_generated.so

      이 파일이 지목되면 Burst 패키지를 1.8.21 이상으로 올리라는 것이 Unity 자신의 안내입니다. 이 목록에서 이슈 보고가 아니라 공급업체 공식 문서로 뒷받침되는 유일한 항목입니다.

      Unity AR 및 기타 플러그인 보고됨

      libUnityARCore.so, libquack.so 등

      커뮤니티 보고는 에디터를 올려도 살아남는 바이너리로 이들을 지목합니다. 각각이 서로 다른 패키지에 속하므로 공통으로 인용할 버전이 없습니다. 정확한 파일 이름을 근거로 어느 패키지를 쫓을지 정하십시오.

      이 목록이 짧은 이유가 있습니다. 이슈 개수는 목소리 큰 사용자가 많은 프로젝트를 보여 줄 뿐, 어떤 라이브러리가 가장 많이 설치되는지는 알려 주지 않습니다. "가장 흔한 원인" 순위표를 싣는 것은 통계를 지어내는 일입니다. 대신 일반화되는 것은 방법입니다. 파일 이름을 잡고, 패키지를 찾고, 그 패키지의 현재 릴리스를 확인하고, 내 빌드 안의 바이너리를 검증하십시오.

      2026년 8월 31일 API 36 기한과의 관계

      두 가지는 한 지점에서만 만나는 서로 독립된 Google Play 요구사항입니다. 타깃 API 레벨을 올리면 16 KB 경고가 드러날 수 있습니다. 이 요구사항이 Android 15(API 레벨 35) 이상을 타깃으로 하는 앱에 적용되기 때문입니다. 레벨을 올리는 것이 정렬 문제를 만들지도 않고, 고쳐 주지도 않습니다.

      Google Play는 2026년 8월 31일부터 신규 앱과 앱 업데이트가 Android 16(API 레벨 36)을 타깃으로 하도록 요구하며, 2026년 11월 1일까지 연장을 신청할 수 있습니다. 이것은 매니페스트와 동작에 관한 변경입니다. 반면 16 KB 규칙은 바이너리 호환성에 관한 변경입니다. 월요일에 targetSdk를 올리고 화요일에 16 KB 경고를 본 개발자는 무언가를 망가뜨린 것이 아닙니다. 네이티브 라이브러리는 이미 4 KB 페이지 기준으로 빌드되어 있었고, 타깃 레벨이 올라가면서 어차피 적용될 검사의 범위 안으로 앱이 들어왔을 뿐입니다.

      요구사항 A

      API 36 타깃
      • 기한 2026년 8월 31일, 2026년 11월 1일까지 연장 가능
      • 대상 신규 앱과 앱 업데이트
      • 위치 매니페스트와 빌드 설정
      • 해결 방법 타깃 레벨을 올리고 Android 16 동작 변경 대응

      요구사항 B

      16 KB 페이지 크기 지원
      • 기한 2027년 2월 1일
      • 대상 64비트 기기에서 API 35+ 를 타깃으로 하는 앱
      • 위치 번들 안에 들어 있는 네이티브 바이너리
      • 해결 방법 정렬이 어긋난 라이브러리를 전부 다시 빌드하거나 교체

      실무에서는 증거가 두 개인 하나의 이전 작업으로 다루십시오. 어차피 타깃 레벨은 올리게 됩니다. API 36 마감에 쫓기다가 뒤늦게 발견하는 대신, 네이티브 라이브러리 점검을 같은 출시 일정에 넣으십시오. 기기 형태별 레벨, 예외, 연장 절차 전체는 Google Play API 36 기한 글에서, 계정부터 프로덕션까지 이어지는 전체 순서는 2026년 게시 요구사항 글에서 확인하실 수 있습니다.

      업로드 전 출시 관문

      각각 통과의 근거가 분명한 검사 열한 개입니다. Play가 뭔가 잘못됐다고 알려 준 뒤가 아니라 업로드 전에 하나씩 밟아 나가시면, 끝을 알 수 없는 디버깅 시간이 끝이 정해진 목록으로 바뀝니다.

      도구 12

      출시 관문

      11개 중 0개 통과

      아직 증명된 것이 없습니다. 마침 열려 있던 마지막 빌드가 아니라, 실제로 업로드하실 빌드로 시작하십시오.

      진행 상황은 이 브라우저에만 저장됩니다. 어디로도 전송되지 않으며, 브라우저 데이터를 지우시면 함께 사라집니다.

      관문 열한 개를 모두 통과했다는 것은 이 페이지가 인용한 검사 기준으로 기술적 정렬을 증명했다는 뜻입니다. 승인을 약속하는 것이 아닙니다. Google Play는 같은 업로드에 대해 이와 무관한 정책, 콘텐츠, 품질 문제를 제기할 수 있고, 어떤 체크리스트도 그 부분을 대신 말해 줄 수 없습니다.

      이 문제가 비공개 테스트와 부딪히는 지점

      이 페이지의 어떤 내용도 테스터 요구사항을 바꾸지 않고, 테스터 쪽 사정이 빌드를 바꾸지도 않습니다. 두 문제는 오직 하나의 축에서 충돌합니다. 바로 시간입니다. 14일 비공개 테스트는 멈출 수 없는 시계 위에서 돌아가고, 네이티브 라이브러리 조사는 아무도 예측할 수 없는 시계 위에서 돌아갑니다.

      아픈 순서는 이렇게 흘러갑니다. 개인 개발자 계정으로 비공개 테스트를 시작하고, 14일 연속 테스트 참여 기간이 돌기 시작합니다. 그리고 그 중간 어디쯤에서 타깃 레벨을 올린 순간 16 KB 경고가 드러납니다. 이제 개발자는 테스터 그룹을 그대로 유지한 채 네이티브 의존성을 다시 빌드해야 합니다. 트랙에 새 빌드를 올리는 것 자체는 문제가 없고, Google도 테스트 중에 계속 업데이트하도록 권장합니다. 진행을 무너뜨리는 것은 테스터 쪽이 조용해지는 일입니다.

      바로 그 부분을 PrimeTestLab이 붙잡아 드립니다. Android 7부터 17까지 걸친 실기기의 실제 테스터 12명을 배정하고, 14일 내내 테스트 참여 상태를 유지합니다. 그래서 다시 빌드하는 동안 무너지는 테스트가 아니라 안정된 테스트를 상대하게 됩니다. 테스트는 4~6시간 안에 시작하며, 지금까지 120+개국에서 앱 7,400+개를 이 방식으로 진행해 성공률 99.9%를 기록했습니다.

      직접 테스터를 모으는 경우와 맡기는 경우

      Google의 요구사항 직접 모으는 경우 맡기는 경우
      테스트에 참여한 테스터 12명 이상 실제 사람을 찾고 설명하고 계속 챙긴 다음, 아무도 참여를 취소하지 않기를 바라야 합니다 12명을 배정하고 기간 내내 유지합니다
      14일 연속 중간에 한 명만 빠져도 연속 기간이 끊깁니다 그룹을 관리해 기간이 끊기지 않게 합니다
      실기기, 실제 사람 에뮬레이터와 활동 없는 계정이 흔한 지름길이고, 진행이 실패하는 흔한 이유이기도 합니다 Android 7부터 17까지 실기기
      첫 참여까지 걸리는 시간 누가 답을 주느냐에 따라 며칠 4~6시간 안에 테스트 시작
      비용 라이브러리를 다시 빌드하느라 이미 바쁜 그 주의 본인 시간 $19.99부터, 서비스 수수료 5% 추가
      테스트 중 재빌드 새로 올릴 때마다 사람들에게 업데이트해 달라고 다시 부탁해야 합니다 새 빌드를 자유롭게 올리셔도 그룹은 참여 상태를 유지합니다

      경계를 분명히 해 두겠습니다. 저희는 네이티브 라이브러리를 대신 다시 빌드하지 않고, 이 글도 그런 서비스를 팔기 위한 글이 아닙니다. 16 KB 작업은 개발자의 몫이고, 이 섹션 위의 모든 내용은 그 작업을 최대한 짧게 끝내시라고 쓴 것입니다. 저희가 덜어 드리는 것은 그 옆에서 동시에 돌아가는 테스터 요구사항입니다. 그래야 두 문제가 같은 2주를 두고 다투지 않습니다.

      순서 잡기 요령

      아직 비공개 테스트를 시작하지 않았고 네이티브 라이브러리가 있다는 것을 이미 아신다면, 테스터 기간을 먼저 돌리고 그 안에서 정렬 작업을 하십시오. Google의 자격 기간은 하나의 고정된 빌드가 아니라 테스터의 참여 지속성을 기준으로 측정되며, 테스트 중에도 계속 업데이트하도록 권장합니다. 그래서 두 일정을 쌓지 않고 겹칠 수 있습니다. 그동안 트랙과 테스터 그룹은 그대로 두십시오. 이것만으로 보통 일주일을 아낍니다.

      자주 묻는 질문

      Google Play가 지금 16 KB 미지원 앱을 거절하고 있나요?

      Google의 현행 문서는 2027년 2월 1일부터 Android 15(API 레벨 35) 이상을 타깃으로 하면서 64비트 기기의 16 KB를 지원하지 않는 업데이트는 출시할 수 없다고 밝히고 있습니다. 그 전까지 대부분의 개발자가 보는 것은 완전한 차단이 아니라 Play Console의 호환성 경고입니다. 인용한 Google 문서에 적힌 결과는 요건을 못 맞춘 업데이트를 출시할 수 없다는 것이지, 이미 게시된 앱이 자동으로 내려간다는 것이 아닙니다.

      Google은 2027년 2월 1일이라는데 다른 글은 왜 2025년 11월 1일이라고 하나요?

      2025년 11월 1일은 Google이 처음 발표했던 기한이고, 2026년 5월 31일은 그 뒤에 있었던 연장 날짜입니다. 2026년 8월 5일 기준으로 Google의 현행 Android Developers 문서와 현재 Play Console 경고 화면 모두 2027년 2월 1일을 가리키므로, 더 새로운 1차 출처가 기준입니다. 많은 블로그 글과 AI 답변이 아직 옛 날짜를 인용하는 이유는 변경 이전에 쓰였기 때문입니다.

      C++를 쓴 적이 없는데 왜 제 앱이 해당되나요?

      직접 쓰신 코드가 Dart, JavaScript, Python, Java, Kotlin이더라도 프레임워크, SDK, 플러그인, 게임 엔진, 데이터베이스, 미디어 컴포넌트, 앱 빌더가 네이티브 .so 파일을 넣을 수 있습니다. Google의 안내도 의존성을 통해 NDK 라이브러리를 간접적으로 사용하는 앱을 명시적으로 포함합니다. Android Studio에서 Build 다음 Analyze APK로 APK를 열어 보십시오. lib 아래에 .so 파일이 하나라도 있으면 패키징된 앱이 네이티브 코드를 쓰고 있다는 뜻입니다.

      순수 Kotlin 앱도 손볼 것이 있나요?

      Google에 따르면 라이브러리와 SDK를 포함해 Java나 Kotlin만 쓰는 앱은 이미 16 KB 기기를 지원합니다. 다만 예기치 못한 회귀가 없는지 16 KB 환경에서 테스트하라고 권장합니다. 순수 Kotlin이라고 단정하기 전에 실제 출시용 APK에 lib 디렉터리가 없는지 확인하십시오. 분석 도구나 데이터베이스 의존성 하나만으로도 생길 수 있습니다.

      Flutter 몇 버전이면 16 KB 페이지 크기 경고가 해결되나요?

      모든 Flutter 앱과 플러그인이 요건을 충족한다고 보장하는 단일 Flutter 버전은 어떤 공식 출처에도 없습니다. Flutter 3.27 릴리스 노트는 보기보다 범위가 좁아서, 엔진 전체가 아니라 plugin_ffi 템플릿의 16 KB 지원을 다룹니다. 문서로 확인되는 가장 강한 기준점은 Flutter 3.38입니다. Flutter가 이 버전으로 올리는 것을 Play의 16 KB 요구사항 대비로 명시했고 기본 NDK를 r28로 바꿨습니다. 가장 안전한 방법은 현재 안정 버전으로 올리고, 네이티브 플러그인을 전부 업데이트하고, 출시용 번들을 다시 빌드한 다음 나오는 .so 파일을 하나하나 확인하는 것입니다.

      React Native는 몇 버전부터 16 KB 페이지를 지원하나요?

      React Native 0.77이 명확한 공식 기준선입니다. 릴리스 공지에서 React Native가 16 KB 페이지 크기를 완전히 지원할 준비가 되었다고 밝히고 있습니다. 다만 커뮤니티 네이티브 모듈, 직접 작성한 C++ 코드, 서드파티 SDK는 여전히 호환되지 않는 바이너리를 넣을 수 있으니, 지원되는 React Native 또는 Expo 이전 경로를 따라 올린 뒤 생성된 APK를 확인하십시오.

      16 KB 페이지 크기를 지원하려면 Unity 몇 버전이 필요한가요?

      Unity는 6000.1 이상, 6000.0.38f1 이상, 2022.3.56f1 이상, 그리고 대상이 되는 Enterprise 또는 Industry 고객의 확장 LTS에서 2021.3.48f1 이상을 제시합니다. 네이티브 플러그인도 함께 업데이트하시고, Play Console이 lib_burst_generated.so 를 지목하면 Burst를 1.8.21 이상으로 올리십시오. 지원되는 에디터 버전은 필요조건이지 충분조건이 아닙니다. 서드파티 플러그인은 자기 바이너리를 따로 넣기 때문입니다.

      문제가 되는 .so 파일을 정확히 어떻게 찾나요?

      Android Studio에서 Build 다음 Analyze APK로 APK를 열고 lib/arm64-v8a 와 lib/x86_64 를 펼친 뒤 Alignment 열을 보십시오. 정렬에 문제가 있는 파일에 경고가 표시됩니다. 명령줄로 확인하려면 Google의 check_elf_alignment.sh 스크립트를 APK에 대해 실행하거나, llvm-objdump -p file.so 출력을 grep LOAD 로 걸러 라이브러리 하나를 들여다보십시오. LOAD 정렬이 2**14 미만이면 손봐야 합니다.

      APK는 통과하는데 앱 번들은 왜 계속 실패하나요?

      라이브러리 안의 ELF 정렬과 패키징된 결과물 안의 ZIP 정렬은 서로 다른 두 검사입니다. bundletool dump config --bundle=app.aab 를 실행하고 alignment 를 grep 하십시오. PAGE_ALIGNMENT_16K 면 통과이고, PAGE_ALIGNMENT_4K 면 생성되는 APK가 여전히 4 KB로 요청되고 있다는 뜻입니다. Google은 Android Gradle Plugin 8.3부터 8.5까지가 로컬에서는 멀쩡해 보여도 Play가 번들에서 빌드하는 APK의 ZIP 정렬이 제대로 되지 않을 수 있다고 특별히 경고하므로 8.5.1 이상으로 올리십시오.

      NDK r28로 올리기만 하면 해결되나요?

      아닙니다. NDK r28 이상은 기본적으로 16 KB 정렬로 컴파일하지만, 그것은 빌드 과정에서 컴파일되는 네이티브 코드에만 해당합니다. 서드파티 AAR, 플러그인, 게임 엔진 패키지 안에 들어 있는 미리 컴파일된 .so 파일을 다시 쓰지는 못합니다. 미리 빌드된 네이티브 의존성은 그 자체를 업데이트하거나 교체하거나, 다시 빌드해서 다시 가져와야 합니다.

      지원 기기가 없어도 16 KB 지원을 테스트할 수 있나요?

      SDK Manager로 Google의 16 KB Android 에뮬레이터 시스템 이미지를 설치하거나, Samsung Remote Test Lab에서 지원되는 기기를 예약하시면 됩니다. 무엇을 쓰시든 먼저 adb shell getconf PAGE_SIZE 로 환경을 확인하십시오. 출력이 16384 여야 그다음 테스트가 의미를 갖습니다. 에뮬레이터에서 성공했다는 것은 실행 동작을 증명할 뿐 패키징을 증명하지는 않으니, 출시용 번들 점검도 계속하십시오.

      16 KB 문제를 고치면 진행 중인 비공개 테스트가 초기화되나요?

      Google은 자격 기간을 하나의 고정된 빌드가 아니라 테스터 12명 이상이 14일 동안 계속 테스트에 참여한 상태를 기준으로 측정하며, 테스트 중에도 빌드를 계속 업데이트하도록 권장합니다. 다만 모든 빌드 교체 상황을 보장한다고 명시한 문서는 없으므로, 테스트 도중에 16 KB 요건을 충족하는 번들을 다시 올리실 때는 테스터 그룹을 그대로 유지하는 편이 가장 안전합니다. PrimeTestLab은 $19.99부터 실기기의 실제 테스터 12명을 배정하고 14일 내내 그룹을 유지합니다. 서비스 수수료 5% 추가.

      핵심 요약

      요약

      Google Play는 Android 15(API 레벨 35) 이상을 타깃으로 하는 앱이 64비트 기기에서 16 KB 메모리 페이지 크기를 지원하도록 요구하며, 2027년 2월 1일부터는 요건을 못 맞춘 업데이트를 출시할 수 없습니다. 2025년 11월 1일2026년 5월 31일은 이미 죽은 날짜인데도 검색에서 계속 상위에 뜹니다. 순수 Java나 Kotlin 앱은 이미 요건을 충족합니다. 나머지는 모두 같은 세 단계를 밟습니다. 문제가 되는 .so의 이름을 확인하고, 그 파일을 담고 있는 패키지를 업데이트하고, 서로 독립된 두 가지 검사로 결과물을 증명하십시오. 모든 ELF LOAD 세그먼트가 2**14 이상이어야 하고, 번들이 PAGE_ALIGNMENT_16K를 보고해야 합니다. AGP 8.5.1+NDK r28+ 조합이 가장 안전한 기본 툴체인이지만, 둘 중 어느 것도 남이 컴파일한 바이너리를 고쳐 주지는 못합니다. 이 일이 비공개 테스트 도중에 닥쳤다면, 넘길 수 있는 쪽은 테스터 부분입니다. 요금제 보기 →

      이 페이지에서 가장 먼저 낡을 내용

      • 2027년 2월 1일이라는 날짜. Google은 이 일정을 이미 한 번 이상 옮겼습니다. 이 날짜를 기준으로 출시를 계획하기 전에 페이지 크기 가이드 하단의 "Last updated" 표시를 확인하십시오.
      • Play Console 문구. Console의 문구와 메뉴 구성은 정책 문서와 별개로 바뀌므로, 화면에서 보시는 제목이 여기 옮겨 둔 것과 다를 수 있습니다.
      • 프레임워크 기준 버전. Flutter는 안정 버전을 자주 내고, React Native의 지원 정책은 계속 바뀌며, Unity LTS 대상 버전도 달라집니다. 글에 인쇄된 버전이 아니라 현재 릴리스 노트를 기준으로 확인하십시오.
      • 보고된 라이브러리 목록. 어떤 패키지든 어느 릴리스에서나 네이티브 바이너리를 추가하거나 교체하거나 되돌릴 수 있습니다. 언제나 본인 번들 안의 결과물을 직접 확인하십시오.
      • 에뮬레이터 이미지 이름. 실험용으로 표시된 이미지는 이름이 바뀌거나 정식으로 승격될 수 있어서, SDK Manager에 보이는 문자열이 다를 수 있습니다.

      2026년 8월 9일 Google 문서 기준으로 확인했습니다. 시행 후 최소 한 달까지 매월 검토합니다.

      Kefayatullah Khadem - 소프트웨어 엔지니어 · Google Play 출시 전문가

      작성

      Kefayatullah Khadem

      소프트웨어 엔지니어 · Google Play 출시 전문가

      Kefayatullah Khadem은 확장 가능한 애플리케이션을 8년 이상 다뤄 온 소프트웨어 엔지니어입니다. PrimeTestLab에서 많은 개발자가 막히는 Google Play 비공개 테스트 요구사항과 출시 차단 문제를 넘기도록 돕습니다. 현재까지 Android 앱 7,400+개의 프로덕션 액세스 과정을 지원했으며, 120+개국에서 성공률 99.9%입니다. Google Play 정책, 빌드 요구사항, 비공개 테스트 과정을 글로도 정리합니다.

      7,400+ 테스트 앱
      99.9% 성공률
      120+ 국가
      4.9/5 평점

      성공률 99.9%

      빌드는 직접, 테스터는 저희가

      네이티브 라이브러리를 다시 빌드하시는 동안, 저희는 14일 내내 테스트 참여 상태를 유지하는 실기기 테스터 12명 이상을 맡습니다.

      $19.99부터 시작, 서비스 수수료 5% 추가

      테스트 시작까지 4~6시간 · 120+개국 · 무료 재테스트 또는 전액 환불

      PrimeTestLab과 함께 앱을 출시한 개발자 7,400+명과 함께하세요

      테스터 12명 · $19.99 WhatsApp