از لحاظ تاریخی، اندروید تنها از اندازه صفحات حافظه 4 کیلوبایتی پشتیبانی میکند که عملکرد حافظه سیستم را برای میانگین کل حافظهای که دستگاههای اندرویدی معمولا دارند بهینه میکند. با شروع Android 15، AOSP از دستگاه هایی پشتیبانی می کند که برای استفاده از اندازه صفحه 16 کیلوبایت (دستگاه های 16 کیلوبایت) پیکربندی شده اند. اگر برنامه شما از کتابخانه های NDK استفاده می کند، چه به طور مستقیم یا غیرمستقیم از طریق یک SDK، باید برنامه خود را بازسازی کنید تا بتواند روی این دستگاه های 16 کیلوبایتی کار کند.
از آنجایی که سازندگان دستگاهها به ساخت دستگاههایی با حافظه فیزیکی (RAM) بیشتر ادامه میدهند، بسیاری از این دستگاهها از اندازه صفحه ۱۶ کیلوبایت (و در نهایت بیشتر) برای بهینهسازی عملکرد دستگاه استفاده میکنند. افزودن پشتیبانی برای دستگاههای اندازه صفحه 16 کیلوبایت، برنامه شما را قادر میسازد تا در این دستگاهها اجرا شود و به برنامه شما کمک میکند از بهبودهای عملکرد مرتبط بهره مند شود. بدون کامپایل مجدد، برنامهها ممکن است در دستگاههای 16 کیلوبایتی در نسخههای بعدی اندروید تولید نشوند.
برای کمک به اضافه کردن پشتیبانی از برنامه خود، راهنمایی هایی در مورد نحوه بررسی اینکه آیا برنامه شما تحت تأثیر قرار گرفته است ، نحوه بازسازی برنامه خود (در صورت وجود) و نحوه آزمایش برنامه خود در یک محیط 16 کیلوبایتی با استفاده از شبیه سازها (از جمله Android) ارائه کرده ایم. 15 تصویر سیستم برای شبیه ساز اندروید).
مزایا و دستاوردهای عملکرد
دستگاه هایی که با اندازه صفحه 16 کیلوبایت پیکربندی شده اند به طور متوسط کمی از حافظه بیشتری استفاده می کنند، اما بهبودهای عملکردی مختلفی را برای سیستم و برنامه ها نیز به دست می آورند:
- زمانهای راهاندازی برنامه کمتر زمانی که سیستم تحت فشار حافظه است: به طور متوسط 3.16٪ کمتر، با بهبودهای قابل توجه (تا 30٪) برای برخی از برنامههایی که آزمایش کردیم.
- کاهش مصرف انرژی در حین راه اندازی برنامه: به طور متوسط 4.56٪ کاهش
- راهاندازی سریعتر دوربین: به طور متوسط 4.48٪ سریعتر استارتهای گرم و 6.60٪ سریعتر شروع سرد.
- بهبود زمان بوت سیستم: به طور متوسط 8٪ (تقریباً 950 میلی ثانیه) بهبود یافته است.
این پیشرفتها بر اساس آزمایش اولیه ما هستند و نتایج روی دستگاههای واقعی احتمالاً متفاوت خواهد بود. در ادامه آزمایش خود، تجزیه و تحلیل بیشتری از دستاوردهای بالقوه برای برنامه ها ارائه خواهیم کرد.
بررسی کنید که آیا برنامه شما تحت تأثیر قرار گرفته است
اگر برنامه شما از هر کد بومی استفاده می کند ، باید برنامه خود را با پشتیبانی از دستگاه های 16 کیلوبایتی بازسازی کنید . اگر مطمئن نیستید که برنامه شما از کد بومی استفاده میکند، میتوانید از APK Analyzer برای شناسایی وجود کد بومی استفاده کنید و سپس تراز بخشهای ELF را برای کتابخانههای مشترکی که پیدا کردید بررسی کنید .
اگر برنامه شما فقط از کدهای نوشته شده به زبان برنامه نویسی جاوا یا کاتلین استفاده می کند که شامل همه کتابخانه ها یا SDK می شود، برنامه شما از قبل از دستگاه های 16 کیلوبایتی پشتیبانی می کند. با این وجود، توصیه می کنیم برنامه خود را در یک محیط 16 کیلوبایتی آزمایش کنید تا مطمئن شوید که هیچ رگرسیون غیرمنتظره ای در رفتار برنامه وجود ندارد.
آیا برنامه شما از کد بومی استفاده می کند؟
اگر یکی از موارد زیر اعمال شود، برنامه شما از کد بومی استفاده می کند:
- برنامه شما از هر کد C/C++ (بومی) استفاده می کند. اگر برنامه شما از Android NDK استفاده می کند، برنامه شما از کد بومی استفاده می کند.
- برنامه شما با هر کتابخانه بومی شخص ثالث یا وابستگی (مانند SDK) که از آنها استفاده می کند پیوند دارد.
- برنامه شما توسط یک برنامه ساز شخص ثالث ساخته شده است که از کتابخانه های بومی در دستگاه استفاده می کند.
کتابخانه های بومی را با استفاده از APK Analyzer شناسایی کنید
APK Analyzer ابزاری است که به شما امکان می دهد جنبه های مختلف یک APK ساخته شده را ارزیابی کنید. برای تشخیص اینکه آیا برنامه شما از کد بومی یا کتابخانهها استفاده میکند، این مراحل را دنبال کنید:
- Android Studio را باز کنید، سپس روی File > Open کلیک کنید و هر پروژه را انتخاب کنید.
از نوار منو، روی Build > Analyze APK کلیک کنید...
APK مورد نظر برای تجزیه و تحلیل را انتخاب کنید.
به داخل پوشه
lib
نگاه کنید، که در صورت وجود فایلهای شی اشتراکگذاری شده (.so
) را میزبانی میکند. اگر هر فایل شی مشترکی وجود دارد، برنامه شما از کد بومی استفاده می کند. اگر هیچ فایل شی مشترکی وجود ندارد یا پوشهlib
وجود ندارد، برنامه شما از کد بومی استفاده نمی کند.
تراز بخش های ELF را برای کتابخانه های مشترک بررسی کنید
برای هر کتابخانه مشترک، بررسی کنید که بخشهای ELF کتابخانههای مشترک با استفاده از تراز ELF 16 کیلوبایتی به درستی تراز شده باشند. اگر در حال توسعه بر روی لینوکس یا macOS هستید، می توانید از اسکریپت check_elf_alignment.sh
همانطور که در بخش زیر توضیح داده شده است استفاده کنید. همچنین می توانید مستقیماً از ابزارهای خط فرمان استفاده کنید .
از اسکریپت check_elf_alignment.sh (لینوکس یا macOS) استفاده کنید
این مراحل را برای بررسی تراز بخشهای ELF با استفاده از اسکریپت check_elf_alignment.sh
دنبال کنید:
اسکریپت
check_elf_alignment.sh
را در یک فایل ذخیره کنید.اسکریپت را روی فایل APK برنامه خود اجرا کنید:
check_elf_alignment.sh APK_NAME.apk
خروجی اسکریپت
ALIGNED
یاUNALIGNED
برای همه کتابخانه های مشترکarm64-v8a
است.اگر هر کدام از کتابخانههای مشترک
arm64-v8a
یاx86_64
UNALIGNED
هستند، باید بستهبندی آن کتابخانهها را بهروزرسانی کنید ، سپس برنامه خود را مجدداً کامپایل کرده و با دنبال کردن مراحل این بخش مجدداً آزمایش کنید.
از ابزارهای خط فرمان به طور مستقیم استفاده کنید
این مراحل را برای بررسی تراز بخش های ELF با استفاده از ابزارهای خط فرمان به طور مستقیم دنبال کنید:
- مطمئن شوید که Android SDK Build-Tools نسخه 35.0.0 یا بالاتر و Android NDK با استفاده از مدیریت SDK در Android Studio یا ابزار خط فرمان
sdkmanager
نصب شده باشند. فایل APK برنامه خود را استخراج کنید:
لینوکس یا macOS
unzip APK_NAME.apk -d /tmp/my_apk_out
ویندوز (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
در دایرکتوری موقتی که فایل 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
.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
خطوط خروجی را بررسی کنید تا مطمئن شوید که قطعات بار مقادیر کمتر از
2**14
ندارند. اگر هر بخش بارگذاری دارای مقادیر2**13
،2**12
یا کمتر باشد، باید بسته بندی آن کتابخانه ها را به روز کنید ، سپس برنامه خود را مجدداً کامپایل کرده و با دنبال کردن مراحل این بخش مجدداً آزمایش کنید.سپس، ابزار خط فرمان
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 کیلوبایتی بسازید
برای پشتیبانی از دستگاههای 16 کیلوبایتی، برنامههایی که از کد بومی استفاده میکنند باید مراحلی را که در بخشهای زیر توضیح داده شده است انجام دهند. اگر به نسخه AGP 8.5.1 یا بالاتر و NDK نسخه r28 یا بالاتر به روز می کنید و از وابستگی های از پیش ساخته شده سازگار با 16 کیلوبایت استفاده می کنید، برنامه ها به طور پیش فرض با 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 کیلوبایت تراز باشد، اگر مکانهایی در کد شما فرض کنند که دستگاه از اندازه صفحه خاصی استفاده میکند، برنامه شما میتواند با خطا مواجه شود. برای جلوگیری از این، مراحل زیر را انجام دهید:
هر گونه وابستگی کدگذاری سختی که به ثابت
PAGE_SIZE
اشاره می کند یا نمونه هایی در منطق کد شما که اندازه صفحه دستگاه را 4 کیلوبایت فرض می کند (4096
) را حذف کنید.به جای آن از
getpagesize()
یاsysconf(_SC_PAGESIZE)
استفاده کنید.به دنبال موارد استفاده از
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 کیلوبایتی آزمایش کنید تا ببینید آیا برنامه شما دچار رگرسیون می شود یا خیر. برای این کار مراحل زیر را دنبال کنید:
یکی از محیط های تست زیر را تنظیم کنید:
دستگاه تست خود را راه اندازی کنید، سپس دستور زیر را اجرا کنید تا مطمئن شوید که از یک محیط 16 کیلوبایتی استفاده می کند:
adb shell getconf PAGE_SIZE
دستور باید مقدار
16384
را برگرداند.دستور
zipalign
زیر را اجرا کنید تا مطمئن شوید برنامه شما 16 کیلوبایت تراز شده است، جایی که APK_NAME نام فایل APK برنامه شما است:zipalign -c -P 16 -v 4 APK_NAME.apk
برنامه خود را به طور کامل آزمایش کنید و بر روی مناطقی تمرکز کنید که ممکن است با تغییر نمونه کدهایی که به اندازه های صفحه خاصی اشاره می کنند تحت تأثیر قرار گیرند.
شبیه ساز Android را با یک تصویر سیستم Android 15 مبتنی بر 16 کیلوبایت تنظیم کنید
برای راه اندازی یک محیط 16 کیلوبایتی با استفاده از شبیه ساز اندروید، مراحل زیر را دنبال کنید:
تصاویر سیستم شبیه ساز اندروید 15 مبتنی بر 16 کیلوبایت با اندروید استودیو Jellyfish سازگار است | 2023.3.1 یا بالاتر. با این حال، برای بهترین تجربه هنگام کار با اندروید 15 بتا، آخرین نسخه پیش نمایش اندروید استودیو را دانلود کنید.
به یاد داشته باشید که میتوانید نسخه موجود Android Studio خود را نصب کنید، زیرا میتوانید چندین نسخه را در کنار هم نصب کنید .
در Android Studio، روی Tools > SDK Manager کلیک کنید.
در برگه پلتفرمهای SDK ، Show Package Details را علامت بزنید، سپس بخش Android VanillaIceCream Preview را باز کنید و بسته به دستگاههای مجازی که میخواهید ایجاد کنید، یکی یا هر دو تصویر سیستم شبیهساز زیر را انتخاب کنید:
- Google APIs Experimental 16k Size Page Size ARM 64 v8a System Image
- Google APIs Experimental 16k Page Size Intel x86_64 Atom System Image
روی Apply > OK کلیک کنید تا هر کدام از تصاویر سیستمی را که انتخاب کرده اید دانلود کنید.
مراحل راه اندازی یک دستگاه مجازی برای Android 15 را دنبال کنید و هنگامی که از شما خواسته شد یک تصویر سیستم را انتخاب کنید، تصویر سیستمی 16 کیلوبایتی را که دانلود کرده اید انتخاب کنید. اگر به طور خودکار توصیه نمی شود، می توانید تصویر سیستم 16 کیلوبایتی را در برگه سایر تصاویر پیدا کنید.
- در Device manager، روی 3 نقطه کنار تصویر 16 کیلوبایتی کلیک کنید، سپس روی Show on Disk کلیک کنید.
- در این پوشه فایل
config.ini
را پیدا کنید. خط زیر را به فایل
config.ini
اضافه کنید و تغییرات خود را ذخیره کنید:kernel.parameters = androidboot.page_shift=14
برای تأیید تغییرات خود، دستور زیر را اجرا کنید که باید
16384
برگرداند:adb shell getconf PAGE_SIZE
با استفاده از گزینه های توسعه دهنده، حالت 16 کیلوبایتی را در دستگاهی فعال کنید
با شروع اندروید 15 QPR1، میتوانید از گزینه توسعهدهنده موجود در دستگاههای خاص برای راهاندازی دستگاه در حالت 16 کیلوبایتی و انجام تست روی دستگاه استفاده کنید .
این گزینه توسعه دهنده در دستگاه های زیر موجود است:
- Pixel 8 و 8 Pro (با Android 15 QPR1 Beta 1 یا بالاتر)
- Pixel 8a (با Android 15 QPR1 Beta 2 یا بالاتر)