16KB 페이지 크기 지원

지금까지 Android는 4KB 메모리 페이지 크기만 지원했기 때문에 일반적으로 Android 기기에 있는 평균 총 메모리 양에 맞게 시스템 메모리 성능이 최적화되었습니다. Android 15부터 Android는 16KB (16KB 기기)의 페이지 크기를 사용하도록 구성된 기기를 지원합니다.

기기 제조업체가 계속해서 더 많은 양의 물리적 메모리 (RAM)를 장착한 기기를 제작함에 따라 이러한 기기 대다수는 기기 성능을 최적화하기 위해 16KB (및 향후 더 큰) 페이지 크기로 구성될 가능성이 높습니다. 16KB 기기 지원을 추가하면 이러한 기기에서 앱을 실행할 수 있으며 관련 성능 개선의 이점을 누릴 수 있습니다. 이를 돕기 위해 앱이 영향을 받는지 확인하는 방법, 앱을 다시 빌드하는 방법(해당하는 경우), 에뮬레이터와 실제 기기를 모두 사용하여 16KB 환경에서 앱을 테스트하는 방법에 관한 안내를 제공했습니다.

이점 및 실적 향상

16KB 페이지 크기로 구성된 기기는 평균적으로 메모리를 약간 더 많이 사용하지만 시스템과 앱 모두에서 다양한 성능 개선사항이 있습니다.

  • 시스템의 메모리 압박이 있는 동안 앱 실행 시간이 단축됨: 테스트한 일부 앱의 경우 평균 3.16% 감소, 상당한 개선 (최대 30%)
  • 앱 실행 중 전력 사용 감소: 평균 4.56% 감소
  • 더 빠른 카메라 실행: 핫 스타트가 평균 4.48% 더 빠르고 콜드 스타트가 평균 6.60% 더 빠릅니다.
  • 시스템 부팅 시간 개선: 평균 1.5% (약 0.8초) 개선

이러한 개선사항은 초기 테스트를 기반으로 하며 실제 기기에서는 결과가 다를 수 있습니다. 테스트를 계속하면서 앱의 잠재적 이익에 관한 추가 분석을 제공합니다.

앱이 영향을 받는지 확인하기

<

앱에서 네이티브 코드를 사용하는 경우 16KB 기기를 지원하도록 앱을 다시 빌드해야 합니다. 앱에서 네이티브 코드를 사용하는지 확실하지 않으면 APK Analyzer를 사용하여 네이티브 코드가 있는지 확인할 수 있습니다.

앱에서 모든 라이브러리나 SDK를 포함하여 자바 프로그래밍 언어나 Kotlin으로 작성된 코드만 사용한다면 이미 16KB 기기를 지원하는 것입니다. 그럼에도 불구하고 16KB 환경에서 앱을 테스트하여 앱 동작에 예기치 않은 회귀가 없는지 확인하는 것이 좋습니다.

앱에서 네이티브 코드를 사용하는지 확인

다음 중 하나라도 해당되는 경우 앱에서 네이티브 코드를 사용합니다.

  • 앱에서 C/C++ (네이티브) 코드를 사용합니다. Android NDK를 사용하는 앱에서는 네이티브 코드를 사용합니다.
  • 앱이 서드 파티 네이티브 라이브러리와 연결됩니다.
  • 앱이 기기에서 네이티브 라이브러리를 사용하는 서드 파티 앱 빌더로 빌드되었습니다.

APK Analyzer를 사용하여 네이티브 라이브러리 식별

APK Analyzer는 빌드된 APK의 다양한 측면을 평가할 수 있는 도구입니다. 앱이 네이티브 코드 또는 라이브러리를 사용하는지 확인하려면 다음 단계를 따르세요.

  1. Android 스튜디오를 열고 File > Open을 클릭하고 프로젝트를 선택합니다.
  2. 메뉴 바에서 Build > Analyze APK...를 클릭합니다.

    APK Analyzer를 실행하는 Studio Build 메뉴 옵션

  3. 분석하려는 APK를 선택합니다.

  4. 공유 객체 (.so) 파일이 있는 경우 이를 호스팅하는 lib 폴더를 살펴봅니다. 공유된 객체 파일이 있으면 앱은 네이티브 코드를 사용합니다. 공유 객체 파일이 없거나 lib 폴더가 없으면 앱은 네이티브 코드를 사용하지 않습니다.

    공유된 객체 파일이 있음을 보여주는 APK Analyzer 뷰

