본문 바로가기
오늘은 뭘 배울까?/Android

16KB 페이지 크기 지원 - 왜 하는거고 어떻게 하는 것인가?

by Kim Juhwan 2025. 11. 2.

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 버전

 

 

 


 

https://developer.android.com/guide/practices/page-sizes?hl=ko#build

 

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를 지원하지 않음

 

플레이콘솔에 앱이 등록되어 있지 않은 경우

안드로이드 스튜디오 - Build - Analyze APK - 앱 파일 선택하면 뜬다.

 

안드로이드 스튜디오에서 Analyze APK를 사용하면 내 앱을 분석해서 보여주는데

lib 폴더 밑으로 들어가 보면 내가 사용하는 라이브러리 중 16KB를 지원하지 않는 것이 있으면 위 사진처럼 경고로 알림이 뜬다.

 

근데 너무 하위 버전의 안드로이드 스튜디오로 Analyze APK를 하면 경고가 뜨지 않을 수도 있다. (개인적인 경험)

그러니 최신 버전의 IDE에서 체크하길 권장한다.

 

2-2. AGP 버전 확인

공식문서 발췌: https://developer.android.com/guide/practices/page-sizes?hl=ko#agp_version_851_or_higher

 

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

 

File - Project Structure - Project

 

위 경로로 들어가 버전을 변경하면 된다.

 

2-3. NDK 확인

우선 NDK란 Android에서 C 및 C++ 코드를 사용할 수 있게 해주는 일련의 도구 모음이다.

C코드를 자바가 읽을 수 있게, 빌드할 수 있게 해주는 것이다.

예를 들어, 카메라 영상 처리나 게임 같은 경우는 C, C++로 많이 작성하는데

이걸 읽어서 빌드를 하려면 NDK가 필요한 것이다.

 

Tools - SDK Manager - SDK Tools

 

만약 프로젝트 내에서 NDK를 사용한다면

NDK 버전에 따라 공식문서에서 안내하고 있는 지침사항을 따라야 한다.

내 프로젝트에서 NDK를 사용하고 있는지 모르겠다면 사진 속 경로로 들어가 NDK가 체크되어 있는지 확인하면 된다.

 

만약 프로젝트에서 카메라 라이브러리 같은 걸 사용한다면

우리가 직접 NDK를 사용하진 않지만 그 라이브러리가 사용하고 있으므로

그 라이브러리가 위 지침사항에 맞는 조치를 해야 할 것이다. (그래서 라이브러리 버전을 올려야 하는 거고)

 

 

2-4. 특정 페이지 크기를 지정하여 사용하는지 확인

공식문서 발췌: https://developer.android.com/guide/practices/page-sizes?hl=ko#check-code

 

코드 로직에서 페이지 크기를 특정 값으로 하드코딩한 경우 수정하라는 이야기인데

사실 웬만한 프로젝트는 해당사항이 없지 않을까...? 생각한다.

만약 해당되는 경우 저보다 이 글을 보고 계시는 분께서 이쪽은 더 전문가이실 거라.. 이 항목은 패스

 

3. 해결 방법

[목차 2-1]에서 소개한 대로 확인했을 때 경고가 떴다면

16KB를 지원하는 버전으로 라이브러리를 업데이트하거나

지원하지 않는다면 다른 대체 라이브러리를 찾아야 한다.

 

이 블로거는 떠먹여 드립니다.

 

이제 막 개발을 시작하는 분들에겐

16KB를 지원하는 버전은 어디서 어떻게 찾을 수 있는 건지조차 어려울 수 있기 때문에

하나씩 설명해 보겠습니다잉

 

3-1. 안드로이드 공식 라이브러리

공식문서 발췌: https://firebase.google.com/support/release-notes/android

 

 

공식문서 릴리즈 노트를 보면 어떤 버전에 어떤 수정이 일어났는지 잘 정리되어 있다.

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 버전

공식문서 발췌: https://firebase.google.com/support/release-notes/android#compare-bom-versions

 

Firebase에는 여러 가지 라이브러리들이 있다.

crashyltcis, analytics, messaging 등등..

그 라이브러리들끼리도 버전 호환이 안 맞으면 문제가 될 수 있기에

호환되는 버전끼리 묶어둔 것이 바로 FirebaseBoM이다.

 

이 BoM을 사용 중이라면 위 공식문서로 이동하여 내가 몇 버전을 사용할지

버전을 올리면 어떤 라이브러리가 어떤 버전으로 올라가서 어떤 영향을 받을지 체크하는 것이 좋다.

 

무작정 최신버전으로 올리지 뭐~ 하다가

어? 너 이거 올릴 거야? 그러면 코틀린 버전도 올려야 함

어? 너 코틀린 버전 올릴 거야? 그러면 컴포즈 버전도 올려야 함

어? 너 컴포즈 버전 올릴 거야?... (살려줘...)

온갖 버전을 다 올려야 하는 문제가 발생할 수 있다. 하하

 

 

 


💡 느낀 점

  • 16KB를 지원하지 않는 몇몇 라이브러리들을 보며
    웬만하면 라이브러리에 의존하지 말고 직접 구현하라는 팀장님의 말씀이 이제야 확 와닿았다.
    뭔가 통상적으로 개발자라면 그래야지~ 는 알고 있어도
    잘 쓰고 있던 라이브러리가 갑자기 문제가 발생할리도 없고
    간단하게 그냥 가져다 쓰면 개발도 빨리 끝낼 수 있지 않나? 내심 생각 했었는데
    실제로 이렇게 문제를 겪어보니 그렇지 않구나를 느낄 수 있었다.
  • 이번에 버전을 올리면서 A를 올리려면 B를 올려야 하고, B를 올리려면 C를 올려야 하고.. (반복)
    이렇게 의존성이 엮이고 엮인 상황이 발생했었다.
    당장 버전을 올릴 필요가 없으니 묵혀두었던 것들이
    어떤 것 하나 버전을 올리려고 하니 그물에 엮인 물고기들처럼 문제가 수면 위로 잔뜩 올라왔던 것이다.
    "아 당장 필요 없더라도 주기적으로 버전을 올려주는 것도 필요하겠구나"는 걸 느꼈다.
    안 그러면 미래의 담당자는 죽어나갈 거야...

📘 참고한 자료


반응형

댓글