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

Android, geçmişte yalnızca 4 KB bellekli sayfa boyutlarını destekliyordu. Bu sayede, Android cihazların genel olarak sahip olduğu ortalama toplam bellek miktarı açısından sistem belleği performansı optimize edilmiş oluyordu. Android 15'ten itibaren Android, 16 KB'lık sayfa boyutu (16 KB'lık cihazlar) kullanacak şekilde yapılandırılmış cihazları desteklemektedir.

Cihaz üreticileri daha fazla miktarda fiziksel belleğe (RAM) sahip cihazlar geliştirmeye devam ettikçe, cihazın performansını optimize etmek için bu cihazların birçoğu muhtemelen 16 KB'lık (ve sonunda daha büyük) sayfa boyutlarıyla yapılandırılacaktır. 16 KB'lık cihazlar için destek eklenmesi, uygulamanızın bu cihazlarda çalışmasına ve ilişkili performans iyileştirmelerinden yararlanmasına yardımcı olur. Bu konuda size yardımcı olmak için uygulamanızın etkilenip etkilenmediğini kontrol etme, uygulamanızı yeniden oluşturma (geçerliyse) ve hem emülatörler hem de fiziksel cihazlar kullanarak uygulamanızı 16 KB'lık bir ortamda test etme konularında rehberlik sağladık.

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ıyorsa yerel kod kullanılır.
  • Uygulamanız, bunları kullanan üçüncü taraf yerel kitaplıklara veya bağımlılıklara bağlantı veriyor.
  • Uygulamanız, cihazda yerel kitaplıklar kullanan bir üçüncü taraf uygulama oluşturucu tarafından oluşturuldu.

APK Analiz Aracı'nı kullanarak yerel kitaplıkları tanımlama

APK Analizcisi, yerleşik 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ıp bir proje seçin.
  2. Menü çubuğundan Oluştur > APK'yı analiz et... seçeneğini tıklayın.

    APK Analiz Aracı'nı başlatmaya yarayan Studio Derleme menü seçeneği

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

  4. Varsa paylaşılan nesne (.so) dosyalarını barındıran lib klasörüne bakın. Paylaşılan nesne dosyaları varsa uygulamanız yerel kodu kullanır. Paylaşılan nesne dosyası veya lib klasörü yoksa uygulamanız yerel kod kullanmaz.

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

Uygulamanızı 16 KB'lık cihazların desteğiyle oluşturun

Yerel kod kullanan uygulamaların, 16 KB cihazları desteklemesi için aşağıdaki bölümlerde özetlenen adımları tamamlaması gerekir.

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ış paylaşılan kitaplıkları kullanmanızı öneririz.

AGP 8.3 veya daha sonraki bir sürüm

16 KB'lık cihazlarda, sıkıştırılmamış paylaşılan kitaplıklarla birlikte gönderilen uygulamaların, bunları 16 KB'lık zip hizalaması olan bir sınırda hizalaması gerekir. Bunu yapmak için Android Gradle Plugin (AGP) 8.3 veya sonraki bir sürüme geçmeniz gerekiyor. Yeni sürüme geçirme işlemiyle ilgili ayrıntılar için Android 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 yöntem, sıkıştırılmış paylaşılan kitaplıkları kullanmak olabilir. Gradle yapılandırmanızı güncelleyerek Gradle'ın, hizalanmamış paylaşılan kitaplıklarla ilgili uygulama yükleme sorunlarını önlemek için uygulamanızı paketleme sırasında paylaşılan kitaplıklarınızı sıkıştırmasını sağlayın.

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 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ını 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 r26 ve önceki sürümler

Android NDK'nın r26 veya önceki sürümleriyle 16 KB'a uyumlu paylaşılan kitaplıkların derlenmesini desteklemek için ndk-build veya cmake yapılandırmanızı şu şekilde güncellemeniz gerekir:

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'nın r27 ve sonraki sürümleriyle 16 KB uyumlu paylaşılan kitaplıkların 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-kurum

Application.mk içinde:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Eski

build.gradle dosyanızda, bağımsız değişkeni -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON olarak 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, bağımsız değişkeni -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON olarak 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

Belirli sayfa boyutlarına referans veren kod örneklerini kontrol etme

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ı tamamlayı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 sayfayla uyumlu 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ızda temel sayfa boyutuna bağlı olmayan pratik bir değer olarak PAGE_SIZE kullanılıyorsa bu durum, uygulamanızın 16 KB modunda kullanıldığında bozulmasına neden olmaz. Ancak bu değer, MAP_FIXED olmadan mmap ile çekirdeğe iletilirse çekirdek, sayfanın tamamını kullanmaya devam eder ve bu da bellek kaybına neden olur. Bu nedenle, NDK r27 ve üzeri 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.

Uygulamanızı 16 KB'lık bir ortamda test edin

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 aşağıdaki test ortamlarından birini oluşturun, ardından belirli sayfa boyutlarına referans veren kod örneklerini değiştirmekten 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 Emülatör'ü kullanarak 16 KB'lık bir ortam oluşturmak için aşağıdaki adımları izleyin:

  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 elde etmek 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.000 Sayfa Boyutu ARM 64 v8a Sistem Resmi
    • 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 görüntülerini indirin

  4. Seçtiğiniz sistem görüntülerini 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 önerilmiyorsa 16 KB sistem resmini Diğer Resimler sekmesinde bulabilirsiniz.

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