اندروید 11 یا بالاتر از تولید نمایههای تصویر راهاندازی پشتیبانی میکند که اطلاعات مربوط به کد اجزای مختلف در سطح سیستم مانند سرور سیستم و مسیر کلاس راهاندازی را در خود محفوظ میدارد. Android Runtime (ART) از این اطلاعات برای انجام بهینهسازیهای کل سیستم استفاده میکند، که برخی از آنها برای عملکرد Android حیاتی هستند و بر اجرای همه کدهای غیربومی (سطح سیستم یا برنامه) تأثیر میگذارند. در برخی موارد، نمایههای تصویر بوت میتوانند بر عملکرد اجرا و مصرف حافظه با درصدهای دو رقمی تأثیر بگذارند.
اطلاعات پروفایل بوت را دریافت کنید
نمایههای تصویر بوت از نمایههای برنامههای اجرا شده در طول سفرهای حیاتی کاربر (CUJ) مشتق شدهاند. در یک پیکربندی دستگاه خاص، ART (به عنوان بخشی از پروفایل های JIT) روش ها و کلاس های مسیر کلاس راه اندازی مورد استفاده توسط برنامه ها را ضبط می کند، سپس آن اطلاعات را در نمایه برنامه (به عنوان مثال /data/misc/profiles/cur/0/com.android.chrome/primary.prof
ثبت می کند. /data/misc/profiles/cur/0/com.android.chrome/primary.prof
)، که در آن فایل بوت classpath Dalvik EXecutable (DEX) ایندکس می شود (به فرمت نمایه ART مراجعه کنید).
نمایههای برنامه ضبطشده در طول CUJ را بررسی کنید تا مشخص کنید کدام قسمت از مسیر کلاس بوت بیشترین استفاده را دارد و برای بهینهسازی مهمتر است (برای مثال، فرمت نمایه ART را ببینید). گنجاندن همه روشها یا کلاسها بر عملکرد تأثیر منفی میگذارد، بنابراین روی رایجترین مسیرهای کد مورد استفاده تمرکز کنید. برای مثال، اگر روشی از مسیر کلاس راهاندازی توسط یک برنامه استفاده میشود، نباید بخشی از نمایههای راهاندازی باشد. هر دستگاه باید انتخاب روش/کلاس را بر اساس انتخاب CUJ و مقدار داده تولید شده توسط آزمایش پیکربندی کند.
برای جمعآوری اطلاعات مسیر کلاس راهاندازی از تمام پروفایلهای برنامه فردی روی دستگاه، دستور adb shell cmd package snapshot-profile android
را اجرا کنید. میتوانید از اطلاعات جمعآوری شده به عنوان مبنای پردازش و انتخاب روش/کلاس بدون جمعآوری دستی پروفایلهای فردی استفاده کنید (اگرچه در صورت تمایل میتوانید این کار را انجام دهید).
شکل 1. فرآیند دریافت نمایه های تصویر بوت
داده های نمایه تصویر را بوت کنید
نمایه های تصویر بوت شامل فایل ها و داده های زیر است.
نمایه مسیر کلاس بوت (
frameworks/base/config/boot-image-profile.txt
). تعیین میکند که کدام روشها از مسیر کلاس راهاندازی بهینهسازی میشوند، کدام کلاس در تصویر.art
گنجانده شده است، و چگونه فایلهای DEX مربوطه چیده میشوند.لیست کلاس های از پیش بارگذاری شده تعیین می کند کدام کلاس ها در 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 520 استفاده می کنند، اما فقط فرآیند
systemui
از روش با شاخص DEX 521 استفاده می کند. همین منطق در مورد سایر بخش های نمایه (به عنوان مثال، کلاس های راه اندازی) صدق می کند.
در طول پردازش دادهها، روشها/کلاسها را بر اساس استفاده فیلتر کنید، و اولویت را به فرآیندهای سطح سیستم (به عنوان مثال، سرور سیستم یا systemui
) یا روشهایی که ممکن است معمولاً مورد استفاده قرار نگیرند اما همچنان مهم هستند (مثلاً روشهایی که توسط برنامه دوربین).
قالب نمایه به صورت داخلی هر روش را با چندین پرچم (راه اندازی، پس از راه اندازی، داغ بودن، abi) حاشیه نویسی می کند، که بیش از آن چیزی است که در قالب فقط dump نمایش داده می شود. برای استفاده از همه سیگنال ها، اسکریپت های موجود را تغییر دهید.
توصیه ها
برای بهترین نتیجه از دستورالعمل های زیر استفاده کنید.
پیکربندی ایجاد نمایههای تصویر بوت را در چندین دستگاه آزمایشی پیادهسازی کنید و نتایج را قبل از ایجاد نمایه تصویر بوت نهایی جمعآوری کنید. ابزار
profman
از جمعآوری و انتخاب چندین پروفایل تصویر بوت پشتیبانی میکند، اما فقط با همان نسخه از تصویر بوت (همان مسیر کلاس راهاندازی) کار میکند.اولویت انتخاب را به روشها/کلاسهایی که توسط فرآیندهای سیستم استفاده میشوند، بدهید. این روشها/کلاسها ممکن است از کدی استفاده کنند که اغلب توسط برنامههای دیگر استفاده نمیشود، اما هنوز برای بهینهسازی آن حیاتی است.
شکل دادههای یک دستگاه واحد در مقایسه با دستگاههای آزمایشی که CUJهای دنیای واقعی را اجرا میکنند بسیار متفاوت به نظر میرسد. اگر ناوگان زیادی از دستگاههای آزمایشی ندارید، از یک دستگاه برای اجرای چندین CUJ استفاده کنید تا اطمینان حاصل کنید که بهینهسازیهای نمایه تصویر بوت در تولید به خوبی کار خواهند کرد (این سناریو در زیر توضیح داده شده است).
پیکربندی دستگاه ها
برای فعال کردن پیکربندی پروفایل بوت از طریق ویژگی های سیستم، از یکی از روش های زیر استفاده کنید.
گزینه 1: تنظیم دستی props (تا راه اندازی مجدد کار می کند):
adb root
adb shell stop
adb shell setprop dalvik.vm.profilebootclasspath true
adb shell setprop dalvik.vm.profilesystemserver true
adb shell start
گزینه 2: از یک
local.prop
(اثر دائمی تا زمانی که فایل حذف شود) استفاده کنید. برای انجام این کار:یک فایل
local.prop
با محتوای زیر ایجاد کنید:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
دستورات زیر را اجرا کنید:
adb push local.prop /data/
adb shell chmod 0750 /data/local.prop
adb reboot
گزینه 3: از پیکربندی دستگاه برای تنظیم ویژگی های سمت سرور زیر استفاده کنید:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
پروفایل های تصویر بوت را ایجاد کنید
از دستورالعمل های زیر برای ایجاد نمایه تصویر اولیه بوت با استفاده از آزمایش بر روی یک دستگاه استفاده کنید.
دستگاه را راه اندازی کنید.
دستگاه را همانطور که در پیکربندی دستگاه ها توضیح داده شده پیکربندی کنید.
(اختیاری) زمان می برد تا قالب نمایه جدید پاک شود و سایر پروفایل ها جایگزین شود. برای تسریع در جمع آوری نمایه، تمام نمایه های دستگاه را بازنشانی کنید.
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
CUJ ها را روی دستگاه اجرا کنید.
با استفاده از دستور زیر نمایه را ضبط کنید:
adb shell cmd package snapshot-profile android
نمایه را با استفاده از دستور زیر استخراج کنید:
adb pull /data/misc/profman/android.prof
با استفاده از دستورات زیر به فایل های JAR classpath boot بروید:
m dist
ls $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
یا کد منبع مراجعه کنید.-
اندروید 11 یا بالاتر از تولید نمایههای تصویر راهاندازی پشتیبانی میکند که اطلاعات مربوط به کد اجزای مختلف در سطح سیستم مانند سرور سیستم و مسیر کلاس راهاندازی را در خود محفوظ میدارد. Android Runtime (ART) از این اطلاعات برای انجام بهینهسازیهای کل سیستم استفاده میکند، که برخی از آنها برای عملکرد Android حیاتی هستند و بر اجرای همه کدهای غیربومی (سطح سیستم یا برنامه) تأثیر میگذارند. در برخی موارد، نمایههای تصویر بوت میتوانند بر عملکرد اجرا و مصرف حافظه با درصدهای دو رقمی تأثیر بگذارند.
اطلاعات پروفایل بوت را دریافت کنید
نمایههای تصویر بوت از نمایههای برنامههای اجرا شده در طول سفرهای حیاتی کاربر (CUJ) مشتق شدهاند. در یک پیکربندی دستگاه خاص، ART (به عنوان بخشی از پروفایل های JIT) روش ها و کلاس های مسیر کلاس راه اندازی مورد استفاده توسط برنامه ها را ضبط می کند، سپس آن اطلاعات را در نمایه برنامه (به عنوان مثال /data/misc/profiles/cur/0/com.android.chrome/primary.prof
ثبت می کند. /data/misc/profiles/cur/0/com.android.chrome/primary.prof
)، که در آن فایل بوت classpath Dalvik EXecutable (DEX) ایندکس می شود (به فرمت نمایه ART مراجعه کنید).
نمایههای برنامه ضبطشده در طول CUJ را بررسی کنید تا مشخص کنید کدام قسمت از مسیر کلاس بوت بیشترین استفاده را دارد و برای بهینهسازی مهمتر است (برای مثال، فرمت نمایه ART را ببینید). گنجاندن همه روشها یا کلاسها بر عملکرد تأثیر منفی میگذارد، بنابراین روی رایجترین مسیرهای کد مورد استفاده تمرکز کنید. برای مثال، اگر روشی از مسیر کلاس راهاندازی توسط یک برنامه استفاده میشود، نباید بخشی از نمایههای راهاندازی باشد. هر دستگاه باید انتخاب روش/کلاس را بر اساس انتخاب CUJ و مقدار داده تولید شده توسط آزمایش پیکربندی کند.
برای جمعآوری اطلاعات مسیر کلاس راهاندازی از تمام پروفایلهای برنامه فردی روی دستگاه، دستور adb shell cmd package snapshot-profile android
را اجرا کنید. میتوانید از اطلاعات جمعآوری شده به عنوان مبنای پردازش و انتخاب روش/کلاس بدون جمعآوری دستی پروفایلهای فردی استفاده کنید (اگرچه در صورت تمایل میتوانید این کار را انجام دهید).
شکل 1. فرآیند دریافت نمایه های تصویر بوت
داده های نمایه تصویر را بوت کنید
نمایه های تصویر بوت شامل فایل ها و داده های زیر است.
نمایه مسیر کلاس بوت (
frameworks/base/config/boot-image-profile.txt
). تعیین میکند که کدام روشها از مسیر کلاس راهاندازی بهینهسازی میشوند، کدام کلاس در تصویر.art
گنجانده شده است، و چگونه فایلهای DEX مربوطه چیده میشوند.لیست کلاس های از پیش بارگذاری شده تعیین می کند کدام کلاس ها در 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 520 استفاده می کنند، اما فقط فرآیند
systemui
از روش با شاخص DEX 521 استفاده می کند. همین منطق در مورد سایر بخش های نمایه (به عنوان مثال، کلاس های راه اندازی) صدق می کند.
در طول پردازش دادهها، روشها/کلاسها را بر اساس استفاده فیلتر کنید، و اولویت را به فرآیندهای سطح سیستم (به عنوان مثال، سرور سیستم یا systemui
) یا روشهایی که ممکن است معمولاً مورد استفاده قرار نگیرند اما همچنان مهم هستند (مثلاً روشهایی که توسط برنامه دوربین).
قالب نمایه به صورت داخلی هر روش را با چندین پرچم (راه اندازی، پس از راه اندازی، داغ بودن، abi) حاشیه نویسی می کند، که بیش از آن چیزی است که در قالب فقط dump نمایش داده می شود. برای استفاده از همه سیگنال ها، اسکریپت های موجود را تغییر دهید.
توصیه ها
برای بهترین نتیجه از دستورالعمل های زیر استفاده کنید.
پیکربندی ایجاد نمایههای تصویر بوت را در چندین دستگاه آزمایشی پیادهسازی کنید و نتایج را قبل از ایجاد نمایه تصویر بوت نهایی جمعآوری کنید. ابزار
profman
از جمعآوری و انتخاب چندین پروفایل تصویر بوت پشتیبانی میکند، اما فقط با همان نسخه از تصویر بوت (همان مسیر کلاس راهاندازی) کار میکند.اولویت انتخاب را به روشها/کلاسهایی که توسط فرآیندهای سیستم استفاده میشوند، بدهید. این روشها/کلاسها ممکن است از کدی استفاده کنند که اغلب توسط برنامههای دیگر استفاده نمیشود، اما هنوز برای بهینهسازی آن حیاتی است.
شکل دادههای یک دستگاه واحد در مقایسه با دستگاههای آزمایشی که CUJهای دنیای واقعی را اجرا میکنند بسیار متفاوت به نظر میرسد. اگر ناوگان زیادی از دستگاههای آزمایشی ندارید، از یک دستگاه برای اجرای چندین CUJ استفاده کنید تا اطمینان حاصل کنید که بهینهسازیهای نمایه تصویر بوت در تولید به خوبی کار خواهند کرد (این سناریو در زیر توضیح داده شده است).
پیکربندی دستگاه ها
برای فعال کردن پیکربندی پروفایل بوت از طریق ویژگی های سیستم، از یکی از روش های زیر استفاده کنید.
گزینه 1: تنظیم دستی props (تا راه اندازی مجدد کار می کند):
adb root
adb shell stop
adb shell setprop dalvik.vm.profilebootclasspath true
adb shell setprop dalvik.vm.profilesystemserver true
adb shell start
گزینه 2: از یک
local.prop
(اثر دائمی تا زمانی که فایل حذف شود) استفاده کنید. برای انجام این کار:یک فایل
local.prop
با محتوای زیر ایجاد کنید:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=true
دستورات زیر را اجرا کنید:
adb push local.prop /data/
adb shell chmod 0750 /data/local.prop
adb reboot
گزینه 3: از پیکربندی دستگاه برای تنظیم ویژگی های سمت سرور زیر استفاده کنید:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
پروفایل های تصویر بوت را ایجاد کنید
از دستورالعمل های زیر برای ایجاد نمایه تصویر اولیه بوت با استفاده از آزمایش بر روی یک دستگاه استفاده کنید.
دستگاه را راه اندازی کنید.
دستگاه را همانطور که در پیکربندی دستگاه ها توضیح داده شده پیکربندی کنید.
(اختیاری) زمان می برد تا قالب نمایه جدید پاک شود و سایر پروفایل ها جایگزین شود. برای تسریع در جمع آوری نمایه، تمام نمایه های دستگاه را بازنشانی کنید.
adb shell stop
adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
adb shell start
CUJ ها را روی دستگاه اجرا کنید.
با استفاده از دستور زیر نمایه را ضبط کنید:
adb shell cmd package snapshot-profile android
نمایه را با استفاده از دستور زیر استخراج کنید:
adb pull /data/misc/profman/android.prof
با استفاده از دستورات زیر به فایل های JAR classpath boot بروید:
m dist
ls $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
یا کد منبع مراجعه کنید.-