-
안드로이드 15 16kb 페이지 지원카테고리 없음 2026. 4. 10. 08:27
최근 안드로이드 16kb 페이지 크기를 대응해야 하는 상황이 있어 공식 문서를 보고
분석을 해보겠다!
1. 용어정리
* ELF
.so 파일(네이티브 라이브러리) 자체라고 생각하면 된다.
즉, 네이티브 코드가 담긴 파일이고, 그 파일이 16kb로 올라올 때 정렬을 잘 맞춰서 다시 빌드해줘 한다.
* TLB
CPU가 가상 주소이고 실제 주소를 바꾸는 초고속 주소 캐시이다.
4kb에서 16kb로 페이지를 키우면 TLB 한 개가 더 넓은 메모리를 커버하게 되고 TBL를 못 쓰는 상황이 줄어든다.
* 메모리 페이지 크기
os가 메모리를 몇 kb짜리 칸으로 쪼개 쓰느냐를 정하는 숫자이고, 16kb 페이지 크기를 그 값 중에서 1칸을 16kb로 키워서 쓰는 방식이다.
2. 개요
이전에는 Android에서 4kb 메모리 페이지 크기만 지원해서 Android 기기가 일반적으로 보유한 평균 메모리에 맞게 시스템 메모리 성능 최적화를 했었다.
Android 15부터는 페이지 크기 16kb를 사용하도록 구성된 기기를 지원한다.
그렇기 때문에 네이티브 코드를 사용하는 라이브러리를 16kb 기기에서도 작동하도록 다시 빌드해줘야 한다.
결론적으로 만약 ELF 파일이 4KB 기준으로만 정렬돼 있으면, 16KB 페이지 크기에서 성능에 문제가 생기거나 제대로 동작하지 않을 수 있다.
3. 이점 및 성능 향상
* 앱 실행시간 : 평균 3.16% 감소
* 앱 실행 중 전력 소모 감소 : 평균 4.56% 감소
* 카메라 실행 속도 : 평균 Hot Start -> 4.48% / Cold Start -> 6.6% 감소
* 시스템 부팅 속도 : 평균 8% 감소4. 현재 개발 중이거나 출시된 앱이 영향을 받는지 확인
Android 스튜디오는 정렬 문제를 자동으로 감지하는 기능이 제공된다.
1. 메뉴바에서 Build -> Analyze APK... 클릭
2. 분석하려는 apk 선택(APK 파일을 먼저 생성하거나 다운로드하아야 함)3. .so 파일이 있는 경우 이를 호스팅 하는 lib 폴더 내부를 살펴보게 되고 공유 객체 파일이 있다면 앱에서 네이티브 코드를 사용하는 것이다.
아래와 같이 16kb 대응이 되어있지 않으면 경고를 표시합니다.
5. AGP 8.5.1 이상
16kb 기기에서는 압축되지 않은 공유 라이브러리와 함께 제공되는 앱이 16kb 압축정렬 경계에 정렬되어야 한다.
이렇게 하려면 AGP 버전이 8.5.1 이상으로 설정되어야 한다.
만약 버전업이 불가능하다면..
build.gradle 파일에 아래 옵션을 추가해 준다.android { ... packagingOptions { jniLibs { useLegacyPackaging true } } }6. Android NDK r28 이상
기본적으로 16kb 정렬이 되기 때문에 따로 작업 불필요
7. Android NDK r27
Android NDK 버전 r27 이상으로 16KB 정렬 공유 라이브러리를 컴파일하려면 다음과 같이 ndk-build, build.gradle, build.gradle.kts 또는 링커 플래그를 업데이트해야 한다.android { ... defaultConfig { ... // This block is different from the one you use to link Gradle // to your CMake or ndk-build script. externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { // Passes optional arguments to CMake. arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON") } } } }8. 코드 수정 및 런타임 문제 해결
앱이 16kb로 정렬되어 있더라도 코드의 특정 위치에서 특정 페이지 크기 예를 들면 4kb를 사용한다고 하드 코딩이 되어있는 경우 앱에 오류가 발생할 수 있다.
이를 방지하기 위해 아래 단계를 확인
* 코드 로직에서 PAGE_SIZE 상수 또는 기기의 페이지 크기가 4kb라고 가정하는 인스턴스를 참조하는 하드 코딩된 종속 항목을 삭제한다.
대신 getpagesize() 또는 sysconf(_SC_PAGESIZE을 사용한다.
9. 실제 테스트 방법
보통 한국 사람들이 많이 사용하는 삼성폰에서는 기본적으로 16kb가 디폴트로 설정되어 있는 폰은 아무리 최신폰이라 하더라도 극소수 일 것이다.(개발자 옵션에서 킬 수 있다고는 하는데 아예 옵션에 없는 폰도 다수 있음)
그렇기 때문에 Android Studio에서 에뮬레이터를 활용하여 테스트한다.
[테스트 방법]