پشتیبانی از اندازه صفحه 16 کیلوبایت

Historically, Android has only supported 4 KB memory page sizes, which has optimized system memory performance for the average amount of total memory that Android devices have typically had. Beginning with Android 15, AOSP supports devices that are configured to use a page size of 16 KB (16 KB devices). If your app uses any NDK libraries, either directly or indirectly through an SDK, then you will need to rebuild your app for it to work on these 16 KB devices.

As device manufacturers continue to build devices with larger amounts of physical memory (RAM), many of these devices will adopt 16 KB (and eventually greater) page sizes to optimize the device's performance. Adding support for 16 KB page size devices enables your app to run on these devices and helps your app benefit from the associated performance improvements. Without recompiling, apps might not work on 16 KB devices when they are productionized in future Android releases.

To help you add support for your app, we've provided guidance on how to check if your app is impacted, how to rebuild your app (if applicable), and how to test your app in a 16 KB environment using emulators (including Android 15 system images for the Android Emulator).

مزایا و دستاوردهای عملکرد

Devices configured with 16 KB page sizes use slightly more memory on average, but also gain various performance improvements for both the system and apps:

  • Lower app launch times while the system is under memory pressure: 3.16% lower on average, with more significant improvements (up to 30%) for some apps that we tested
  • Reduced power draw during app launch: 4.56% reduction on average
  • Faster camera launch: 4.48% faster hot starts on average, and 6.60% faster cold starts on average
  • Improved system boot time: improved by 8% (approximately 950 milliseconds) on average

These improvements are based on our initial testing, and results on actual devices will likely differ. We'll provide additional analysis of potential gains for apps as we continue our testing.

بررسی کنید که آیا برنامه شما تحت تأثیر قرار گرفته است

If your app uses any native code, then you should rebuild your app with support for 16 KB devices. If you are unsure if your app uses native code, you can use the APK Analyzer to identify whether any native code is present and then check the alignment of ELF segments for any shared libraries that you find.

If your app only uses code written in the Java programming language or in Kotlin, including all libraries or SDKs, then your app already supports 16 KB devices. Nevertheless, we recommend that you test your app in a 16 KB environment to verify that there are no unexpected regressions in app behavior.

آیا برنامه شما از کد بومی استفاده می کند؟

اگر یکی از موارد زیر اعمال شود، برنامه شما از کد بومی استفاده می کند:

  • برنامه شما از هر کد C/C++ (بومی) استفاده می کند. اگر برنامه شما از Android NDK استفاده می کند، برنامه شما از کد بومی استفاده می کند.
  • برنامه شما با هر کتابخانه بومی شخص ثالث یا وابستگی (مانند SDK) که از آنها استفاده می کند پیوند دارد.
  • برنامه شما توسط یک برنامه ساز شخص ثالث ساخته شده است که از کتابخانه های بومی در دستگاه استفاده می کند.

کتابخانه های بومی را با استفاده از APK Analyzer شناسایی کنید

APK Analyzer ابزاری است که به شما امکان می دهد جنبه های مختلف یک APK ساخته شده را ارزیابی کنید. برای بررسی اینکه آیا برنامه شما از کد بومی استفاده می کند (صرف نظر از اینکه با ۱۶ کیلوبایت سازگار است یا خیر):

  1. Android Studio را باز کنید، سپس روی File > Open کلیک کنید و هر پروژه را انتخاب کنید.
  2. از نوار منو، روی Build > Analyze APK کلیک کنید...

    گزینه منوی Studio Build برای راه اندازی APK آنالایزر

  3. APK مورد نظر برای تجزیه و تحلیل را انتخاب کنید.

  4. به داخل پوشه lib نگاه کنید، که در صورت وجود فایل‌های شی اشتراک‌گذاری شده ( .so ) را میزبانی می‌کند. اگر هر فایل شی مشترکی وجود دارد، برنامه شما از کد بومی استفاده می کند. اگر هیچ فایل شی مشترکی وجود ندارد یا پوشه lib وجود ندارد، برنامه شما از کد بومی استفاده نمی کند.

    نمای APK Analyzer که نشان می دهد فایل های اشیاء مشترک هستند حاضر

تراز بخش های ELF را برای کتابخانه های مشترک بررسی کنید

