Önceden Android yalnızca 4 KB bellekli sayfa boyutlarını destekliyordu. toplam bellek miktarının ortalaması için optimize edilmiş sistem bellek performansı Android cihazlar genellikle AOSP, Android 15'ten itibaren 16 KB (16 KB) sayfa boyutunu kullanacak şekilde yapılandırılmış cihazlar cihazlar). Uygulamanız doğrudan NDK kitaplıkları kullanıyorsa veya dolaylı olarak bir SDK üzerinden alırsa, bunun için uygulamanızı bu 16 KB'lık cihazlarda çalışır.
Cihaz üreticileri, her gün daha fazla cihaz için (RAM) yüklü olduğu varsayıldığında, bu cihazların çoğu 16 KB (ve cihaz performansını optimize etmek için kullanılan sayfa boyutları arasında büyük fark vardır. Ekleme 16 KB sayfa boyutundaki cihazlar için destek, uygulamanızın bu ve uygulamanızın ilişkili performanstan yararlanmasına yardımcı olur tek yolu değildir. Yeniden derleme işlemi yapılmadığında uygulamalar 16 KB cihazlarda çalışmayabilir. kullanıma sunduk.
Uygulamanız için destek eklemenize yardımcı olmak üzere Uygulamanız etkilendiyse uygulamanızı yeniden derleyin (geçerliyse) ve uygulamanızı şurada test edin: emülatörler kullanan 16 KB ortam (Android 15 dahil) için sistem görüntüleri) ekleyebilirsiniz.
Avantajlar ve performans kazanımları
16 KB sayfa boyutlarıyla yapılandırılan cihazlar, ortalama olarak biraz daha fazla bellek kullanır. Ancak, hem sistem hem de uygulamalar için çeşitli performans iyileştirmeleri sağlar:
- Sistem bellek baskısı altındayken daha düşük uygulama başlatma süreleri: Test ettiğimiz bazı uygulamalarda daha belirgin iyileştirmeler (%30'a varan) ile birlikte ortalama %3, 16 daha düşük
- Uygulama başlatma sırasında güç tüketimi azaltıldı: Ortalama% 4,56 oranında azalma
- Daha hızlı kamera başlatma: Ortalama% 4,48 daha hızlı çalışır durumda başlatma ve ortalama% 6,60 daha hızlı soğuk başlatma
- İyileştirilmiş sistem önyükleme süresi: Ortalama %8 (yaklaşık 950 milisaniye) iyileşme
Bu iyileştirmeler, ilk testlerimizi temel almaktadır ve gerçek cihazlardaki sonuçlar büyük olasılıkla farklılık gösterecektir. Testlerimizi sürdürürken uygulamaların olası kazanımlara ilişkin ek analizler sağlayacağız.
Uygulamanızın etkilenip etkilenmediğini kontrol edin
Uygulamanız yerel kod kullanıyorsa uygulamanızı 16 KB cihaz desteğiyle yeniden oluşturmanız gerekir. Uygulamanızın doğal kod kullanıp kullanmadığından emin değilseniz doğal kod olup olmadığını belirlemek için APK Analizörü'nü kullanabilir ve ardından bulduğunuz ELF segmentlerinin uyumluluğunu kontrol edebilirsiniz.
Uygulamanızda, tüm kitaplıklar veya SDK'lar dahil olmak üzere yalnızca Java programlama dilinde veya Kotlin'de yazılmış kod kullanılıyorsa uygulamanız zaten 16 KB'lık cihazları destekliyor demektir. Yine de uygulama davranışında beklenmedik bir regresyon olmadığını doğrulamak için uygulamanızı 16 KB'lık bir ortamda test etmenizi öneririz.
Uygulamanız yerel kod kullanıyor mu?
Uygulamanız aşağıdakilerden herhangi biri için yerel kod kullanıyorsa:
- Uygulamanızda C/C++ (yerel) kodu kullanılıyor. Uygulamanız Android NDK kullanıyorsa doğal kod kullanıyor demektir.
- Uygulamanız, bunları kullanan üçüncü taraf yerel kitaplıklara veya bağımlılıklara (SDK gibi) bağlantı veriyor.
- Uygulamanız, cihazda yerel kitaplıklar kullanan üçüncü taraf bir uygulama oluşturucu tarafından oluşturuldu.
APK Analizcisi'ni kullanarak yerel kitaplıkları belirleme
APK Analizcisi, derlenmiş bir APK'nın çeşitli yönlerini değerlendirmenize olanak tanıyan bir araçtır. Uygulamanızın yerel kod mu yoksa kitaplık mı kullandığını belirlemek için şu adımları izleyin:
- Android Studio'yu açın, ardından Dosya > Aç'ı tıklayın ve herhangi bir projeyi seçin.
Menü çubuğundan Derle > APK'yı analiz et...'i tıklayın.
Analiz etmek istediğiniz APK'yı seçin.
Paylaşılan nesne (
.so
) dosyalarını (varsa) barındıranlib
klasörüne bakın. Paylaşılan nesne dosyaları varsa uygulamanız yerel kodu kullanır. Ortak nesne dosyası yoksa veyalib
klasörü yoksa uygulamanız doğal kod kullanmıyor demektir.
Paylaşılan kitaplıklar için ELF segmentlerinin hizalamasını kontrol etme
Paylaşılan kitaplıklarda, paylaşılan kitaplıkların ELF segmentlerinin 16 KB ELF hizası kullanılarak düzgün şekilde hizalandığını doğrulayın. Linux veya macOS'te geliştirme yapıyorsanız aşağıdaki bölümde açıklandığı şekilde check_elf_alignment.sh
komut dosyasını kullanabilirsiniz. Doğrudan komut satırı araçlarını da kullanabilirsiniz.
check_elf_alignment.sh komut dosyasını kullanma (Linux veya macOS)
check_elf_alignment.sh
komut dosyasını kullanarak ELF segmentlerinin hizalamasını kontrol etmek için aşağıdaki adımları uygulayın:
check_elf_alignment.sh
komut dosyasını bir dosyaya kaydedin.Komut dosyasını uygulamanızın APK dosyasında çalıştırın:
check_elf_alignment.sh APK_NAME.apk
Komut dosyası, paylaşılan tüm
arm64-v8a
kitaplıkları içinALIGNED
veyaUNALIGNED
çıktısını verir.arm64-v8a
veyax86_64
paylaşılan kitaplıklarUNALIGNED
ise bu kitaplıkların paketini güncellemeniz, ardından uygulamanızı yeniden derlemeniz ve bu bölümdeki adımları uygulayarak yeniden test etmeniz gerekir.
Komut satırı araçlarını doğrudan kullanma
Doğrudan komut satırı araçlarını kullanarak ELF segmentlerinin hizalamasını kontrol etmek için şu adımları uygulayın:
- Hem Android SDK Derleme Araçları 35.0.0 veya sonraki bir sürümünün hem de Android NDK'nın Android Studio'daki SDK Yöneticisi veya
sdkmanager
komut satırı aracı kullanılarak yüklendiğinden emin olun. Uygulamanızın APK dosyasını ayıklayın:
Linux veya macOS
unzip APK_NAME.apk -d /tmp/my_apk_out
Windows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
APK dosyanızı çıkardığınız geçici dizinde, paylaşılan nesne (
.so
) dosyalarınınlib
dizininin içeriğini kontrol edin. Bunlar, APK Analiz Aracı'nı kullanarak yerel kitaplıkları tanımlarken kullandığınız paylaşılan nesne dosyalarının aynısıdır. Her paylaşılan nesne dosyasında aşağıdaki komutu çalıştırın:Linux veya macOS
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD
Windows (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"
Burada
SDK_ROOT_LOCATION
, Android SDK'yı yüklediğiniz dizinin yolu,SHARED_OBJECT_FILE
kontrol ettiğiniz paylaşılan nesne dosyasının adı veNDK_VERSION
, yüklediğiniz Android NDK sürümüdür (ör.28.0.12433566
). Kontrol ettiğiniz her dosya için çıkış aşağıdaki gibi görünür: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**14
Yük segmentlerinin
2**14
'ten düşük değerlere sahip olmadığından emin olmak için çıkış satırlarını kontrol edin. Yükleme segmentleri2**13
,2**12
veya daha düşük değerlere sahipse bu kitaplıkların paketini güncellemeniz, ardından uygulamanızı yeniden derlemeniz ve bu bölümdeki adımları uygulayarak yeniden test etmeniz gerekir.Ardından, uygulamanızın APK dosyasında
zipalign
komut satırı aracını çalıştırın:Linux veya macOS
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
Burada
SDK_ROOT_LOCATION
, Android SDK'yı yüklediğiniz dizinin yolu,APK_NAME
ise uygulamanızın APK dosyasının adıdır. Paylaşılan tüm kitaplıklar doğru bir şekilde hizalanırsa çıkışın son satırında "Doğrulama başarılı" yazar.Doğrulama başarısız olursa bazı paylaşılan kitaplıkların yeniden düzenlenmesi gerekir. Bu nedenle, bu kitaplıkların paketini güncellemeniz ve ardından uygulamanızı yeniden derleyip bu bölümdeki adımları izleyerek yeniden test etmeniz gerekir.
Uygulamanızı 16 KB cihaz desteğiyle derleme
Yerel kod kullanan uygulamaların, 16 KB cihazları desteklemek için aşağıdaki bölümlerde özetlenen adımları tamamlaması gerekir. AGP'yi 8.5.1 veya daha yeni bir sürüme, NDK'yı ise r28 veya daha yeni bir sürüme güncelleyip 16 KB uyumlu önceden derlenmiş bağımlılıklar kullanırsanız uygulamalar varsayılan olarak 16 KB uyumlu olur.
Paylaşılan kitaplıklarınızın paketini güncelleme
AGP 8.5.1 veya daha yeni bir sürüme yükseltmenizi ve sıkıştırılmamış paylaşılan kitaplıkları kullanmanızı öneririz.
AGP 8.5.1 veya sonraki sürümler
16 KB'lık cihazlarda, sıkıştırılmamış paylaşılan kitaplıklarla birlikte gönderilen uygulamaların, kitaplıkları 16 KB sıkıştırılmış hizalama sınırına göre hizalaması gerekir. Bunu yapmak için Android Gradle Plugin (AGP) 8.5.1 veya sonraki bir sürüme geçmeniz gerekiyor. Yükseltme işlemiyle ilgili ayrıntılar için Android Gradle eklentisi Yükseltme Asistanı bölümüne bakın.
AGP 8.5 veya önceki sürümler
AGP'yi 8.5.1 veya sonraki bir sürüme yükseltemezseniz sıkıştırılmış paylaşılan kitaplıklara geçmek alternatif bir seçenektir. Eşlenmemiş paylaşılan kitaplıklarla ilgili uygulama yükleme sorunlarını önlemek için Gradle yapılandırmanızı, Gradle'ın uygulamanızı paketlerken paylaşılan kitaplıklarınızı sıkıştırmasını sağlayacak şekilde güncelleyin.
Eski
build.gradle
dosyanıza aşağıdaki seçeneği ekleyin:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
build.gradle.kts
dosyanıza aşağıdaki seçeneği ekleyin:
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
Uygulamanızı 16 KB ELF uyumluluğuyla derleyin
16 KB'lık cihazlarda, uygulamanızın çalışması için paylaşılan kitaplıkların ELF segmentlerinin 16 KB ELF hizalaması kullanılarak uygun şekilde hizalanması gerekir.
Uygulamanızı 16 KB ELF hizalaması kullanarak derlemek için kullandığınız Android NDK sürümüne bağlı olarak aşağıdaki bölümlerden birindeki adımları tamamlayın.
Android NDK r28 ve sonraki sürümler
NDK r28 ve sonraki sürümler varsayılan olarak 16 KB'lık hizalamayla derlenir.
Android NDK r27
16 KB'lık hizalanmış paylaşılan kitaplıkların Android NDK r27 ve sonraki sürümleriyle derlenmesini desteklemek için ndk-build
, build.gradle
, build.gradle.kts
veya bağlayıcı işaretlerinizi aşağıdaki gibi güncellemeniz gerekir:
ndk-build
Application.mk
içinde:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Groovy
build.gradle
dosyanızda -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
bağımsız değişkenini ayarlayın:
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
dosyanızda -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
bağımsız değişkenini ayarlayın:
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")
}
}
}
}
Diğer derleme sistemleri
Aşağıdaki bağlayıcı işaretlerini belirtin:
-Wl,-z,max-page-size=16384
Android NDK r26 ve önceki sürümler
16 KB'lık hizalanmış paylaşılan kitaplıkların Android NDK r26 veya daha eski bir sürümle derlenmesini desteklemek için ndk-build
veya cmake
yapılandırmanızı aşağıdaki gibi güncellemeniz gerekir:
ndk-build
16 KB ELF hizalamasını etkinleştirmek için Android.mk
dosyanızı güncelleyin:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
16 KB ELF hizalamasını etkinleştirmek için CMakeLists.txt
dosyanızı güncelleyin:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Belirli sayfa boyutlarına atıfta bulunan kod örneklerini kontrol edin
Uygulamanız 16 KB hizalı olsa bile, kodunuzdaki yerlerde bir cihazın belirli bir sayfa boyutu kullandığı varsayılırsa uygulamanız hatalarla karşılaşabilir. Bunu önlemek için aşağıdaki adımları uygulayın:
PAGE_SIZE
sabitine referans veren sabit kodlu bağımlılıkları veya kod mantığınızda, cihaz sayfa boyutunun 4 KB (4096
) olduğunu varsayan örnekleri kaldırın.Bunun yerine
getpagesize()
veyasysconf(_SC_PAGESIZE)
kullanın.mmap()
ve sayfaya hizalanmış bağımsız değişkenler gerektiren diğer API'lerin kullanımlarını arayın ve gerektiğinde alternatiflerle değiştirin.
Bazı durumlarda, uygulamanız temel sayfa boyutuna bağlı olmayan uygun bir değer olarak PAGE_SIZE
kullanıyorsa bu, 16 KB modunda kullanıldığında uygulamanızın bozulmasına neden olmaz. Ancak bu değer, MAP_FIXED
olmadan mmap
ile çekirdeğe iletilirse çekirdek yine de bir sayfanın tamamını kullanır ve bu da bazı belleklerin boşa harcanmasına neden olur. Bu nedenlerden dolayı, NDK r27 ve sonraki sürümlerde 16 KB modu etkinleştirildiğinde PAGE_SIZE
tanımlanmaz.
Uygulamanız PAGE_SIZE
öğesini bu şekilde kullanıyorsa ve bu değeri hiçbir zaman çekirdeğe aktarmazsa PAGE_SIZE
yerine başka amaçlar için kullanıldığını ve gerçek bir bellek sayfasını yansıtmayan yeni bir ada sahip yeni bir değişken oluşturun.
16 KB desteği için SDK'ları kontrol etme
Birçok SDK, özellikle kendiniz oluşturursanız veya en son önceden oluşturulmuş SDK'ları alırsanız 16 KB sayfa boyutlarıyla uyumludur. Ancak bazı önceden derlenmiş SDK'lar veya SDK sürümleri 16 KB ile uyumlu olmadığından, 16 KB ile hangi sürümü kullanacağınızı belirlemek için her SDK sağlayıcının web sitesini kontrol etmeniz gerekir.
Uygulamanızı 16 KB'lık bir ortamda test etme
16 KB'lık cihazları destekleyecek şekilde uygulamanızı oluşturduktan sonra, regresyon yaşayıp yaşamadığını görmek için uygulamanızı 16 KB'lık bir ortamda test etmeniz gerekir. Bunu yapmak için şu adımları uygulayın:
Aşağıdaki test ortamlarından birini kurun:
Test cihazınızı başlatın, ardından 16 KB ortam kullandığını doğrulamak için aşağıdaki komutu çalıştırın:
adb shell getconf PAGE_SIZE
Komut,
16384
değerini döndürmelidir.Uygulamanızın 16 KB hizalı olduğunu doğrulamak için aşağıdaki
zipalign
komutunu çalıştırın. Burada APK_NAME, uygulamanızın APK dosyasının adıdır:zipalign -c -P 16 -v 4 APK_NAME.apk
Belirli sayfa boyutlarına atıfta bulunan kod örneklerini değiştirme nedeniyle etkilenebilecek alanlara odaklanarak uygulamanızı ayrıntılı bir şekilde test edin.
Android Emülatör'ü 16 KB tabanlı, Android 15 sistem görüntüsüyle kurun
Android Emulator'ü kullanarak 16 KB'lık bir ortam oluşturmak için aşağıdaki adımları uygulayın:
16 KB tabanlı Android 15 emülatör sistem görüntüleri, Android Studio Jellyfish | 2023.3.1 veya sonraki sürümlerle uyumludur. Ancak Android 15 Beta ile çalışırken en iyi deneyimi yaşamak için Android Studio'nun en son önizleme sürümünü indirin.
Birden fazla sürümü yan yana yükleyebileceğiniz için mevcut Android Studio sürümünüzü yüklü tutabileceğinizi unutmayın.
Android Studio'da Araçlar > SDK Yöneticisi'ni tıklayın.
SDK Platformları sekmesinde Paket Ayrıntılarını Göster'i işaretleyin, ardından Android VanillaIceCream Önizlemesi bölümünü genişletin ve oluşturmak istediğiniz sanal cihazlara bağlı olarak aşağıdaki emülatör sistem görüntülerinden birini veya ikisini birden seçin:
- Google API'leri Deneysel 16 KB Sayfa Boyutu ARM 64 v8a Sistem Görüntüsü
- Google API'leri Deneysel 16K Sayfa Boyutu Intel x86_64 Atom Sistem Görüntüsü
Seçtiğiniz sistem resimlerini indirmek için Uygula > Tamam'ı tıklayın.
Android 15 için sanal cihaz ayarlama adımlarını uygulayın ve sistem görüntüsü seçmeniz istendiğinde, indirdiğiniz 16 KB sistem görüntüsünü seçin. Otomatik olarak önerilmediyse 16 KB sistem görüntüsünü Diğer Görüntüler sekmesinde bulabilirsiniz.
- Cihaz Yöneticisi'nde, 16 KB'lık resmin yanındaki 3 noktayı, ardından Diskte Göster'i tıklayın.
- Bu klasörde
config.ini
dosyasını bulun. Aşağıdaki satırı
config.ini
dosyasına ekleyin ve değişikliklerinizi kaydedin:kernel.parameters = androidboot.page_shift=14
Değişikliklerinizi doğrulamak için aşağıdaki komutu çalıştırın. Bu komut
16384
değerini döndürmelidir:adb shell getconf PAGE_SIZE
Geliştirici seçeneklerini kullanarak cihazda 16 KB modunu etkinleştirin
Android 15 QPR1 sürümünden itibaren: bazı cihazlarda kullanılabilen geliştirici seçeneğini cihaz 16 KB modunda başlatmasını ve cihaz üzerinde test yapmasını sağlar.
Bu geliştirici seçeneği aşağıdaki cihazlarda kullanılabilir:
- Pixel 8 ve 8 Pro (Android 15 QPR1 Beta 1 veya sonraki sürüme sahip)