从历史上看,Android 仅支持 4 KB 内存页面大小,这优化了系统内存性能,以适应 Android 设备通常拥有的平均总内存量。从 Android 15 开始,AOSP 支持配置为使用 16 KB 页面大小的设备(16 KB 设备)。如果您的应用直接或通过 SDK 间接使用任何 NDK 库,则需要重新构建应用,才能在这些 16 KB 设备上运行。
随着设备制造商不断制造出具有更大物理内存 (RAM) 的设备,许多此类设备将采用 16 KB(最终甚至更大)的页面大小来优化设备性能。添加对 16 KB 页面大小设备的支持,可让您的应用在这些设备上运行,并帮助您的应用受益于相关的性能改进。如果不重新编译,应用将无法在未来 Android 版本的 16 KB 设备上运行。
为帮助您为应用添加支持,我们提供了相关指南,介绍了如何检查应用是否受到影响、如何重新构建应用(如果适用),以及如何使用模拟器(包括 Android 模拟器的 Android 15 系统映像)在 16 KB 环境中测试应用。
Manfaat dan peningkatan performa
Perangkat yang dikonfigurasi dengan ukuran halaman 16 KB menggunakan memori yang sedikit lebih banyak secara rata-rata, tetapi juga mendapatkan berbagai peningkatan performa untuk sistem dan aplikasi:
- Waktu peluncuran aplikasi lebih rendah saat sistem berada dalam tekanan memori: rata-rata 3,16% lebih rendah, dengan peningkatan yang lebih signifikan (hingga 30%) untuk beberapa aplikasi yang kami uji
- Mengurangi penggunaan daya selama peluncuran aplikasi: Pengurangan rata-rata 4,56%
- Peluncuran kamera lebih cepat: rata-rata hot start 4,48% lebih cepat dan cold start 6,60% lebih cepat
- Waktu booting sistem yang lebih baik: rata-rata meningkat sebesar 8% (sekitar 950 milidetik)
Peningkatan ini didasarkan pada pengujian awal kami, dan hasil pada perangkat aktual kemungkinan akan berbeda. Kami akan memberikan analisis tambahan tentang potensi keuntungan untuk aplikasi saat kami melanjutkan pengujian.
Periksa apakah aplikasi Anda terpengaruh
Jika aplikasi Anda menggunakan kode native, Anda harus membangun ulang aplikasi dengan dukungan untuk perangkat 16 KB. Jika tidak yakin apakah aplikasi Anda menggunakan kode native atau tidak, Anda dapat menggunakan APK Analyzer untuk mengidentifikasi apakah ada kode native atau tidak, lalu memeriksa perataan segmen ELF untuk library bersama yang Anda temukan. Android Studio juga menyediakan fitur yang membantu Anda mendeteksi masalah perataan secara otomatis.
Jika aplikasi Anda hanya menggunakan kode yang ditulis dalam bahasa pemrograman Java atau di Kotlin, termasuk semua library atau SDK, berarti aplikasi Anda sudah mendukung perangkat 16 KB. Namun, sebaiknya Anda menguji aplikasi di lingkungan 16 KB untuk memverifikasi bahwa tidak ada regresi perilaku aplikasi yang tidak terduga.
Apakah aplikasi Anda menggunakan kode native?
Aplikasi Anda menggunakan kode native jika salah satu hal berikut berlaku:
- Aplikasi Anda menggunakan kode C/C++ (native). Jika aplikasi Anda menggunakan Android NDK, berarti aplikasi Anda menggunakan kode native.
- Aplikasi Anda terhubung dengan library atau dependensi native pihak ketiga (seperti SDK) yang menggunakannya.
- Aplikasi Anda dibuat oleh pembuat aplikasi pihak ketiga yang menggunakan library native di perangkat.
Mengidentifikasi library native menggunakan APK Analyzer
APK Analyzer adalah alat yang memungkinkan Anda mengevaluasi berbagai aspek APK yang telah dibangun. Untuk memeriksa apakah aplikasi Anda menggunakan kode native (terlepas dari apakah aplikasi tersebut kompatibel dengan 16 KB):
- Buka Android Studio, lalu klik File > Open dan pilih project apa saja.
Dari panel menu, klik Build > Analyze APK...
Pilih APK yang ingin Anda analisis.
Lihat di dalam folder
lib, yang menghosting file objek bersama (.so) jika ada. Jika ada file objek bersama, aplikasi Anda menggunakan kode native. Kolom Penyelarasan menampilkan pesan peringatan untuk file yang memiliki masalah penyelarasan. Jika tidak ada file objek bersama atau tidak ada folderlib, berarti aplikasi Anda tidak menggunakan kode native.
Mendeteksi masalah perataan dengan pemeriksaan otomatis
Android Studio akan memberikan peringatan secara proaktif jika library atau APK bawaan Anda tidak mematuhi persyaratan 16 KB. Gunakan alat APK Analyzer untuk meninjau library mana yang perlu diupdate atau apakah ada perubahan kode yang diperlukan.
Lint di Android Studio juga menandai library native yang tidak selaras dengan 16 KB.
Memeriksa keselarasan segmen ELF untuk pustaka bersama
Untuk library bersama, pastikan segmen ELF library bersama diselaraskan dengan benar menggunakan penyelarasan ELF 16 KB. Jika Anda mengembangkan di
Linux atau macOS, Anda dapat menggunakan skrip check_elf_alignment.sh seperti yang dijelaskan di
bagian berikut. Anda juga dapat menggunakan alat command line secara langsung.
Gunakan skrip check_elf_alignment.sh (Linux atau macOS)
Ikuti langkah-langkah berikut untuk memeriksa perataan segmen ELF menggunakan skrip check_elf_alignment.sh:
Simpan skrip
check_elf_alignment.shke file.Jalankan skrip pada file APK aplikasi Anda:
check_elf_alignment.sh APK_NAME.apkSkrip akan menampilkan
ALIGNEDatauUNALIGNEDuntuk semua library bersamaarm64-v8a.Jika ada library bersama
arm64-v8aataux86_64yangUNALIGNED, Anda harus mengupdate pengemasan untuk library tersebut, lalu mengompilasi ulang aplikasi dan menguji ulang dengan mengikuti langkah-langkah di bagian ini.
Menggunakan alat command line secara langsung
Ikuti langkah-langkah berikut untuk memeriksa perataan segmen ELF menggunakan alat command line secara langsung:
- Pastikan Android SDK Build-Tools versi 35.0.0 atau yang lebih tinggi dan
Android NDK diinstal menggunakan SDK Manager di Android Studio atau
alat command line
sdkmanager. Ekstrak file APK aplikasi Anda:
Linux atau macOS
unzip APK_NAME.apk -d /tmp/my_apk_outWindows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_outDi direktori sementara tempat Anda mengekstrak file APK, periksa konten direktori
libuntuk menemukan file objek bersama (.so). Ini adalah file objek bersama yang sama yang akan Anda lihat saat mengidentifikasi library native menggunakan APK Analyzer. Jalankan perintah berikut pada setiap file objek bersama:Linux atau macOS
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOADWindows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"Dengan
SDK_ROOT_LOCATIONadalah jalur ke direktori tempat Anda menginstal Android SDK,SHARED_OBJECT_FILEadalah nama file objek bersama yang Anda periksa, danNDK_VERSIONadalah versi Android NDK yang telah Anda instal (misalnya,28.0.12433566). Output akan terlihat seperti berikut untuk setiap file yang Anda periksa:LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14 LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14 LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14Periksa baris output untuk memastikan segmen beban tidak memiliki nilai kurang dari
2**14. Jika ada segmen pemuatan yang memiliki nilai2**13,2**12, atau lebih rendah, Anda harus mengupdate pengemasan untuk library tersebut, lalu mengompilasi ulang aplikasi dan menguji ulang dengan mengikuti langkah-langkah di bagian ini.Selanjutnya, jalankan alat command line
zipalignpada file APK aplikasi Anda:Linux atau macOS
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apkWindows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apkDengan
SDK_ROOT_LOCATIONadalah jalur ke direktori tempat Anda menginstal Android SDK, danAPK_NAMEadalah nama file APK aplikasi Anda. Baris terakhir output akan menampilkan "Verification successful" jika semua library bersama diselaraskan dengan benar.Jika verifikasi gagal, beberapa library bersama perlu diselaraskan kembali, jadi Anda harus memperbarui pengemasan untuk library tersebut, lalu mengompilasi ulang aplikasi dan menguji ulang dengan mengikuti langkah-langkah di bagian ini.
Membangun aplikasi Anda dengan dukungan untuk perangkat 16 KB
Jika aplikasi Anda menggunakan kode native, selesaikan langkah-langkah yang diuraikan di bagian berikut untuk memastikan aplikasi Anda mendukung perangkat 16 KB:
- Memperbarui pengemasan library bersama Anda
- Kompilasi aplikasi Anda menggunakan penyelarasan ELF 16 KB
- Memperbaiki kode dan menyelesaikan masalah runtime
- Memeriksa dukungan 16 KB untuk SDK
Memperbarui pengemasan library bersama Anda
Lakukan upgrade ke AGP versi 8.5.1 atau yang lebih tinggi dan gunakan library bersama tanpa kompresi.
Gunakan bundletool untuk memverifikasi penyelarasan zip
Untuk melihat keselarasan paket Anda, gunakan:
bundletool dump config --bundle=<my .aab> | grep alignment
Jika Anda melihat PAGE_ALIGNMENT_16K, berarti permintaan paket Anda memiliki penyelarasan zip 16 KB. Jika Anda melihat PAGE_ALIGNMENT_4K, ini menginstruksikan APK yang dibuat dari
AAB ini agar memiliki file .so yang selaras 4 KB dalam file zip.
AGP versi 8.5.1 atau yang lebih tinggi
Perangkat 16 KB memerlukan aplikasi yang dikirim dengan library bersama yang tidak terkompresi untuk menyelaraskannya pada batas yang diselaraskan zip 16 KB. Untuk melakukannya, Anda harus mengupgrade ke Plugin Android Gradle (AGP) versi 8.5.1 atau yang lebih tinggi. Lihat bagian Upgrade Assistant plugin Android Gradle untuk mengetahui detail tentang proses upgrade.
AGP versi 8.5 atau yang lebih rendah
Jika Anda tidak dapat mengupgrade AGP ke versi 8.5.1 atau yang lebih tinggi, alternatifnya adalah beralih menggunakan library bersama yang dikompresi. Perbarui konfigurasi Gradle Anda agar Gradle mengompresi library bersama saat mengemas aplikasi Anda untuk menghindari masalah penginstalan aplikasi dengan library bersama yang tidak diselaraskan.
Groovy
Di file build.gradle, tambahkan opsi berikut:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
Di file build.gradle.kts, tambahkan opsi berikut:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
AGP versi 8.0 atau yang lebih rendah
Jika Anda menggunakan versi AGP yang sama atau lebih rendah dari 8.0, Anda juga perlu menonaktifkan opsi library native tanpa kompresi untuk App Bundle di file gradle.properties:
android.bundle.enableUncompressedNativeLibs=false
Kompilasi aplikasi Anda menggunakan penyelarasan ELF 16 KB
Perangkat 16 KB mengharuskan segmen ELF library bersama diselaraskan dengan benar menggunakan penyelarasan ELF 16 KB agar aplikasi Anda dapat berjalan.
Untuk developer game, jika game Anda berjalan di atas mesin game Unity, lihat panduan Unity. Jika game Anda berjalan di atas mesin game Unreal, lihat panduan Unreal. Untuk mesin game native, lanjutkan dengan panduan ini.
Untuk mengompilasi aplikasi menggunakan perataan ELF 16 KB, selesaikan langkah-langkah di salah satu bagian berikut, bergantung pada versi Android NDK yang Anda gunakan.
Android NDK r28 dan yang lebih tinggi
NDK versi r28 dan yang lebih tinggi dikompilasi dengan perataan 16 KB secara default.
Android NDK r27 dan yang lebih lama
Untuk mendukung kompilasi library bersama yang selaras dengan 16 KB dengan Android NDK versi r27 atau yang lebih rendah, gunakan flag linker berikut:
-Wl,-z,max-page-size=16384
-Wl,-z,common-page-size=16384
Berikut cara memperbarui file konfigurasi sistem build Anda:
ndk-build
Jika Anda menggunakan ndk-build, update Android.mk untuk mengaktifkan perataan ELF 16 KB:
LOCAL_LDFLAGS += -Wl,-z,max-page-size=16384 -Wl,-z,common-page-size=16384
CMake
Jika Anda menggunakan CMake, perbarui CMakeLists.txt untuk mengaktifkan penyelarasan ELF 16 KB:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE
"-Wl,-z,max-page-size=16384"
"-Wl,-z,common-page-size=16384"
)
Memperbaiki kode dan mengatasi masalah runtime
Meskipun aplikasi Anda kompatibel dengan 16 KB, aplikasi Anda dapat mengalami error jika tempat dalam kode Anda mengasumsikan bahwa perangkat menggunakan ukuran halaman tertentu. Untuk menghindarinya, selesaikan langkah-langkah berikut:
Hapus dependensi hard-coded yang mereferensikan konstanta
PAGE_SIZEatau instance dalam logika kode Anda yang mengasumsikan bahwa ukuran halaman perangkat adalah 4 KB (4096).Sebagai gantinya, gunakan
getpagesize()atausysconf(_SC_PAGESIZE).Cari penggunaan
mmap()dan API lain yang memerlukan argumen yang selaras dengan halaman dan ganti dengan alternatif jika diperlukan.
Dalam beberapa kasus, jika aplikasi Anda menggunakan PAGE_SIZE sebagai nilai praktis yang tidak
terkait dengan ukuran halaman pokok, maka hal ini tidak akan menyebabkan aplikasi Anda rusak saat
digunakan dalam mode 16 KB. Namun, jika nilai ini diteruskan ke kernel dengan
mmap tanpa MAP_FIXED, kernel tetap menggunakan seluruh halaman, yang membuang-buang
sebagian memori. Karena alasan ini, PAGE_SIZE tidak ditentukan saat mode 16 KB diaktifkan di NDK r27 dan yang lebih tinggi.
Jika aplikasi Anda menggunakan PAGE_SIZE dengan cara ini dan tidak pernah meneruskan nilai ini secara langsung ke kernel, maka alih-alih menggunakan PAGE_SIZE, buat variabel baru dengan nama baru untuk menunjukkan bahwa variabel tersebut digunakan untuk tujuan lain dan tidak mencerminkan halaman memori yang sebenarnya.
Memeriksa dukungan 16 KB pada SDK
Banyak SDK kompatibel dengan ukuran halaman 16 KB, terutama jika Anda membangunnya sendiri atau mendapatkan versi pra-build terbaru. Namun, karena beberapa SDK yang sudah dibuat sebelumnya atau versi SDK tidak kompatibel dengan 16 KB, Anda harus memeriksa situs setiap penyedia SDK untuk menentukan versi mana yang akan digunakan dengan 16 KB.
Menguji aplikasi Anda di lingkungan 16 KB
Setelah membangun aplikasi dengan dukungan untuk perangkat 16 KB, Anda harus menguji aplikasi di lingkungan 16 KB untuk melihat apakah aplikasi Anda mengalami regresi. Untuk melakukannya, ikuti langkah-langkah ini:
Siapkan Android 15 SDK atau yang lebih tinggi.
Siapkan salah satu lingkungan pengujian berikut:
Mulai perangkat pengujian Anda, lalu jalankan perintah berikut untuk memverifikasi bahwa perangkat tersebut menggunakan lingkungan 16 KB:
adb shell getconf PAGE_SIZEPerintah akan menampilkan nilai
16384.Jalankan perintah
zipalignberikut untuk memverifikasi bahwa aplikasi Anda selaras dengan 16 KB, dengan APK_NAME adalah nama file APK aplikasi Anda:zipalign -c -P 16 -v 4 APK_NAME.apkUji aplikasi Anda secara menyeluruh, dengan berfokus pada area yang mungkin terpengaruh oleh perubahan instance kode yang mereferensikan ukuran halaman tertentu.
Menyiapkan Android Emulator dengan image sistem berbasis 16 KB
Untuk menyiapkan lingkungan 16 KB menggunakan Emulator Android, ikuti langkah-langkah berikut:
- Di Android Studio, klik Tools > SDK Manager.
Di tab SDK Platforms, centang Show Package Details, lalu luaskan bagian Android VanillaIceCream atau yang lebih tinggi dan pilih satu atau kedua image sistem emulator berikut, bergantung pada perangkat virtual yang ingin Anda buat:
- Image Sistem ARM 64 v8a Ukuran Halaman 16 KB Eksperimental Google API
- Google API Experimental 16 KB Page Size Intel x86_64 Atom System Image
Klik Terapkan > Oke untuk mendownload image sistem yang Anda pilih.
Ikuti langkah-langkah untuk menyiapkan perangkat virtual untuk Android 15, dan saat diminta untuk memilih image sistem, pilih image sistem 16 KB yang Anda download. Jika tidak direkomendasikan secara otomatis, Anda dapat menemukan image sistem 16 KB di tab Image Lainnya.
Luncurkan emulator
Setelah Anda selesai menyiapkan Android Emulator dan perangkat virtual, luncurkan emulator dari menu perangkat target, atau dari command line.
使用开发者选项在设备上启用 16 KB 模式
切换以 16KB 页面大小启动设备开发者选项,以在 16 KB 模式下启动设备。
在 Android 15 的 QPR 版本中,您可以使用某些设备上提供的开发者选项,以 16 KB 模式启动设备并执行设备端测试。在使用开发者选项之前,请依次前往设置 > 系统 > 软件更新,并应用所有可用的更新。
此开发者选项适用于以下设备:
Pixel 8 和 Pixel 8 Pro(搭载 Android 15 QPR1 或更高版本)
Pixel 8a(搭载 Android 15 QPR1 或更高版本)
Pixel 9、9 Pro 和 9 Pro XL(搭载 Android 15 QPR2 或更高版本)
Pixel 9a(搭载 Android 16 或更高版本)
Mode kompatibilitas mundur 16 KB
Peringatan dalam mode kompatibilitas ukuran halaman
Opsi kompatibilitas mundur 16 KB tersedia saat perangkat berjalan dengan kernel 16 KB. Pengelola paket menjalankan aplikasi dalam mode kompatibilitas mundur 16 KB jika kondisi berikut terpenuhi:
- Jika aplikasi memiliki file ELF (dengan ekstensi
.so) dengan perataan segmen LOAD sebesar 4 KB. - Jika APK yang di-ZIP memiliki file ELF yang tidak dikompresi dan diselaraskan dengan ZIP 4 KB.
Jika pengelola paket telah mengaktifkan mode kompatibilitas mundur 16 KB untuk aplikasi, aplikasi akan menampilkan peringatan saat pertama kali diluncurkan yang menyatakan bahwa aplikasi berjalan dalam mode kompatibilitas mundur 16 KB.
Mode kompatibilitas mundur 16 KB memungkinkan beberapa aplikasi berfungsi, tetapi untuk keandalan dan stabilitas terbaik, aplikasi tetap harus selaras dengan 16 KB.
Di halaman info aplikasi, di bagian Lanjutan, aktifkan atau nonaktifkan setelan Jalankan aplikasi dengan mode kompatibilitas ukuran halaman untuk mengaktifkan atau menonaktifkan mode kompatibilitas mundur 16 KB untuk aplikasi tertentu. Setelan ini hanya terlihat saat perangkat berjalan dengan ukuran halaman 16 KB.
Setelan mode kompatibilitas ukuran halaman
Untuk mengaktifkan kompatibilitas mundur 16 KB secara paksa untuk setiap aplikasi di perangkat:
adb shell setprop bionic.linker.16kb.app_compat.enabled true
adb shell setprop pm.16kb.app_compat.disabled false
Untuk menonaktifkan kompatibilitas mundur 16 KB secara paksa untuk setiap aplikasi di perangkat:
adb shell setprop bionic.linker.16kb.app_compat.enabled false
adb shell setprop pm.16kb.app_compat.disabled true
Di Android 17, Anda juga dapat menonaktifkan kompatibilitas mundur 16 KB secara paksa untuk setiap aplikasi dan menyebabkan biner yang tidak kompatibel segera dibatalkan:
adb shell setprop bionic.linker.16kb.app_compat.enabled fatal
adb shell setprop pm.16kb.app_compat.disabled true
Tetapkan properti android:pageSizeCompat ke diaktifkan atau dinonaktifkan untuk mengaktifkan atau menonaktifkan mode kompatibilitas mundur untuk aplikasi tertentu di AndroidManifest.xml-nya. Jika properti ini ditetapkan, aplikasi tidak akan menampilkan peringatan mode kompatibilitas mundur saat diluncurkan.
Persyaratan kompatibilitas Google Play
Seiring produsen perangkat melengkapi perangkat dengan RAM yang lebih besar untuk mengoptimalkan performa, banyak yang akan mengadopsi ukuran halaman yang lebih besar seperti 16 KB. Untuk mempersiapkan peluncuran perangkat mendatang ini, Google Play memperkenalkan persyaratan kompatibilitas baru: mulai 1 November 2025, semua aplikasi baru dan update pada aplikasi yang sudah ada yang dikirimkan ke Google Play dan menargetkan perangkat yang menjalankan Android 15 (level API 35) dan yang lebih tinggi harus mendukung ukuran halaman 16 KB.
Untuk membaca lebih lanjut persyaratan kompatibilitas ini, lihat postingan blog ini.