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

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

  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ı, tüm arm64-v8a paylaşılan kitaplıkları için ALIGNED veya UNALIGNED değerini döndürür.

  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

ELF segmentlerinin hizalamasını doğrudan komut satırı araçlarını kullanarak kontrol etmek için aşağıdaki 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ı ayıkladığınız geçici dizinde, paylaşılan nesne (.so) dosyaları için lib 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ı 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 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:

  1. 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() 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 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:

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

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

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

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

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

    Diğer Resimler sekmesinde 16 KB 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ştirme

Bir cihazı 16 KB modunda başlatmak için 16 KB sayfa boyutuyla başlat geliştirici seçeneğini etkinleştirin.

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)