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.

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:

  1. Android Studio'yu açın, ardından Dosya > Aç'ı tıklayıp bir proje seçin.
  2. Menü çubuğunda Derleme > APK'yı analiz et...

    APK'yı başlatmak için Studio Derlemesi menü seçeneği
Analiz Aracı

  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 olduğundan emin olun. Paylaşılan nesne dosyaları varsa uygulamanız yerel veri kullanır girin. Paylaşılan nesne dosyası yoksa veya lib klasörü yoksa uygulamanız yerel kod kullanmaz.

    Paylaşılan nesne dosyalarının güncellendiğini gösteren APK Analiz Aracı görünümü
bugün

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:

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

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

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

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

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

  4. 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
    
    1. Komut dosyasını alignment.sh gibi bir dosyaya kaydedin.

    2. Uygulamanızın APK dosyasını çıkarın:

      unzip APK_NAME.apk -d /tmp/my_apk_out
      
    3. Çı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 veya UNALIGNED arm64-v8a paylaşılan kitaplık.

    4. arm64-v8a paylaşılan kitaplıklarından herhangi biri UNALIGNED 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.

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

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

  2. Android Studio'da Araçlar > SDK Yöneticisi'ne gidin.

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

    Android'de SDK Manager'ı kullanarak 16 KB emülatör sistem görüntülerini indirin
Stüdyo

  4. Uygula > Tamam'ı tıklayarak seçtiğiniz sistem görüntülerini indirin.

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

    Diğer Resimlerde 16 KB'lık emülatör resmini bulun
sekmesinden

ziyaret edin.
  1. Cihaz Yöneticisi'nde, 16 KB'lık resmin yanındaki 3 noktayı, ardından Diskte Göster.
  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. Komut çalıştırıldığında, 16384:

    adb shell getconf PAGE_SIZE