2 분 소요

16kb_image1.png

개요

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를 지원하는지 확인 할 수 있다.

16kb_image2.png

문제가 있을경우 문제있는 부분에 경고 메지시가 표시된다.

16kb_image3.png

또는 안드로이드 스튜디오에서 APK가 16KB를 준수하지않으면 경고를 표시한다.

16kb_image4.png

그리고 16KB 지원 기기에 테스트를 위해 4KB만 지원하는 앱을 실행하면 다음과 같은 경고가 발생한다.

16kb_image5.png

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_image6.png

16KB 환경에서 테스트

애뮬레이터를 사용하거나 실 기기 개발자 모드 옵션 설정을 통해 간단하게 테스트가 가능하다.

테스트 방법은 해당 링크에 자세히 설명되어있다.

참조

16KB 페이지 크기 지원

16KB 페이지 크기

for 16 KB page size devices

NDK 및 CMake 설치 및 설정

카테고리:

업데이트: