16 KB'lık sayfa boyutlarını destekler

Ö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:

  1. Android Studio'yu açın, ardından Dosya > Aç'ı tıklayın ve herhangi bir projeyi seçin.
  2. Menü çubuğundan Derle > APK'yı analiz et...'i tıklayın.

    APK Analizörü'nü başlatmak için Studio Derleme menüsü seçeneği

  3. Analiz etmek istediğiniz APK'yı seçin.

  4. Paylaşılan nesne (.so) dosyalarını (varsa) barındıran lib klasörüne bakın. Paylaşılan nesne dosyaları varsa uygulamanız yerel kodu kullanır. Ortak nesne dosyası yoksa veya lib klasörü yoksa uygulamanız doğal kod kullanmıyor demektir.

    Paylaşılan nesne dosyalarının mevcut olduğunu gösteren APK Analizcisi görünümü

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:

  1. check_elf_alignment.sh komut dosyasını bir dosyaya kaydedin.

  2. 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çin ALIGNED veya UNALIGNED çıktısını verir.

  3. arm64-v8a veya x86_64 paylaşılan kitaplıklar UNALIGNED 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:

  1. 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.
  2. 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
    
  3. APK dosyanızı çıkardığınız geçici dizinde, paylaşılan nesne (.so) dosyalarının lib 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ı ve NDK_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
    
  4. 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 segmentleri 2**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.

  5. 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:

  1. 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() veya sysconf(_SC_PAGESIZE) kullanın.

  2. 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:

  1. Android 15 SDK'sını ayarlayın.

  2. Aşağıdaki test ortamlarından birini kurun:

  3. 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.

  4. 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
    
  5. 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:

  1. 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.

  2. Android Studio'da Araçlar > SDK Yöneticisi'ni tıklayın.

  3. 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ü

    Android Studio'daki SDK Yöneticisi'ni kullanarak 16 KB emülatör sistem resimlerini indirme

  4. Seçtiğiniz sistem resimlerini indirmek için Uygula > Tamam'ı tıklayın.

  5. 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.

    Diğer Resimler sekmesinde 16 KB'lık emülatör resmini bulun.

  1. Cihaz Yöneticisi'nde, 16 KB'lık resmin yanındaki 3 noktayı, ardından Diskte Göster'i tıklayın.
  2. Bu klasörde config.ini dosyasını bulun.
  3. Aşağıdaki satırı config.ini dosyasına ekleyin ve değişikliklerinizi kaydedin:

    kernel.parameters = androidboot.page_shift=14
    
  4. 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

16 KB sayfa boyutuyla başlat geliştiricisini aç/kapat seçeneğini kullanabilirsiniz.

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)