برای هر کتابخانه مشترک، بررسی کنید که بخش‌های ELF کتابخانه‌های مشترک با استفاده از تراز ELF 16 کیلوبایتی به درستی تراز شده باشند. اگر در حال توسعه بر روی لینوکس یا macOS هستید، می توانید از اسکریپت check_elf_alignment.sh همانطور که در بخش زیر توضیح داده شده است استفاده کنید. همچنین می توانید مستقیماً از ابزارهای خط فرمان استفاده کنید .

از اسکریپت check_elf_alignment.sh (لینوکس یا macOS) استفاده کنید

این مراحل را برای بررسی تراز بخش‌های ELF با استفاده از اسکریپت check_elf_alignment.sh دنبال کنید:

  1. اسکریپت check_elf_alignment.sh را در یک فایل ذخیره کنید.

  2. اسکریپت را روی فایل APK برنامه خود اجرا کنید:

    check_elf_alignment.sh APK_NAME.apk
    

    خروجی اسکریپت ALIGNED یا UNALIGNED برای همه کتابخانه های مشترک arm64-v8a است.

  3. اگر هر کدام از کتابخانه‌های مشترک arm64-v8a یا x86_64 UNALIGNED هستند، باید بسته‌بندی آن کتابخانه‌ها را به‌روزرسانی کنید ، سپس برنامه خود را مجدداً کامپایل کرده و با دنبال کردن مراحل این بخش مجدداً آزمایش کنید.

از ابزارهای خط فرمان به طور مستقیم استفاده کنید

