اندروید ۱۱ یا بالاتر از تولید پروفایلهای تصویر بوت پشتیبانی میکند که اطلاعات مربوط به کد اجزای مختلف سطح سیستم مانند سرور سیستم و مسیر کلاس بوت را در خود جای میدهند. Android Runtime (ART) از این اطلاعات برای انجام بهینهسازیهای گسترده سیستم استفاده میکند که برخی از آنها برای عملکرد اندروید حیاتی هستند و بر اجرای تمام کدهای غیربومی (سطح سیستم یا برنامه) تأثیر میگذارند. در برخی موارد، پروفایلهای تصویر بوت میتوانند عملکرد اجرا و مصرف حافظه را با درصدهای دو رقمی تحت تأثیر قرار دهند.
دریافت اطلاعات پروفایل بوت
پروفایلهای تصویر بوت از پروفایلهای برنامههای اجرا شده در طول سفرهای بحرانی کاربر (CUJs) گرفته میشوند. در یک پیکربندی خاص دستگاه، ART (به عنوان بخشی از پروفایلهای JIT) متدها و کلاسهای مسیر بوت مورد استفاده برنامهها را ضبط میکند، سپس آن اطلاعات را در پروفایل برنامه (به عنوان مثال، /data/misc/profiles/cur/0/com.android.chrome/primary.prof ) ثبت میکند، جایی که توسط فایل مسیر بوت Dalvik EXecutable (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). تعیین میکند که کدام متدها از سرور سیستم بهینهسازی/کامپایل میشوند، کدام کلاس در تصویر boot.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 520 استفاده میکنند، اما فقط فرآیند
systemuiاز این روش با شاخص DEX 521 استفاده میکند. همین منطق در مورد سایر بخشهای پروفایل (مثلاً کلاسهای راهاندازی) نیز صدق میکند.
در طول پردازش دادهها، روشها/کلاسها را بر اساس میزان استفاده فیلتر کنید، و اولویت را به فرآیندهای سطح سیستم (مثلاً سرور سیستم یا systemui ) یا به روشهایی که ممکن است معمولاً استفاده نشوند اما هنوز مهم هستند (مثلاً روشهایی که توسط برنامه دوربین استفاده میشوند) بدهید.
قالب پروفایل به صورت داخلی هر متد را با چندین پرچم (شروع به کار، پس از شروع به کار، داغ بودن، abi) حاشیهنویسی میکند، که بیشتر از مقداری است که در قالب dump-only نمایش داده میشود. برای استفاده از همه سیگنالها، اسکریپتهای موجود را تغییر دهید.
توصیهها
برای بهترین نتیجه از دستورالعملهای زیر استفاده کنید.
پیکربندی تولید پروفایلهای تصویر بوت را روی چندین دستگاه آزمایشی مستقر کنید و نتایج را قبل از تولید پروفایل تصویر بوت نهایی تجمیع کنید. ابزار
profmanاز تجمیع و انتخاب چندین پروفایل تصویر بوت پشتیبانی میکند، اما فقط با نسخه یکسانی از تصویر بوت (مسیر کلاس بوت یکسان) کار میکند.اولویت انتخاب را به متدها/کلاسهایی بدهید که توسط فرآیندهای سیستم استفاده میشوند. این متدها/کلاسها ممکن است از کدی استفاده کنند که اغلب توسط برنامههای دیگر استفاده نمیشود، اما بهینهسازی آنها همچنان حیاتی است.
شکل دادهها از اجرای یک دستگاه واحد در مقایسه با دستگاههای آزمایشی که CUJهای دنیای واقعی را اجرا میکنند، بسیار متفاوت به نظر میرسد. اگر ناوگان بزرگی از دستگاههای آزمایشی ندارید، از همان دستگاه برای اجرای چندین CUJ استفاده کنید تا اطمینان حاصل شود که بهینهسازیهای نمایه تصویر بوت در محیط عملیاتی به خوبی کار خواهند کرد (این سناریو در زیر شرح داده شده است).
پیکربندی دستگاهها
برای فعال کردن پیکربندی نمایه بوت از طریق ویژگیهای سیستم، از یکی از روشهای زیر استفاده کنید.
گزینه ۱: تنظیم دستی props (تا زمان راهاندازی مجدد هم کار میکند):
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 startCUJ ها را روی دستگاه اجرا کنید.
با استفاده از دستور زیر، پروفایل را ضبط کنید:
adb shell cmd package snapshot-profile androidبا استفاده از دستور زیر، پروفایل را استخراج کنید:
adb pull /data/misc/profman/android.profبا استفاده از دستورات زیر به فایلهای JAR مربوط به classpath بوت بروید:
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یا کد منبع مراجعه کنید.-