지금까지 Android는 4KB 메모리 페이지 크기만 지원했습니다. 시스템 메모리 성능을 최적화하여 Android 기기에는 일반적으로 그랬습니다. Android 15부터 AOSP는 16KB (16KB)의 페이지 크기를 사용하도록 구성된 기기 기기에서 지원됩니다. 앱이 NDK 라이브러리를 직접 사용하거나 간접적으로 또는 SDK를 통해 간접적으로 구매할 수 있는 경우 앱을 다시 빌드해야 이 16KB 기기에서 작동합니다.
기기 제조업체가 계속해서 더 많은 양의 기기를 사용하여 물리적 메모리(RAM), 이러한 장치의 대부분은 16KB 페이지 크기를 늘려 기기의 성능을 최적화해야 합니다. 추가 중 16KB 페이지 크기 기기 지원을 통해 앱이 앱이 관련 성능의 이점을 누리는 데 도움이 됩니다 개선할 수 있습니다 다시 컴파일하지 않으면 16KB 기기에서 앱이 작동하지 않을 수 있습니다. 프로덕션화될 때 확인해야 합니다
앱 지원을 추가하는 데 도움이 되도록 다음을 확인하는 방법 앱이 영향을 받는 경우 앱 다시 빌드 (해당하는 경우) 및 앱 테스트 방법 에뮬레이터를 사용한 16KB 환경 (Android 15 포함) 시스템 이미지 참조).
이점 및 성능 향상
16KB 페이지 크기로 구성된 기기는 평균적으로 메모리를 약간 더 많이 사용하지만 시스템과 앱 모두에서 다양한 성능 개선사항이 있습니다.
- 시스템의 메모리 압박이 있는 동안 앱 실행 시간이 단축됨: 테스트한 일부 앱의 경우 평균 3.16% 감소, 상당한 개선 (최대 30%)
- 앱 실행 중 전력 사용 감소: 평균 4.56% 감소
- 더 빠른 카메라 실행: 핫 스타트가 평균 4.48% 더 빠르고 콜드 스타트가 평균 6.60% 더 빠릅니다.
- 시스템 부팅 시간 개선: 평균 1.5% (약 0.8초) 개선
이러한 개선사항은 초기 테스트를 기반으로 하며 실제 기기에서는 결과가 다를 수 있습니다. 테스트를 계속하면서 앱의 잠재적 이익에 관한 추가 분석을 제공합니다.
앱이 영향을 받는지 확인하기
如果您的应用使用任何原生代码,则您应重新构建支持 16 KB 设备的应用。如果您不确定自己的应用是否使用了原生代码,可以使用 APK 分析器来确定是否存在任何原生代码。
如果您的应用仅使用以 Java 编程语言或 Kotlin 编写的代码(包括所有库或 SDK),那么该应用已经支持 16 KB 设备。不过,我们建议您在 16 KB 的环境中测试应用,以确认应用行为是否存在意外回归问题。
앱에서 네이티브 코드를 사용하는지 확인
다음 중 하나라도 해당되는 경우 앱에서 네이티브 코드를 사용합니다.
- 앱이 C/C++ (네이티브) 코드를 사용합니다. 앱에서 Android NDK를 사용하는 경우 앱에서 네이티브 코드를 사용합니다.
- 앱이 서드 파티 네이티브 라이브러리 또는 종속 항목과 사용할 수 있습니다
- 앱이 네이티브 라이브러리를 사용하는 타사 앱 빌더로 빌드되었습니다. 있습니다.
APK Analyzer를 사용하여 네이티브 라이브러리 식별
APK Analyzer는 빌드된 APK의 다양한 측면을 평가할 수 있는 도구입니다. APK. 앱에서 네이티브 코드 또는 라이브러리를 사용하는지 확인하려면 단계:
- Android 스튜디오를 열고 File > 열고 프로젝트를 선택합니다.
메뉴 바에서 빌드 > APK 분석...
분석할 APK를 선택합니다.
공유 객체 (
.so
) 파일이 있는 경우 이를 호스팅하는lib
폴더 내부를 살펴봅니다. 있습니다. 공유된 객체 파일이 있는 경우 앱에서 네이티브 생성합니다. 공유된 객체 파일이 없거나lib
폴더가 없는 경우 앱에서 네이티브 코드를 사용하지 않는 것입니다.
16KB 기기를 지원하는 앱 빌드
16KB 기기를 지원하려면 네이티브 코드를 사용하는 앱이 다음 섹션에서 설명하는 단계를 따르세요.
공유 라이브러리의 패키징 업데이트
AGP 버전 8.3 이상으로 업그레이드하고 압축되지 않은 상태로 사용하는 것이 좋습니다. 공유할 수 있습니다.
AGP 버전 8.3 이상
16KB 기기의 경우 압축되지 않은 공유 라이브러리와 함께 제공되는 앱이 있어야 16KB ZIP 정렬 경계에 맞게 정렬합니다. 이렇게 하려면 Android Gradle 플러그인 (AGP) 버전 8.3 이상으로 업데이트해야 합니다. 자세한 내용은 Android Gradle 플러그인 업그레이드 어시스턴트 섹션을 참고하세요.
AGP 버전 8.2 이하
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로 16KB 정렬 공유 라이브러리 컴파일 지원
버전 r26 이하이면 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로 16KB 정렬 공유 라이브러리 컴파일 지원
버전 r27 이상을 실행하는 경우 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로 정렬된 경우에도 는 기기가 특정 페이지 크기를 사용한다고 가정합니다. 이를 방지하려면 다음 단계를 완료하세요.
PAGE_SIZE
를 참조하는 하드 코딩된 종속 항목을 삭제합니다. 상수 또는 인스턴스가 포함된 코드 로직은 4KB (4096
)입니다.대신
getpagesize()
또는sysconf(_SC_PAGESIZE)
를 사용하세요.mmap()
및 페이지 정렬이 필요한 기타 API의 사용법을 찾아보세요. 인수를 사용하고 필요한 경우 대안으로 교체할 수 있습니다.
앱에서 PAGE_SIZE
를
기본 페이지 크기와 연결된 경우 이로 인해 앱에
(16KB 모드에서 사용) 그러나 이 값이 커널에 전달된 경우에는
MAP_FIXED
가 없는 mmap
를 사용해도 커널은 여전히 전체 페이지를 사용합니다.
약간의 메모리를 낭비합니다 따라서 16KB의 경우 PAGE_SIZE
는 정의되지 않습니다.
모드는 NDK r27 이상에서 사용 설정됩니다.
앱에서 이러한 방식으로 PAGE_SIZE
를 사용하고 이 값을
PAGE_SIZE
를 사용하는 대신 새 변수로 새 변수를 만듭니다.
다른 용도로 사용되며 실제
메모리 페이지로 이동합니다.
16KB 환경에서 앱 테스트
16KB 기기가 지원되는 앱을 빌드한 후에는 16KB 환경에서 앱을 테스트하여 앱 환경이 될 수 있습니다. 이를 위해서는 다음 단계를 따르세요.
다음 테스트 환경 중 하나를 설정합니다.
테스트 기기를 시작한 후 다음 명령어를 실행하여 16KB 환경을 사용합니다.
adb shell getconf PAGE_SIZE
명령어는
16384
값을 반환해야 합니다.모든 공유 라이브러리의 경우 공유 라이브러리의 ELF 세그먼트는 16KB ELF 정렬을 사용하여 올바르게 정렬되어야 합니다. 이 스크립트를 사용하여 도움이 될 수 있습니다
#!/bin/bash # usage: alignment.sh path to search for *.so files dir="$1" RED="\e[31m" GREEN="\e[32m" ENDCOLOR="\e[0m" matches="$(find $dir -name "*.so" -type f)" IFS=$'\n' for match in $matches; do res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)" if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)" else echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)" fi done
스크립트를
alignment.sh
와 같은 파일에 저장합니다.앱의 APK 파일을 추출합니다.
unzip APK_NAME.apk -d /tmp/my_apk_out
/tmp/my_apk_out
에 있는 추출된 파일에서 스크립트를 실행합니다. 디렉터리:alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
스크립트는 모든
ALIGNED
UNALIGNED
arm64-v8a
개의 공유 라이브러리arm64-v8a
공유 라이브러리가UNALIGNED
인 경우 다음을 실행해야 합니다. 해당 라이브러리의 패키징을 업데이트한 다음 코드를 다시 컴파일하여 앱을 호출하고 이 섹션의 단계에 따라 다시 테스트합니다.
다음
zipalign
명령어를 실행하여 앱이 다음과 같은지 확인합니다. 16KB 정렬, 여기서 APK_NAME은 이름 앱의 APK 파일:zipalign -c -P 16 -v 4 APK_NAME.apk
앱의 영향을 받을 수 있는 영역에 초점을 맞춰 앱을 철저하게 테스트하세요. 특정 페이지 크기를 참조하는 코드 인스턴스를 변경할 수 없습니다.
16KB 기반 Android 15 시스템 이미지로 Android Emulator 설정
Android Emulator를 사용하여 16KB 환경을 설정하려면 다음을 따르세요. 단계:
16KB 기반의 Android 15 에뮬레이터 시스템 이미지는 Android 스튜디오 Jellyfish | 2023.3.1 이상 그러나 최적의 최신 버전을 다운로드하세요. 미리보기 버전을 사용합니다.
기존 버전의 Android 스튜디오를 그대로 유지할 수 있음 여러 버전을 함께 설치할 수 있습니다.
Android 스튜디오에서 Tools > SDK Manager를 클릭합니다.
SDK Platforms 탭에서 Show Package Details를 선택한 다음 펼칩니다. Android VanillaIceCream Preview 섹션에서 사용하는 가상 기기에 따라 다음 에뮬레이터 시스템 이미지를 다음 항목을 만들 수 있습니다.
- Google API 실험용 16k 페이지 크기 ARM 64 v8a 시스템 이미지
- Google API 실험용 16k 페이지 크기 Intel x86_64 Atom 시스템 이미지
적용 > 확인을 탭하여 선택한 시스템 이미지를 다운로드합니다.
Android 15용 가상 기기를 설정하는 단계를 따르세요. 시스템 이미지를 선택하라는 메시지가 표시되면 시스템에 표시되는 16KB 시스템 이미지를 표시됩니다. 자동으로 추천되지 않는 경우 기타 이미지 탭에 16KB 시스템 이미지
- 기기 관리자에서 16KB 이미지 옆에 있는 점 3개를 클릭한 다음 디스크에 표시.
- 이 폴더에서
config.ini
파일을 찾습니다. config.ini
파일에 다음 줄을 추가하고 변경사항을 저장합니다.kernel.parameters = androidboot.page_shift=14
변경사항을 확인하려면 다음 명령어를 실행합니다.
16384
:adb shell getconf PAGE_SIZE