
1. 16KB 페이지 크기 지원
1-1. 도대체 16KB 페이지가 뭔데?
1-2. 페이지 테이블 수 감소
1-3. TLB 효율 증가
1-4. 실질적으로 얼마나 개선이 되는 건데?
2. 16KB 지원이 필요한지 확인하는 방법
2-1. 라이브러리 호환 확인
2-2. AGP 버전 확인
2-3. NDK 확인
3. 해결 방법
3-1. 안드로이드 공식 라이브러리
3-2. Git Repository에 등록된 라이브러리
3-3. B2B 라이브러리
4. 검증
5. 팁
5-1. 라이브러리 목록과 지원 버전
5-2. FirebaseBoM 버전

2025년 11월 1일부터 Android 15 이상을 타겟팅하는 앱들은
16KB 페이지 크기를 지원해야만 업로드할 수 있도록 정책이 변경된다고 한다.
(다만 기간 연장을 요청하면 조금 늦춰주는 듯하다)
이번에 이걸 담당해서 해결했는데
관련 글이 많이 없는 것 같아서 작성해보려고 한다.
1. 16KB 페이지 크기 지원
1-1. 도대체 16KB 페이지가 뭔데?
고치는 건 공식문서 보면서 어찌저찌 한다고 할지언정
그래도 내가 뭘 고치는 건지는 알아야 할거 아닌가..?
그래서 나름대로 검색을 좀 해봤다.
연필 한 '다스'라는 표현이 있다. 연필 12자루를 묶어서 부르는 '단위'이다.
(요즘 애들은 이런 말 안 쓰나..? 다들 애플 펜슬 써서 모르려나... 껄껄)
그런 것처럼 OS도 어떤 '단위'로 메모리를 할당하고 관리한다.
그 단위가 예전에는 4KB 였으나 이제 16KB로 늘리겠다는 뜻이다.
아니 그러면 단위를 늘려서 뭐가 좋길래 늘리겠다는 것일까? 🤔
1-2. 페이지 테이블 수 감소

페이지 테이블은 논리 주소를 물리 주소로 변환할 때 참고하는 변환 표 같은 것이다. 맵핑 테이블이라고 생각하면 된다.
예를 들면 논리 주소(= 엄마)를 물리 주소(= 010-xxxx-xxxx)로 변환할 때 참고하는 표(= 연락처)가 있는 것이다.
이 테이블에 담을 수 있는 메모리의 크기가 4배로 늘어났다고 생각하면 된다.
그렇다는 것은 예전에는 400만 개의 페이지 테이블이 필요했는데 이제는 100만 개의 테이블만 있으면 된다는 것이다.
이로 인해 관리 비용이 줄어든다고 한다.
1-3. TLB 효율 증가
앞서 페이지 테이블에 대해서 설명했는데
논리 주소를 물리 주소로 변환할 때마다 매번 페이지 테이블을 다 뒤져야 한다면 시간이 꽤나 걸릴 것이다.
그래서 최근에 사용한 정보들을 캐싱해 두는데 이것을 TLB라고 부른다.
근데 만약 캐싱해 둔 TLB에서 원하는 주소를 찾지 못하면
우리는 이걸 TLB 미스라고 부르고
결국엔 페이지 테이블을 뒤져야 하는 상황이 온다. 이는 곧 비용을 발생시킨다.
근데 TLB의 크기를 늘려서 더 많은 정보를 캐싱해 둘 수 있다면?
TLB 미스가 발생할 확률이 줄어들겠지.
그래서 결론적으로 메모리 접근이 빨라진다고 한다.
1-4. 실질적으로 얼마나 개선이 되는 건데?

오리는 성인병예방에도 좋구요.. 혈액순환에도 좋고 어쩌구...
그래 뭐 여기에도 좋고 저기에도 좋은 건 알겠다.
그래서 우리한테 실질적으로 뭐가 얼마나 좋은 건데?
구글에서는 다음과 같이 설명하고 있다.
- 시스템 메모리 부족할 때 앱 실행 시간 단축 - 평균 3.16%, 최대 30%까지 개선되었다고 함
- 배터리 소모 평균 4.56% 감소
- 카메라 실행 속도 4~6% 향상
- 시스템 부팅 시간 개선 평균 8% (약 0.95초) 개선
개인적으로 16KB 지원 안 하면 앱 못 올리게 하겠다고 협박한 것치곤 눈에 띄는 변화는 아닌 것 같다. 흠흠..
2. 16KB 지원이 필요한지 확인하는 방법
2-1. 라이브러리 호환 확인
플레이 콘솔에 앱이 등록되어 있는 경우


