پروفایل های تصویر را بوت کنید

اندروید ۱۱ یا بالاتر از تولید پروفایل‌های تصویر بوت پشتیبانی می‌کند که اطلاعات مربوط به کد اجزای مختلف سطح سیستم مانند سرور سیستم و مسیر کلاس بوت را در خود جای می‌دهند. 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 root
    adb shell stop
    adb shell setprop dalvik.vm.profilebootclasspath true
    adb shell setprop dalvik.vm.profilesystemserver true
    adb shell start
  • گزینه ۲: از local.prop استفاده کنید (تا زمانی که فایل حذف شود، اثر دائمی دارد). برای انجام این کار:

    1. یک فایل local.prop با محتوای زیر ایجاد کنید:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. دستورات زیر را اجرا کنید:

      adb push local.prop /data/
      adb shell chmod 0750 /data/local.prop
      adb reboot
  • گزینه ۳: از پیکربندی دستگاه برای تنظیم ویژگی‌های سمت سرور زیر استفاده کنید:

    adb shell device_config put runtime_native_boot profilebootclasspath true
    adb shell device_config put runtime_native_boot profilesystemserver true
    

ایجاد پروفایل‌های تصویر بوت

از دستورالعمل‌های زیر برای تولید یک پروفایل بوت اولیه با استفاده از آزمایش روی یک دستگاه واحد استفاده کنید.

  1. دستگاه را تنظیم کنید.

    1. دستگاه را مطابق توضیحات موجود در بخش «پیکربندی دستگاه‌ها» پیکربندی کنید.

    2. (اختیاری) مدتی طول می‌کشد تا قالب جدید پروفایل، پروفایل‌های دیگر را پاک و جایگزین کند. برای سرعت بخشیدن به جمع‌آوری پروفایل، تمام پروفایل‌های دستگاه را مجدداً تنظیم کنید.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. CUJ ها را روی دستگاه اجرا کنید.

  2. با استفاده از دستور زیر، پروفایل را ضبط کنید:

    adb shell cmd package snapshot-profile android
  3. با استفاده از دستور زیر، پروفایل را استخراج کنید:

    adb pull /data/misc/profman/android.prof
  4. با استفاده از دستورات زیر به فایل‌های JAR مربوط به classpath بوت بروید:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. با استفاده از دستور profman زیر، پروفایل تصویر بوت را ایجاد کنید.

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. با استفاده از داده‌ها، دستور profman را با استفاده از پرچم‌های آستانه انتخاب موجود، تنظیم کنید.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    برای مشاهده لیست کامل، به صفحه راهنمای profman یا کد منبع مراجعه کنید.