Ö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.
Faydalar ve performans kazançları
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 elde eder:
- Sistem bellek baskısı altındayken daha düşük uygulama başlatma süreleri: Ortalama %3,16 daha düşük, test ettiğimiz bazı uygulamalar için daha önemli iyileştirmeler (%30'a kadar)
- Uygulama başlatılırken daha az güç tüketimi: Ortalama% 4,56 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ı baştan başlatma
- İyileştirilmiş sistem başlatma süresi: Ortalama %1,5 (yaklaşık 0,8 saniye) iyileştirildi
Bu iyileştirmeler, yaptığımız ilk testlere dayanmaktadır ve gerçek cihazlardaki sonuçlar muhtemelen farklılık gösterecektir. Testlerimize devam ederken, uygulamalar için potansiyel kazançlarla ilgili ek analizler sağlayacağız.
Uygulamanızın etkilenip etkilenmediğini kontrol etme
Uygulamanız herhangi bir yerel kod kullanıyorsa uygulamanızı 16 KB'lık cihazları destekleyecek şekilde yeniden oluşturmanız gerekir. Uygulamanızın yerel kod kullanıp kullanmadığından emin değilseniz yerel kod olup olmadığını belirlemek için APK Analiz Aracı'nı kullanabilirsiniz.
Uygulamanız tüm kitaplıklar veya SDK'lar dahil olmak üzere yalnızca Java programlama dilinde veya Kotlin'de yazılmış kod kullanıyorsa zaten 16 KB'lık cihazları destekliyor demektir. Bununla birlikte, uygulama davranışında beklenmedik regresyonlar olmadığını doğrulamak için uygulamanızı 16 KB'lık bir ortamda test etmenizi öneririz.
Uygulamanız yerel kod kullanıyor mu?
Aşağıdakilerden herhangi biri geçerliyse uygulamanız yerel koddan yararlanır:
- Uygulamanız tüm C/C++ (yerel) kodlarını kullanıyor. Uygulamanız Android NDK kullanıyorsanız uygulamanız yerel kodu kullanır.
- Uygulamanız, nasıl kullanacağınızı göstereceğim.
- Uygulamanız, olanak tanır.
APK Analiz Aracı'nı kullanarak yerel kitaplıkları tanımlama
APK Analizcisi, APK'nızın çeşitli yönlerini değerlendirmenizi sağlayan bir araçtır. APK'ya dokunun. Uygulamanızın yerel kod mu yoksa kitaplık mı kullandığını belirlemek için şu adımları uygulayın: için şu adımları izleyin:
- Android Studio'yu açın, ardından Dosya > Aç'ı tıklayıp bir proje seçin.
Menü çubuğunda Derleme > APK'yı analiz et...
Analiz etmek istediğiniz APK'yı seçin.
Varsa paylaşılan nesne (
.so
) dosyalarını barındıranlib
klasörüne bakın olduğundan emin olun. Paylaşılan nesne dosyaları varsa uygulamanız yerel veri kullanır girin. Paylaşılan nesne dosyası yoksa veyalib
klasörü yoksa uygulamanız yerel kod kullanmaz.
Uygulamanızı 16 KB'lık cihazların desteğiyle oluşturun
Yerel kod kullanan uygulamaların, 16 KB'lık cihazları desteklemek için adımları uygulayın.
Paylaşılan kitaplıklarınızın paketini güncelleyin
AGP 8.3 veya daha yeni bir sürüme yükseltmenizi ve sıkıştırılmamış halde kullanmanızı öneririz koordineli olacaklardır.
AGP 8.3 veya daha sonraki bir sürüm
16 KB'lık cihazlarda, sıkıştırılmamış paylaşılan kitaplıklarla gönderilen uygulamalar gerekir: bunları 16 KB'lık zip hizalamalı bir sınır üzerinde hizalayın. Bunun için önce yeni sürüme geçmeniz gerekiyor Android Gradle Plugin (AGP) 8.3 veya daha yeni bir sürüme. Daha fazla bilgi için Android Yükseltme işlemiyle ilgili ayrıntılar için Gradle eklentisi Yükseltme Asistanı bölümüne bakın.
AGP 8.2 veya daha eski bir sürüm
AGP'yi 8.3 veya sonraki bir sürüme yükseltemiyorsanız alternatif olarak sıkıştırılmış paylaşılan kitaplıkları kullanmaya geçin. Gradle yapılandırmanızı şu şekilde güncelleyin: Gradle'ın, uygulamadan kaçınmak için uygulamanızı paketleme sırasında paylaşılan kitaplıklarınızı sıkıştırmasını sağlama hizalanmamış paylaşılan kitaplıklarla ilgili yükleme sorunları.
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
}
}
}
16 KB ELF hizalaması kullanarak uygulamanızı derleyin
16 KB'lık cihazlar için paylaşılan kitaplıklar gerekir Hizalanacak ELF segmentleri düzgün şekilde çalışması için 16 KB ELF hizalaması kullanmanız gerekir.
Uygulamanızı 16 KB ELF hizalamasını kullanarak derlemek için Android NDK sürümüne bağlı olarak aşağıdaki bölümlerden yardımcı oluyorum.
Android NDK r26 ve önceki sürümler
Android NDK ile 16 KB'a uygun paylaşılan kitaplıkların derlenmesini desteklemek için
r26 veya daha eski bir sürüme sahipseniz ndk-build
ya da cmake
cihazınızı güncellemeniz gerekir.
şu şekilde yapılandırmalısınız:
ndk-kurum
16 KB ELF hizalamasını etkinleştirmek için Android.mk
öğenizi güncelleyin:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
16 KB ELF hizalamasını etkinleştirmek için CMakeLists.txt
öğenizi güncelleyin:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Android NDK r27 ve sonraki sürümler
Android NDK ile 16 KB'a uygun paylaşılan kitaplıkların derlenmesini desteklemek için
r27 ve sonraki sürümler için ndk-build
, build.gradle
,
build.gradle.kts
veya aşağıdaki gibi bağlayıcı flag'leri:
ndk-kurum
Application.mk
içinde:
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Eski
build.gradle
dosyanızda bağımsız değişkeni ayarlayın
-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
dosyanızda bağımsız değişkeni ayarlayın
-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")
}
}
}
}
Diğer derleme sistemleri
Aşağıdaki bağlayıcı işaretlerini belirtin:
-Wl,-z,max-page-size=16384
Belirli sayfa boyutlarına referans veren kod örneklerini kontrol etme
Uygulamanız 16 KB hizalı olsa bile bir cihazın belirli bir sayfa boyutu kullandığını varsayın. Bunu önlemek için aşağıdaki adımları tamamlayın:
PAGE_SIZE
öğesine referans veren sabit kodlu bağımlılıkları kaldırın. sabit değer veya kod mantığınızda cihaz sayfasının daha fazla kontrol gerçekleştirmek üzere boyut 4 KB (4096
).Bunun yerine
getpagesize()
veyasysconf(_SC_PAGESIZE)
kullanın.Sayfaya hizalama gerektiren
mmap()
ve diğer API'lerin kullanımlarını bulun argümanları ve gerektiğinde alternatifleri kullanın.
Bazı durumlarda, uygulamanız kullanışlı bir değer olarak PAGE_SIZE
kullanıyorsa
bağlı değilse bu, uygulamanızın bozulmasına neden olmaz.
yalnızca 16 KB modunda kullanıldığında. Ancak bu değer, çekirdeğe aktarılırsa
MAP_FIXED
içermeyen mmap
kullanıldığında çekirdek yine de sayfanın tamamını kullanır ve
bellek israfına neden olur. Bu nedenlerle, 16 KB olduğunda PAGE_SIZE
tanımsızdır
modu NDK r27 ve sonraki sürümlerde etkinleştirilmiştir.
Uygulamanız PAGE_SIZE
öğesini bu şekilde kullanıyorsa ve bu değeri
kullanın, ardından PAGE_SIZE
yerine yeni bir değer içeren yeni bir değişken oluşturun.
başka amaçlar için kullanıldığını ve gerçek bir değeri yansıtmadığını belirten bir ad
hafıza sayfası.
Uygulamanızı 16 KB'lık bir ortamda test edin
16 KB'lık cihazların desteğiyle uygulamanızı oluşturduktan sonra uygulamanızı 16 KB'lık bir ortamda test ederek regresyonlardan oluşur. Bunu yapmak için şu adımları uygulayın:
Aşağıdaki test ortamlarından birini kurun:
Test cihazınızı başlatın ve aşağıdaki komutu çalıştırarak şunu doğrulayın: 16 KB'lık bir ortam kullanıyorsa:
adb shell getconf PAGE_SIZE
Komutun
16384
değerini döndürmesi gerekir.Paylaşılan kitaplıklar için, paylaşılan kitaplıkların ELF segmentleri 16 KB ELF hizalaması kullanılarak düzgün şekilde hizalanmalıdır. Bu komut dosyasını şunlar için kullanabilirsiniz: bu işlemle ilgili yardım almak istiyorum:
#!/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
Komut dosyasını
alignment.sh
gibi bir dosyaya kaydedin.Uygulamanızın APK dosyasını çıkarın:
unzip APK_NAME.apk -d /tmp/my_apk_out
Çıkarılan dosyalarda komut dosyasını
/tmp/my_apk_out
çalıştırın. dizin:alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
Komut dosyası tüm etiketler için
ALIGNED
veyaUNALIGNED
arm64-v8a
paylaşılan kitaplık.arm64-v8a
paylaşılan kitaplıklarından herhangi biriUNALIGNED
ise şunları yapmanız gerekir: bu kitaplıkların paketini güncelleyin, ardından bu kitaplıkların paketini yeniden derleyin uygulamanızı indirin ve bu bölümdeki adımları uygulayarak yeniden test edin.
Uygulamanızın şu özelliklere sahip olduğunu doğrulamak için aşağıdaki
zipalign
komutunu çalıştırın: 16 KB hizalı; burada APK_NAME, Uygulamanızın APK dosyası:zipalign -c -P 16 -v 4 APK_NAME.apk
Uygulamanızı kapsamlı bir şekilde test ederek, belirli sayfa boyutlarına referans veren kod örneklerini değiştirme.
Android Emülatör'ü 16 KB tabanlı, Android 15 sistem görüntüsüyle kurun
Android Emülatör'ü kullanarak 16 KB'lık bir ortam oluşturmak için şu adımları uygulayın: için şu adımları izleyin:
16 KB tabanlı Android 15 emülatör sistem görüntüleri şunlarla uyumludur: Android Studio Denizanası | 2023.3.1 veya sonraki sürümler. Ancak örneğin, Lütfen, Android 15 Beta ile çalışırken deneyim edinmek için önizleme sürümüne gidin.
Mevcut Android Studio sürümünüzü kullanmaya devam edebileceğinizi unutmayın. birden çok sürümü yan yana yükleyebileceğinizden.
Android Studio'da Araçlar > SDK Yöneticisi'ne gidin.
SDK Platformları sekmesinde Paket Ayrıntılarını Göster'i işaretleyip genişletin. Android VanillaIceCream Önizlemesi bölümünü ziyaret edin ve Yüklediğiniz sanal cihazlara bağlı olarak aşağıdaki emülatör sistem görüntüleri oluşturmak istiyorum:
- Google API'leri Deneysel 16.000 Sayfa Boyutu ARM 64 v8a Sistem Resmi
- Google API'leri Deneysel 16K Sayfa Boyutu Intel x86_64 Atom Sistem Görüntüsü
Uygula > Tamam'ı tıklayarak seçtiğiniz sistem görüntülerini indirin.
Android 15 için sanal cihaz ayarlama adımlarını uygulayın ve sistem resmi seçmeniz istendiğinde, sistem resmi olarak kullanılacak 16 KB'lık indiremezsiniz. Otomatik olarak önerilmiyorsa Diğer Resimler sekmesinde 16 KB'lık sistem resmi.
- Cihaz Yöneticisi'nde, 16 KB'lık resmin yanındaki 3 noktayı, ardından Diskte Göster.
- 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. Komut çalıştırıldığında,
16384
:adb shell getconf PAGE_SIZE