این مراحل را برای بررسی تراز بخش های ELF با استفاده از ابزارهای خط فرمان به طور مستقیم دنبال کنید:

  1. مطمئن شوید که Android SDK Build-Tools نسخه 35.0.0 یا بالاتر و Android NDK با استفاده از مدیریت SDK در Android Studio یا ابزار خط فرمان sdkmanager نصب شده باشند.
  2. فایل APK برنامه خود را استخراج کنید:

    لینوکس یا macOS

    unzip APK_NAME.apk -d /tmp/my_apk_out
    

    ویندوز (PowerShell)

    Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
    
  3. در دایرکتوری موقتی که فایل APK خود را در آن استخراج کردید، محتویات دایرکتوری lib را برای فایل‌های شی مشترک ( .so ) بررسی کنید. اینها همان فایل‌های اشیاء مشترکی هستند که هنگام شناسایی کتابخانه‌های بومی با استفاده از APK Analyzer مشاهده می‌کردید. دستور زیر را روی هر فایل شی مشترک اجرا کنید:

    لینوکس یا 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
    

    ویندوز (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"
    

    در جایی که SDK_ROOT_LOCATION مسیر دایرکتوری است که Android SDK را در آن نصب کرده‌اید، SHARED_OBJECT_FILE نام فایل شی مشترکی است که در حال بررسی آن هستید و NDK_VERSION نسخه NDK Android است که نصب کرده‌اید (به عنوان مثال، 28.0.12433566 ). خروجی برای هر فایلی که بررسی می کنید چیزی شبیه به زیر خواهد بود:

    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. خطوط خروجی را بررسی کنید تا مطمئن شوید که قطعات بار مقادیر کمتر از 2**14 ندارند. اگر هر بخش بارگذاری دارای مقادیر 2**13 ، 2**12 یا کمتر باشد، باید بسته بندی آن کتابخانه ها را به روز کنید ، سپس برنامه خود را مجدداً کامپایل کرده و با دنبال کردن مراحل این بخش مجدداً آزمایش کنید.

  5. سپس، ابزار خط فرمان zipalign را در فایل APK برنامه خود اجرا کنید:

    لینوکس یا macOS

    SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
    

    ویندوز (PowerShell)

    SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
    

    جایی که SDK_ROOT_LOCATION مسیر دایرکتوری است که Android SDK را در آن نصب کرده‌اید و APK_NAME نام فایل APK برنامه شما است. اگر تمام کتابخانه های مشترک به درستی تراز شوند، آخرین خط خروجی می گوید "تأیید موفقیت آمیز".

    اگر راستی‌آزمایی انجام نشد، برخی از کتابخانه‌های مشترک نیاز به تراز مجدد دارند، بنابراین باید بسته‌بندی آن کتابخانه‌ها را به‌روزرسانی کنید ، سپس برنامه خود را مجدداً کامپایل کرده و با دنبال کردن مراحل این بخش، دوباره آزمایش کنید.

برنامه خود را با پشتیبانی از دستگاه های 16 کیلوبایتی بسازید

اگر برنامه شما از کد بومی استفاده می‌کند، مراحلی را که در بخش‌های زیر توضیح داده شده است انجام دهید تا مطمئن شوید که برنامه شما از دستگاه‌های ۱۶ کیلوبایتی پشتیبانی می‌کند:

  1. بسته بندی کتابخانه های مشترک خود را به روز کنید
  2. برنامه خود را با استفاده از تراز ELF 16 کیلوبایتی کامپایل کنید
  3. رفع کد و رفع مشکلات زمان اجرا
  4. SDK ها را برای پشتیبانی 16 کیلوبایت بررسی کنید

بسته بندی کتابخانه های مشترک خود را به روز کنید

توصیه می کنیم AGP نسخه 8.5.1 یا بالاتر را ارتقا دهید و از کتابخانه های مشترک غیرفشرده استفاده کنید.

AGP نسخه 8.5.1 یا بالاتر

دستگاه‌های 16 کیلوبایتی به برنامه‌هایی نیاز دارند که با کتابخانه‌های اشتراک‌گذاری‌شده فشرده‌نشده ارسال شوند تا آن‌ها را روی یک مرز زیپ تراز شده 16 کیلوبایتی تراز کنند. برای انجام این کار، باید به Android Gradle Plugin (AGP) نسخه 8.5.1 یا بالاتر ارتقا دهید. برای جزئیات بیشتر در مورد فرآیند ارتقا، به بخش ارتقاء پلاگین Android Gradle مراجعه کنید.

AGP نسخه 8.5 یا پایین تر

اگر نمی توانید AGP را به نسخه 8.5.1 یا بالاتر ارتقا دهید، گزینه جایگزین استفاده از کتابخانه های اشتراکی فشرده شده است. پیکربندی Gradle خود را به‌روزرسانی کنید تا Gradle کتابخانه‌های مشترک شما را هنگام بسته‌بندی برنامه‌تان فشرده کند تا از مشکلات نصب برنامه با کتابخانه‌های به اشتراک‌گذاشته‌نشده اجتناب شود.

شیار

در فایل build.gradle خود گزینه زیر را اضافه کنید:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

کاتلین

در فایل build.gradle.kts خود گزینه زیر را اضافه کنید:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

برنامه خود را با استفاده از تراز ELF 16 کیلوبایتی کامپایل کنید

دستگاه‌های 16 کیلوبایتی نیاز دارند که بخش‌های ELF کتابخانه‌های مشترک با استفاده از ترازبندی ELF 16 کیلوبایتی به درستی تراز شوند تا برنامه شما اجرا شود.

برای کامپایل برنامه خود با استفاده از تراز 16 کیلوبایتی ELF، بسته به نسخه Android NDK که استفاده می‌کنید، مراحل یکی از بخش‌های زیر را تکمیل کنید.

اندروید NDK r28 و بالاتر

NDK نسخه r28 و بالاتر 16 کیلوبایت را به صورت پیش فرض کامپایل می کند.

اندروید NDK r27

برای پشتیبانی از کامپایل کتابخانه های اشتراکی تراز شده با ۱۶ کیلوبایت با Android NDK نسخه r27 و بالاتر، باید پرچم های ndk-build ، build.gradle ، build.gradle.kts یا پیوند دهنده خود را به صورت زیر به روز کنید:

ndk-build

در Application.mk شما:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

شیار

در فایل build.gradle خود، آرگومان -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"
      }
    }
  }
}

کاتلین

در فایل build.gradle.kts ، آرگومان -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")
      }
    }
  }
}

سیستم های ساخت دیگر

پرچم های پیوند دهنده زیر را مشخص کنید:

-Wl,-z,max-page-size=16384

اندروید NDK r26 و پایین تر

برای پشتیبانی از کامپایل کتابخانه های اشتراکی تراز شده با ۱۶ کیلوبایت با Android NDK نسخه r26 یا پایین تر، باید پیکربندی ndk-build یا cmake خود را به صورت زیر به روز کنید:

ndk-build

Android.mk خود را برای فعال کردن تراز ELF 16 کیلوبایتی به روز کنید:

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

CMake

CMakeLists.txt خود را برای فعال کردن تراز ELF 16 کیلوبایتی به روز کنید:

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")

رفع کد و رفع مشکلات زمان اجرا