16KB 기기를 지원하는 앱 빌드

16KB 기기를 지원하려면 네이티브 코드를 사용하는 앱이 다음 섹션에 설명된 단계를 완료해야 합니다.

AGP 버전 8.3 이상으로 업데이트

16KB 기기를 사용하려면 압축되지 않은 공유 라이브러리와 함께 제공되는 앱이 16KB zip 정렬 경계에 정렬되어야 합니다. 이렇게 하려면 Android Gradle 플러그인 (AGP) 버전 8.3 이상으로 업그레이드해야 합니다. 업그레이드 프로세스에 관한 자세한 내용은 Android Gradle 플러그인 업그레이드 어시스턴트 섹션을 참고하세요.

압축되지 않은 공유 라이브러리를 사용하는 것이 좋지만 AGP를 버전 8.3 이상으로 업그레이드할 수 없다면 압축된 공유 라이브러리를 사용하도록 전환하는 것입니다. 정렬되지 않은 공유 라이브러리와 함께 앱 설치 문제가 발생하지 않도록 Gradle 구성을 업데이트하여 앱을 패키징할 때 Gradle이 공유 라이브러리를 압축하도록 합니다.

Groovy

build.gradle 파일에서 다음 옵션을 추가합니다.

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

Kotlin

build.gradle.kts 파일에서 다음 옵션을 추가합니다.

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

16KB ELF 정렬을 사용하여 앱 컴파일

16KB 기기에서 앱을 실행하려면 공유 라이브러리의 ELF 세그먼트가 16KB ELF 정렬을 사용하여 올바르게 정렬되어야 합니다.

16KB ELF 정렬을 사용하여 앱을 컴파일하려면 사용 중인 Android NDK 버전에 따라 다음 섹션 중 하나의 단계를 완료하세요.

Android NDK r26 이하

Android NDK 버전 r26 이하에서 16KB로 정렬된 공유 라이브러리의 컴파일을 지원하려면 ndk-build 또는 cmake 구성을 다음과 같이 업데이트해야 합니다.

ndk-build

Android.mk를 업데이트하여 16KB ELF 정렬을 사용 설정합니다.

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

CMake

CMakeLists.txt를 업데이트하여 16KB ELF 정렬을 사용 설정합니다.

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")

Android NDK r27 이상

Android NDK 버전 r27 이상에서 16KB 정렬 공유 라이브러리의 컴파일을 지원하려면 ndk-build, build.gradle, build.gradle.kts 또는 링커 플래그를 다음과 같이 업데이트해야 합니다.

ndk-build

Application.mk에서:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

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"
      }
    }
  }
}

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")
      }
    }
  }
}

기타 빌드 시스템

다음 링커 플래그를 지정합니다.

-Wl,-z,max-page-size=16384

특정 페이지 크기를 참조하는 코드 인스턴스 확인

앱이 16KB 정렬되어 있어도 코드의 위치에서 기기에서 특정 페이지 크기를 사용한다고 가정하면 앱에서 오류가 발생할 수 있습니다. 이를 방지하려면 다음 단계를 완료하세요.

  1. PAGE_SIZE 상수를 참조하는 하드 코딩 종속 항목 또는 기기의 페이지 크기가 4KB (4096)라고 가정하는 코드 로직의 인스턴스를 삭제합니다.

    대신 getpagesize() 또는 sysconf(_SC_PAGESIZE)를 사용하세요.

  2. 페이지 정렬 인수가 필요한 mmap() 및 기타 API의 사용법을 찾아 필요한 경우 대안으로 바꿉니다.

16KB 환경에서 앱 테스트

16KB 기기를 지원하는 앱을 빌드한 후에는 16KB 환경에서 앱을 테스트하여 앱에 회귀가 발생하는지 확인하는 것이 좋습니다. 이렇게 하려면 다음 테스트 환경 중 하나를 사용합니다.