[Android] Android 15(API 35) 16KB 페이지 크기 지원
개요
16KB 페이지 크기 지원은 Android 15부터 도입되었으며, 2025년 11월 1일부터 Google Play에 제출되는 모든 새 앱 및 업데이트는 이 크기를 지원해야 한다.
앱이 NDK 라이브러리를 직접 또는 SDK를 통해 간접적으로 사용하는 경우 이러한 16KB 기기에서 작동하도록 앱을 다시 빌드해야 한다.
이점 및 성능 향상
16KB 페이지 크기로 구성된 기기는 조금 더 많은 메모리를 사용하지만 시스템과 앱 모두에서 다양한 성능이 개선된다.
- 앱 실행 시간 단축: 평균 3.16% 감소
- 앱 실행 중 전원 소모 감소: 평균 4.56% 감소
- 카메라 실행 속도 향상: 평균 핫 스타트 속도가 4.48%, 콜드 스타트 속도가 6.60% 빨라짐
- 시스템 부팅 시간 개선: 평균 8% 개선됨
앱이 영향을 받는지 확인
- Android NDK를 직접 사용하는 경우
- 앱 코드 안에 C/C++로 작성된 부분이 포함되어 있는 경우
- 서드파티 네이티브 라이브러리나 SDK를 사용하는 경우
- 예를 들어, 다른 회사에서 만든 네이티브 라이브러리를 연결해서 쓰는 경우
- 앱 빌더(앱 생성 도구)가 내부적으로 네이티브 라이브러리를 사용하는 경우
- 앱을 직접 C/C++로 짜지 않아도, 사용하는 빌더가 네이티브 코드를 포함하고 있다면 해당
APK Analyzer를 사용하면 바로 16KB를 지원하는지 확인 할 수 있다.
문제가 있을경우 문제있는 부분에 경고 메지시가 표시된다.
또는 안드로이드 스튜디오에서 APK가 16KB를 준수하지않으면 경고를 표시한다.
그리고 16KB 지원 기기에 테스트를 위해 4KB만 지원하는 앱을 실행하면 다음과 같은 경고가 발생한다.
16KB 기기를 지원하도록 앱 빌드
지원하는 방법은 크게 3가지이다.
- 16KB를 지원하는 라이브러리로 버전 업그레이드 또는 라이브러리 변경
- AGP 버전 8.5.1 이상으로 업그레이드
- Android NDK 버전 r28이상으로 업그레이드
위의 내용을 적용하지 못한다면 아래 내용을 따라하면된다.
AGP 업데이트
- AGP 버전 8.5 이상
앱이 기본적으로 16KB로 정렬된다.
- AGP 버전 8.5 이하
kotlin의 경우
build.gradle.kts
파일에 다음 옵션을 추가한다.
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
Groovy일 경우
build.gradle
파일에 다음 옵션을 추가한다.
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
NDK 업데이트 (16KB ELF 정렬)
- Android NDK 버전 r28 이상
기본적으로 16KB 정렬로 컴파일된다.
- Android NDK 버전 r27 이상
Kotlin일 경우
build.gradle.kts
파일에서 -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
인수를 설정한다.
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")
}
}
}
}
Groovy일 경우
build.gradle
파일에서 -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
인수를 설정한다.
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 "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
- Android NDK 버전 r26 이하
항상 NDK를 업데이트해야한다. 이 방법은 최후의 수단으로만 사용해야 하며 지원이 보장되지 않는다.
ndk-build일 경우
Android.mk
를 업데이트한다.
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake일 경우
CMakeLists.txt
를 업데이트한다.
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
- Android NDK 버전 r22 이하
항상 NDK를 업데이트해야한다. 이 방법은 최후의 수단으로만 사용해야 하며 지원이 보장되지 않는다.
NDK r26 이하에 설명된 단계 외에도 NDK r22 이하를 사용하는 경우 common-page-size=16384
를 설정해야 한다.
common-page-size=16384
설정은 이전 버전의 GNU ld 및 LLVM lld 링커의 버그로 인해 필요하다.
ndk-build일 경우
Android.mk
를 업데이트한다.
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
CMake일 경우
CMakeLists.txt
를 업데이트한다.
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,common-page-size=16384")
위의 내용들을 적용하고 다시 빌드를 하면 다음과 같이 APK Analyzer에 경고들이 사라져있음을 확인할 수 있다.
16KB 환경에서 테스트
애뮬레이터를 사용하거나 실 기기 개발자 모드 옵션 설정을 통해 간단하게 테스트가 가능하다.
테스트 방법은 해당 링크에 자세히 설명되어있다.