위 경로로 들어가 보면 메모리 페이지 크기 섹션에 16KB 지원을 하고 있는지 여부가 뜬다.
세부정보 보기를 누르면 정확히 어떤 것 때문에 문제가 되는지 자세한 내용을 알 수 있다.
몇 개 예시로 보자면
- base/lib/arm64-v8a/libairbrigdelib.so: 에어브릿지라는 라이브러리가 16KB를 지원하지 않음
- base/lib/arm64-v8a/libcrashlytics-common.so: crashlytics 라이브러리가 16KB를 지원하지 않음
플레이콘솔에 앱이 등록되어 있지 않은 경우

안드로이드 스튜디오에서 Analyze APK를 사용하면 내 앱을 분석해서 보여주는데
lib 폴더 밑으로 들어가 보면 내가 사용하는 라이브러리 중 16KB를 지원하지 않는 것이 있으면 위 사진처럼 경고로 알림이 뜬다.
근데 너무 하위 버전의 안드로이드 스튜디오로 Analyze APK를 하면 경고가 뜨지 않을 수도 있다. (개인적인 경험)
그러니 최신 버전의 IDE에서 체크하길 권장한다.
2-2. AGP 버전 확인

공식문서에 따르면 AGP 버전은 8.5.1 이상으로 업그레이드 권장하고 있다.

위 경로로 들어가 버전을 변경하면 된다.
2-3. NDK 확인
우선 NDK란 Android에서 C 및 C++ 코드를 사용할 수 있게 해주는 일련의 도구 모음이다.
C코드를 자바가 읽을 수 있게, 빌드할 수 있게 해주는 것이다.
예를 들어, 카메라 영상 처리나 게임 같은 경우는 C, C++로 많이 작성하는데
이걸 읽어서 빌드를 하려면 NDK가 필요한 것이다.

만약 프로젝트 내에서 NDK를 사용한다면
NDK 버전에 따라 공식문서에서 안내하고 있는 지침사항을 따라야 한다.
내 프로젝트에서 NDK를 사용하고 있는지 모르겠다면 사진 속 경로로 들어가 NDK가 체크되어 있는지 확인하면 된다.
만약 프로젝트에서 카메라 라이브러리 같은 걸 사용한다면
우리가 직접 NDK를 사용하진 않지만 그 라이브러리가 사용하고 있으므로
그 라이브러리가 위 지침사항에 맞는 조치를 해야 할 것이다. (그래서 라이브러리 버전을 올려야 하는 거고)
2-4. 특정 페이지 크기를 지정하여 사용하는지 확인

코드 로직에서 페이지 크기를 특정 값으로 하드코딩한 경우 수정하라는 이야기인데
사실 웬만한 프로젝트는 해당사항이 없지 않을까...? 생각한다.
만약 해당되는 경우 저보다 이 글을 보고 계시는 분께서 이쪽은 더 전문가이실 거라.. 이 항목은 패스
3. 해결 방법
[목차 2-1]에서 소개한 대로 확인했을 때 경고가 떴다면
16KB를 지원하는 버전으로 라이브러리를 업데이트하거나
지원하지 않는다면 다른 대체 라이브러리를 찾아야 한다.

이제 막 개발을 시작하는 분들에겐
16KB를 지원하는 버전은 어디서 어떻게 찾을 수 있는 건지조차 어려울 수 있기 때문에
하나씩 설명해 보겠습니다잉
3-1. 안드로이드 공식 라이브러리

공식문서 릴리즈 노트를 보면 어떤 버전에 어떤 수정이 일어났는지 잘 정리되어 있다.
Crashyltics를 예시로 보면 19.0.2부터 16KB 지원을 한다는 걸 알 수 있다.
구글에다가 [라이브러리 명] + 16KB로 검색만 해도 쉽게 찾을 수 있다.
예를 들면 'firebase crashyltics 16kb'처럼 말이다.
3-2. Git Repository에 등록된 라이브러리

이 경우도 크게 다르지 않다.
Repository에 있는 릴리즈 노트를 확인해서 버전을 올리면 된다.
구글에서 16KB에 대한 조치를 하라고 했던 게 2025년도 5월쯤이었으니
그 이후로 올라온 업데이트가 없다면 릴리즈 노트를 볼 필요도 없다.
공교롭게도 다른 대체 라이브러리를 찾아야 한다...
3-3. B2B 라이브러리
이런 라이브러리들을 뭐라고 불러야 할지 고민하다가 그냥 B2B 라이브러리라고 칭했다.
V3, 에어브릿지처럼 회사를 상대로 계약을 맺고 사용하는 라이브러리들은
그 업체에서 수정된 버전을 배포했을 거고 안내도 해주셨을 거다. (회사를 다니고 계시다면 이메일을 뒤져보시길)
안내에 따라 해당 버전으로 올리기만 하면 된다.
4. 검증