حتی اگر برنامه شما 16 کیلوبایت تراز باشد، اگر مکان‌هایی در کد شما فرض کنند که دستگاه از اندازه صفحه خاصی استفاده می‌کند، برنامه شما می‌تواند با خطا مواجه شود. برای جلوگیری از این، مراحل زیر را انجام دهید:

  1. هر گونه وابستگی کدگذاری سختی که به ثابت PAGE_SIZE اشاره می کند یا نمونه هایی در منطق کد شما که اندازه صفحه دستگاه را 4 کیلوبایت فرض می کند ( 4096 ) را حذف کنید.

    به جای آن getpagesize() یا sysconf(_SC_PAGESIZE) استفاده کنید.

  2. به دنبال موارد استفاده از mmap() و سایر API هایی باشید که به آرگومان های صفحه تراز شده نیاز دارند و در صورت لزوم با جایگزین ها جایگزین کنید.

در برخی موارد، اگر برنامه شما از PAGE_SIZE به‌عنوان یک مقدار مناسب استفاده می‌کند که به اندازه صفحه اصلی مرتبط نیست، این امر باعث نمی‌شود که برنامه شما هنگام استفاده در حالت 16 کیلوبایتی خراب شود. با این حال، اگر این مقدار با mmap بدون MAP_FIXED به هسته ارسال شود، هسته همچنان از یک صفحه کامل استفاده می‌کند که مقداری از حافظه را هدر می‌دهد. به این دلایل، وقتی حالت 16 کیلوبایتی در NDK r27 و بالاتر فعال باشد، PAGE_SIZE تعریف نشده است.

اگر برنامه شما از PAGE_SIZE به این روش استفاده می‌کند و هرگز مستقیماً این مقدار را به هسته منتقل نمی‌کند، به جای استفاده از PAGE_SIZE ، یک متغیر جدید با نام جدید ایجاد کنید تا نشان دهد که برای مقاصد دیگر استفاده می‌شود و صفحه حافظه واقعی را منعکس نمی‌کند.

SDK ها را برای پشتیبانی 16 کیلوبایت بررسی کنید

بسیاری از SDK ها با اندازه صفحه 16 کیلوبایت سازگار هستند، به خصوص اگر خودتان آنها را بسازید یا از پیش ساخته های اخیر دریافت کنید. با این حال، از آنجایی که برخی از پیش ساخته‌های SDK یا نسخه‌های SDK با ۱۶ کیلوبایت سازگار نیستند، باید وب‌سایت هر ارائه‌دهنده SDK را بررسی کنید تا مشخص کنید از کدام نسخه با ۱۶ کیلوبایت استفاده کنید.

برنامه خود را در یک محیط 16 کیلوبایتی تست کنید

بعد از اینکه برنامه خود را با پشتیبانی از دستگاه های 16 کیلوبایتی ساختید، می خواهید برنامه خود را در یک محیط 16 کیلوبایتی آزمایش کنید تا ببینید آیا برنامه شما دچار رگرسیون می شود یا خیر. برای این کار مراحل زیر را دنبال کنید:

  1. Android 15 SDK را تنظیم کنید .

  2. یکی از محیط های تست زیر را تنظیم کنید:

  3. دستگاه تست خود را راه اندازی کنید، سپس دستور زیر را اجرا کنید تا مطمئن شوید که از یک محیط 16 کیلوبایتی استفاده می کند:

    adb shell getconf PAGE_SIZE
    

    دستور باید مقدار 16384 را برگرداند.

  4. دستور zipalign زیر را اجرا کنید تا مطمئن شوید برنامه شما 16 کیلوبایت تراز شده است، جایی که APK_NAME نام فایل APK برنامه شما است:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  5. برنامه خود را به طور کامل آزمایش کنید و بر روی مناطقی تمرکز کنید که ممکن است با تغییر نمونه کدهایی که به اندازه های صفحه خاصی اشاره می کنند تحت تأثیر قرار گیرند.

شبیه ساز Android را با یک تصویر سیستم Android 15 مبتنی بر 16 کیلوبایت تنظیم کنید

