Android 11 یا بالاتر از تولید نمایههای تصویر راهاندازی پشتیبانی میکند که اطلاعات مربوط به کد اجزای مختلف سطح سیستم مثل سرور سیستم و مسیر کلاس راهاندازی را دربرمیگیرد. Android Runtime (ART) از این اطلاعات برای انجام بهینهسازیهای سراسری سیستم استفاده میکند که برخیاز آنها برای عملکرد Android حیاتی هستند و بر اجرای همه کدهای غیربومی (سطح سیستم یا برنامه) تأثیر میگذارند. در برخی موارد، نمایههای تصویر راهاندازی میتوانند بر عملکرد اجرا و مصرف حافظه تا دو رقم درصد تأثیر بگذارند.
دریافت اطلاعات نمایه راهاندازی
نمایههای تصویر راهاندازی از نمایههای برنامههای اجراشده درطول
مسیرهای قطعی کاربر (CUJ) مشتق میشوند. در پیکربندی دستگاه خاصی، ART روشها و کلاسهای مسیر کلاس راهاندازی استفادهشده توسط برنامهها (بهعنوان بخشی از نمایههای JIT) را ضبط میکند، سپس آن اطلاعات را در نمایه برنامه (برای مثال، /data/misc/profiles/cur/0/com.android.chrome/primary.prof) ثبت میکند، جایی که توسط فایل اجرایی Dalvik (DEX) مسیر کلاس راهاندازی فهرستبندی میشود (به قالب نمایه ART مراجعه کنید).
نمایههای برنامه ضبطشده درطول CUJ را مرور کنید تا مشخص شود کدام بخش از مسیر کلاس راهاندازی بیشتر استفاده میشود و برای بهینهسازی مهمتر است (برای مثال، قالب نمایههای ART را ببینید). گنجاندن همه روشها یا کلاسها تأثیر منفی بر عملکرد دارد، بنابراین روی مسیرهای کد پراستفاده تمرکز کنید. برای مثال، اگر یک روش از مسیر کلاس بوت توسط یک برنامه استفاده شود، نباید بخشی از نمایههای بوت باشد. هر دستگاه باید انتخاب روش/کلاس را براساس انتخاب CUJ و مقدار دادههای تولیدشده توسط آزمایش پیکربندی کند.
برای جمعآوری اطلاعات مسیر کلاس راهاندازی از همه نمایههای برنامه در دستگاه، فرمان adb shell cmd package snapshot-profile android را اجرا کنید. میتوانید از اطلاعات تجمیعشده بهعنوان مبنایی برای پردازش و انتخاب روش/کلاس استفاده کنید بدون اینکه بهصورت دستی نمایههای فردی را تجمیع کنید (اگرچه درصورت تمایل میتوانید این کار را انجام دهید).
شکل ۱. فرایند دریافت نمایههای تصویر راهاندازی
دادههای نمایه تصویر راهاندازی
نمایههای تصویر راهاندازی شامل فایلها و دادههای زیر است.
نمایه مسیر کلاس راهاندازی (
frameworks/base/config/boot-image-profile.txt. تعیین میکند کدام روشها از مسیر کلاس راهاندازی بهینهسازی شوند و کدام کلاس در تصویر.artراهاندازی گنجانده شود.فهرست کلاسهای پیشبارشده. تعیین میکند کدام کلاسها در Zygote ازپیش بارگذاری شوند.
نمایه برای مؤلفههای سرور سیستم (
frameworks/base/services/art-profile). تعیین میکند کدام روشها از سرور سیستم بهینهسازی/کامپایل میشوند، کدام کلاس در تصویر راهاندازی.artگنجانده میشود، و فایلهای DEX مربوطه چگونه چیده میشوند.
قالب نمایه ART
نمایه ART اطلاعات را از هریک از فایلهای DEX بارگیریشده، ازجمله اطلاعات مربوط به روشهای ارزشمند برای بهینهسازی و کلاسهای استفادهشده درطول راهاندازی، ضبط میکند. وقتی نمایهسازی تصویر راهاندازی فعال باشد، ART همچنین مسیر کلاس راهاندازی و فایلهای JAR سرور سیستم را در نمایه لحاظ میکند و هر فایل DEX را با نام بستهای که از آن استفاده میکند حاشیهنویسی میکند.
برای مثال، نمایه تصویر راهاندازی خام را با فرمان زیر تخلیه کنید:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.profاین کار بروندادی مشابه با موارد زیر تولید میکند:
=== Dex files ===
=== profile ===
ProfileInfo [012]
core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
hot methods: 520[], 611[] …
startup methods: …
classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
hot methods: 520[], 521[]…
startup methods: …
classes: …
در مثال بالا:
core-oj.jarتوسطcom.google.android.ext.servicesوcom.android.systemuiاستفاده میشود. هر ورودی دو بسته استفادهشده ازcore-oj.jarرا فهرست میکند.هر دو فرایند از روشی با نمایه DEX ۵۲۰ استفاده میکنند، اما فقط فرایند
systemuiاز روشی با نمایه DEX ۵۲۱ استفاده میکند. همین منطق برای سایر بخشهای نمایه (برای مثال، کلاسهای راهاندازی) نیز اعمال میشود.
درطول پردازش دادهها، روشها/کلاسها را براساس استفاده فیلتر میکنیم و به فرایندهای سطح سیستم (برای مثال، سرور سیستم یا systemui) یا روشهایی که ممکن است معمولاً استفاده نشوند اما همچنان مهم هستند (برای مثال، روشهای استفادهشده توسط برنامه دوربین) اولویت میدهیم.
قالب نمایه بهطور داخلی هر روش را با چند پرچم (راهاندازی، پساز راهاندازی، داغی، abi) حاشیهنویسی میکند که بیشتر از چیزی است که در قالب فقط تخلیه نمایش داده میشود. برای استفاده از همه سیگنالها، دستورگانهای دردسترس را اصلاح کنید.
توصیهها
برای کسب بهترین نتایج، از دستورالعملهای زیر استفاده کنید.
پیکربندی تولید نمایههای تصویر راهاندازی را در چند دستگاه آزمایشی مستقر کنید و نتایج را قبلاز تولید نمایه تصویر راهاندازی نهایی جمعآوری کنید. ابزار
profmanاز تجمیع و انتخاب چندین نمایه تصویر راهاندازی پشتیبانی میکند، اما فقط با همان نسخه تصویر راهاندازی (همان مسیر کلاس راهاندازی) کار میکند.به روشها/کلاسهایی که توسط فرایندهای سیستم استفاده میشوند اولویت انتخاب بدهید. این روشها/کلاسها ممکن است از کدی استفاده کنند که اغلب توسط برنامههای دیگر استفاده نمیشود اما همچنان برای بهینهسازی حیاتی است.
شکل دادههای اجرای یک دستگاه با دستگاههای آزمایشی که CUJهای دنیای واقعی را اجرا میکنند بسیار متفاوت است. اگر ناوگان بزرگی از دستگاههای آزمایشی ندارید، از همان دستگاه برای اجرای چندین «سفر مشتری حیاتی» استفاده کنید تا اطمینان بیشتری پیدا کنید که بهینهسازیهای نمایه تصویر راهاندازی در محیط تولید بهخوبی کار خواهد کرد (این سناریو در زیر توضیح داده شده است).
پیکربندی دستگاهها
برای فعال کردن پیکربندی نمایه راهاندازی ازطریق خصوصیات سیستم، از یکی از روشهای زیر استفاده کنید.
گزینه ۱: راهاندازی دستی لوازم (تا زمان بازراهاندازی کار میکند):
adb rootadb shell stopadb shell setprop dalvik.vm.profilebootclasspath trueadb shell setprop dalvik.vm.profilesystemserver trueadb shell startگزینه ۲: از
local.propاستفاده کنید (جلوه دائمی تا زمانی که فایل حذف شود). برای انجام این کار:فایل
local.propبا این محتوا ایجاد کنید:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=trueفرمانهای زیر را اجرا کنید:
adb push local.prop /data/adb shell chmod 0750 /data/local.propadb reboot
گزینه ۳: از پیکربندی دستگاه برای تنظیم خصوصیات سمت سرور زیر استفاده کنید:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
تولید نمایههای تصویر راهاندازی
از دستورالعملهای زیر برای تولید نمایه تصویر راهاندازی پایه بااستفاده از آزمایش در یک دستگاه استفاده کنید.
دستگاه را راهاندازی کنید.
دستگاه را طبق روشی که در پیکربندی دستگاهها توضیح داده شده است پیکربندی کنید.
(اختیاری) مدتی طول میکشد تا قالب نمایه جدید پاک شود و جایگزین نمایههای دیگر شود. برای تسریع جمعآوری نمایه، همه نمایهها را در دستگاه بازنشانی کنید.
adb shell stopadb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"adb shell start«سفرهای کاربر مشترک» را در دستگاه اجرا کنید.
نمایه را بااستفاده از فرمان زیر ضبط کنید:
adb shell cmd package snapshot-profile androidنمایه را بااستفاده از فرمان زیر استخراج کنید:
adb pull /data/misc/profman/android.profبااستفاده از فرمانهای زیر، به فایلهای JAR مسیر کلاس بوت پیمایش کنید:
m distls $ANDROID_PRODUCT_OUT/boot.zipنمایه تصویر راهاندازی را بااستفاده از فرمان
profmanزیر تولید کنید.profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...بااستفاده از دادهها، فرمان
profmanرا بااستفاده از پرچمهای آستانه انتخاب موجود تغییر دهید.--method-threshold--class-threshold--clean-class-threshold--preloaded-class-threshold--upgrade-startup-to-hot--special-package
برای مشاهده فهرست کامل، به صفحه راهنمای
profmanیا کد منبع مراجعه کنید.