Ö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'lık cihazları destekleyecek şekilde 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. Bununla birlikte, uygulama davranışında beklenmedik gerileme olmadığından emin olmak 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ıklar veya bağımlılıklarla (ör. SDK'lar) bağlantı kurar.
- Uygulamanız, cihazda yerel kitaplıklar kullanan üçüncü taraf bir uygulama oluşturucu tarafından oluşturuldu.
APK Analizcisi'ni kullanarak yerel kitaplıkları tanımlama
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 aşağıdaki adımları uygulayın:
- 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 kod 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 uyumluluğunu 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ı, tüm
arm64-v8a
paylaşılan kitaplıkları içinALIGNED
veyaUNALIGNED
değerini döndürür.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
ELF segmentlerinin hizalamasını doğrudan komut satırı araçlarını kullanarak kontrol etmek için aşağıdaki 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ı ayıkladığınız geçici dizinde, paylaşılan nesne (
.so
) dosyaları içinlib
dizininin içeriğini kontrol edin. Bunlar, APK Analiz Aracı'nı kullanarak yerel kitaplıkları tanımlarken göreceğiniz paylaşılan nesne dosyalarıyla aynı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 kitaplıkların tümü doğru şekilde hizalanmışsa çıktının son satırında "Doğrulama başarılı" ifadesi gösterilir.Doğrulama başarısız olduysa bazı paylaşılan kitaplıkların yeniden düzenlenmesi gerekir. Bu nedenle, 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.
Uygulamanızı 16 KB cihaz desteğiyle derleme
Yerel kod kullanan uygulamaların, 16 KB'lık cihazları desteklemek için aşağıdaki bölümlerde açıklanan 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'nin 8.5.1 veya sonraki bir sürümüne geçmenizi ve sıkıştırılmamış paylaşılan kitaplıklar kullanmanızı öneririz.
AGP 8.5.1 veya sonraki sürümler
16 KB cihazlarda, sıkıştırılmamış paylaşılan kitaplıklarla birlikte gönderilen uygulamaların, bunları 16 KB sıkıştırılmış hizalanmış sınıra göre hizalaması gerekir. Bunu yapmak için Android Gradle eklentisini (AGP) 8.5.1 veya sonraki bir sürüme yükseltmeniz gerekir. 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.
Groovy
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ışabilmesi için paylaşılan kitaplıkların ELF segmentlerinin 16 KB ELF hizalaması kullanılarak düzgün ş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
cihazınızda:
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'ya hizalanmış olsa bile kodunuzdaki yerler bir cihazın belirli bir sayfa boyutunu kullandığını varsayarsa uygulamanız hatalarla karşılaşabilir. Bunu önlemek için aşağıdaki adımları uygulayın:
Kod mantığınızda
PAGE_SIZE
sabit değerine referans veren veya bir cihazın sayfa boyutunun 4 KB (4096
) olduğunu varsayılan ö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
değerini bu şekilde kullanıyorsa ve bu değeri hiçbir zaman doğrudan çekirdeğe iletmiyorsa PAGE_SIZE
yerine, başka amaçlar için kullanıldığını ve gerçek bir bellek sayfasını yansıtmadığını belirtmek üzere yeni bir adla 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
Uygulamanızı 16 KB cihaz desteğiyle derledikten sonra, uygulamanızda herhangi bir gerileme olup olmadığını görmek için uygulamanızı 16 KB ortamında test etmek istersiniz. 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 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'ya hizalandığını doğrulamak için aşağıdaki
zipalign
komutunu çalıştırın. 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 15 sistem görüntüsüne sahip 16 KB tabanlı Android Emulator kurulumu
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 resimleri, 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 Preview bölümünü genişletip oluşturmak istediğiniz sanal cihazlara bağlı olarak aşağıdaki emülatör sistem imajlarından birini veya ikisini seçin:
- Google API'leri Deneysel 16 KB Sayfa Boyutu ARM 64 v8a Sistem Görüntüsü
- Google API'leri Deneysel 16 KB 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 oluşturma 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ştirme
Android 15 QPR1'den itibaren, cihazı 16 KB modunda başlatmak ve cihaz üzerinde test yapmak için belirli cihazlarda bulunan geliştirici seçeneğini kullanabilirsiniz.
Bu geliştirici seçeneği aşağıdaki cihazlarda kullanılabilir:
- Pixel 8 ve 8 Pro (Android 15 QPR1 veya sonraki sürümler)
- Pixel 8a (Android 15 QPR1 veya sonraki sürümler)