برای راه اندازی یک محیط 16 کیلوبایتی با استفاده از شبیه ساز اندروید، مراحل زیر را دنبال کنید:

  1. تصاویر سیستم شبیه ساز اندروید 15 مبتنی بر 16 کیلوبایت با اندروید استودیو Jellyfish سازگار است | 2023.3.1 یا بالاتر. با این حال، برای بهترین تجربه هنگام کار با دستگاه های 16 کیلوبایتی، از Android Studio Ladybug | استفاده کنید 2024.2.1 یا بالاتر.

    ما همیشه روی ویژگی‌های جدید کار می‌کنیم، بنابراین نسخه‌های جدیدتر یا آخرین نسخه پیش‌نمایش Android Studio را به محض دردسترس شدن، دانلود کنید.

    به یاد داشته باشید که می‌توانید نسخه موجود Android Studio خود را نصب کنید، زیرا می‌توانید چندین نسخه را در کنار هم نصب کنید .

  2. در Android Studio، روی Tools > SDK Manager کلیک کنید.

  3. در برگه پلتفرم‌های SDK ، Show Package Details را علامت بزنید، سپس بخش Android VanillaIceCream یا بالاتر را گسترش دهید و بسته به دستگاه‌های مجازی که می‌خواهید ایجاد کنید، یکی یا هر دو تصویر سیستم شبیه‌ساز زیر را انتخاب کنید:

    • Google APIs Experimental 16 KB Size Page ARM 64 v8a System Image
    • Google APIs Experimental 16 KB Size Page Intel x86_64 Atom System Image

    دانلود تصاویر سیستم شبیه ساز 16 کیلوبایتی با استفاده از SDK Manager در اندروید     استودیو

  4. روی Apply > OK کلیک کنید تا هر کدام از تصاویر سیستمی را که انتخاب کرده اید دانلود کنید.

  5. مراحل راه اندازی یک دستگاه مجازی برای Android 15 را دنبال کنید و هنگامی که از شما خواسته شد یک تصویر سیستم را انتخاب کنید، تصویر سیستمی 16 کیلوبایتی را که دانلود کرده اید انتخاب کنید. اگر به طور خودکار توصیه نمی شود، می توانید تصویر سیستم 16 کیلوبایتی را در برگه سایر تصاویر پیدا کنید.

    تصویر شبیه ساز 16 کیلوبایتی را در سایر تصاویر پیدا کنید برگه

مراحل اضافی برای برخی از نسخه های شبیه ساز و تصاویر سیستم

برای شبیه ساز اندروید نسخه های 35.1.5 تا 35.1.20 و قبل از ویرایش 4 از تصاویر سیستم Android 15.0 16 KB با حجم صفحه ارائه شده در SDK Manager، برای شبیه سازی یک محیط 16 کیلوبایتی در سیستم های x86_64، باید مراحل زیر را نیز انجام دهید. این مراحل بعد از نسخه 35.1.21 و با ویرایش 4 از تصاویر سیستم Android 15.0 16 KB با اندازه صفحه یا نسخه های جدیدتر مورد نیاز نیست.

  1. در Device manager، روی 3 نقطه کنار تصویر 16 کیلوبایتی کلیک کنید، سپس روی Show on Disk کلیک کنید.
  2. در این پوشه فایل config.ini پیدا کنید.
  3. خط زیر را به فایل config.ini اضافه کنید و تغییرات خود را ذخیره کنید:

    kernel.parameters = androidboot.page_shift=14
    
  4. برای تأیید تغییرات خود، دستور زیر را اجرا کنید که باید 16384 برگرداند:

    adb shell getconf PAGE_SIZE
    

شبیه ساز را راه اندازی کنید

پس از اتمام راه‌اندازی شبیه‌ساز Android و دستگاه‌های مجازی، شبیه‌ساز را از منوی دستگاه مقصد یا از خط فرمان اجرا کنید.

Enable 16 KB mode on a device using developer options

Toggle the Boot with 16KB page size developer option to boot a device in 16 KB mode.

Starting with Android 15 QPR1, you can use the developer option that's available on certain devices to boot the device in 16 KB mode and perform on-device testing.

This developer option is available on the following devices:

  • Pixel 8 and 8 Pro (with Android 15 QPR1 or higher)

    Warning: Due to a known issue with Android 15 QPR2 Beta 3, the touchscreen doesn't work on Pixel 8 devices after installing Android 15 QPR2 Beta 3 and booting the device in 16 KB mode. This issue doesn't affect Pixel 8 Pro devices.

  • Pixel 8a (with Android 15 QPR1 or higher)

    Warning: Due to a known issue with Android 15 QPR2 Beta 3, the touchscreen doesn't work on Pixel 8a devices after installing Android 15 QPR2 Beta 3 and booting the device in 16 KB mode.

  • Pixel 9, 9 Pro, and 9 Pro XL (with Android 15 QPR2 Beta 2 or higher)