[목차 2-1]로 16KB 지원이 잘 됐는지 확인할 수 있지만
진짜로 문제없는 거 맞아!? 찝찝하지 않은가.. (회사 앱이라면 더더욱)
나의 경우는 16KB 크기를 지원하는 기기(픽셀)가 있어서 직접 앱을 실행해 보았다.
만약 문제가 있다면 위와 같이 팝업으로 안내해 준다.
다만 최초 앱 실행 시에만 안내해 주니 유의할 것
16KB를 지원하는 기기라고 하더라도 부트로더 언락해서 이것저것 설정해줘야 하고
개발자모드에서 설정 켜야 하고.. 꽤나 길고 귀찮은 과정이 있다.
이 포스팅에서 설명하긴 길고 살짝 주제에 어긋나는 느낌이 있어 생략
4. 팁
4-1. 라이브러리 목록과 지원 버전
| so 파일명 | 16KB 지원 최소 버전 | 비고 | |
| 에어브릿지 | libairbridgelib.so | 4.6.0 | |
| 크래시리틱스 | libcrashlytics-*.so | 19.0.2 | |
| NHN 앱가드 | libdiresu.so | 1.12.4.9 | |
| NHN 앱가드 | libloader.so | libdiresu.so 버전 올리면 해결됨 | |
| ucrop | libucrop.so | 2.2.11 | 사진 편집 라이브러리 |
| authmanager | libauthmanager.so | 2.5.33.2 | 지문 인증 라이브러리 |
| flipper | libflipper.so | 디버깅 툴 / 이슈는 등록됐으나 지원안함 |
이 글을 보시는 분들은 일일이 찾아다니지 마시라고 정리해 두었습니다 😉
여기에 없는 것들은 직접 찾으셔야 허허..
4-2. FirebaseBoM 버전

Firebase에는 여러 가지 라이브러리들이 있다.
crashyltcis, analytics, messaging 등등..
그 라이브러리들끼리도 버전 호환이 안 맞으면 문제가 될 수 있기에
호환되는 버전끼리 묶어둔 것이 바로 FirebaseBoM이다.
이 BoM을 사용 중이라면 위 공식문서로 이동하여 내가 몇 버전을 사용할지
버전을 올리면 어떤 라이브러리가 어떤 버전으로 올라가서 어떤 영향을 받을지 체크하는 것이 좋다.
무작정 최신버전으로 올리지 뭐~ 하다가
어? 너 이거 올릴 거야? 그러면 코틀린 버전도 올려야 함
어? 너 코틀린 버전 올릴 거야? 그러면 컴포즈 버전도 올려야 함
어? 너 컴포즈 버전 올릴 거야?... (살려줘...)
온갖 버전을 다 올려야 하는 문제가 발생할 수 있다. 하하
💡 느낀 점
- 16KB를 지원하지 않는 몇몇 라이브러리들을 보며
웬만하면 라이브러리에 의존하지 말고 직접 구현하라는 팀장님의 말씀이 이제야 확 와닿았다.
뭔가 통상적으로 개발자라면 그래야지~ 는 알고 있어도
잘 쓰고 있던 라이브러리가 갑자기 문제가 발생할리도 없고
간단하게 그냥 가져다 쓰면 개발도 빨리 끝낼 수 있지 않나? 내심 생각 했었는데
실제로 이렇게 문제를 겪어보니 그렇지 않구나를 느낄 수 있었다. - 이번에 버전을 올리면서 A를 올리려면 B를 올려야 하고, B를 올리려면 C를 올려야 하고.. (반복)
이렇게 의존성이 엮이고 엮인 상황이 발생했었다.
당장 버전을 올릴 필요가 없으니 묵혀두었던 것들이
어떤 것 하나 버전을 올리려고 하니 그물에 엮인 물고기들처럼 문제가 수면 위로 잔뜩 올라왔던 것이다.
"아 당장 필요 없더라도 주기적으로 버전을 올려주는 것도 필요하겠구나"는 걸 느꼈다.
안 그러면 미래의 담당자는 죽어나갈 거야...
📘 참고한 자료
'오늘은 뭘 배울까? > Android' 카테고리의 다른 글
| 주니어 개발자가 DTO 설계에서 놓치기 쉬운 실수들 (1) | 2024.10.19 |
|---|---|
| Bottom Sheet Dialog 예제 : Modal, Persistent, 모서리 둥글게 등 (5) | 2022.09.14 |
| 안드로이드 다이얼로그 만들기(Custom Dialog까지) (7) | 2022.09.09 |
| withContext는 무엇이며 async와 무슨 차이가 있을까? (6) | 2022.09.07 |
| Coroutine Dispatcher, 넌 대체 뭐야? (2) | 2022.08.31 |
댓글