Baseline Profiles با اجتناب از مراحل تفسیر و ترجمه درجا (JIT) برای مسیرهای کد گنجاندهشده، سرعت اجرای کد را از اولین راهاندازی حدود ۳۰٪ بهبود میبخشد.
با ارسال Baseline Profile در برنامه یا کتابخانه، زمان اجرای Android (ART) میتواند مسیرهای کد مشخصشده را ازطریق کامپایل «پیشاز موعد» (AOT) بهینهسازی کند، و بهبودهای عملکردی را برای هر کاربر جدید و هر بهروزرسانی برنامه ارائه دهد. این «بهینهسازی با راهنمایی نمایه» (PGO) به برنامهها امکان میدهد راهاندازی را بهینهسازی کنند، پرش تعامل را کاهش دهند، و عملکرد کلی زمان اجرا را برای کاربران از اولین راهاندازی بهبود بخشند.
این بهبودهای عملکرد مستقیماً به بهبود سنجههای کسبوکار مانند حفظ کاربر، تراکنشها، و ردهبندیها منجر میشود. میتوانید درباره اینکه عملکرد چگونه بر سنجههای کسبوکار تأثیر میگذارد در داستانهای Josh، Lyft، TikTok، و Zomato بیشتر بخوانید.
مزایای Baseline Profiles
«نمایههای پایه» پیشکامپایل کردن کد را در تعاملهای مهم کاربر، مثل راهاندازی برنامه، پیمایش بین صفحهها، یا پیمایش محتوا، امکانپذیر میکنند و باعث میشوند این تعاملها از همان اولین باری که اجرا میشوند روانتر باشند. با افزایش سرعت و واکنشگرایی برنامه، Baseline Profiles میتواند به افزایش کاربران فعال روزانه و نرخ بازدید بازگشتی میانگین بالاتر منجر شود.
Baseline Profiles با ارائه تعاملهای رایج کاربر که زمان اجرای برنامه را از اولین راهاندازی بهبود میبخشد، به هدایت بهینهسازی فراتر از راهاندازی برنامه کمک میکند. کامپایل کردن AOT هدایتشده به دستگاههای کاربر متکی نیست و میتواند بهجای دستگاه همراه، یکبار در هر نسخه پخش در ماشین توسعه نرمافزار انجام شود. با ارسال نسخههای پخش با «نمایه پایه»، بهینهسازیهای برنامه بسیار سریعتر از زمانی دردسترس قرار میگیرد که فقط به نمایههای ابری متکی باشید.
وقتی از «نمایه پایه» استفاده نمیشود، همه کدهای برنامه یا پساز تفسیر شدن در حافظه ترجمه درجا میشوند، یا وقتی دستگاه غیرفعال است در پسزمینه در فایل odex نوشته میشوند. پساز نصب یا بهروزرسانی برنامه، کاربران از اولین باری که آن را اجرا میکنند تا زمانی که مسیرهای کد جدید بهینهسازی شوند، تجربه نامطلوبی دارند.
بسیاری از برنامهها پساز بهینهسازی، افزایش عملکردی حدود ۳۰٪ را اندازهگیری میکنند.
نمایههای راهاندازی
نمایههای راهاندازی مشابه «نمایههای پایه» هستند، اما در زمان ترجمه برای بهینهسازی چیدمان DEX برای زمانهای راهاندازی سریعتر استفاده میشوند، نه برای بهینهسازی دروندستگاهی. برای کسب اطلاعات بیشتر درباره تفاوت نمایههای راهاندازی با نمایههای مبنا، مقایسه نمایههای مبنا و نمایههای راهاندازی را ببینید. برای اطلاعات بیشتر درباره بهینهسازی چیدمان DEX، به بهینهسازیهای چیدمان DEX و نمایههای راهاندازی مراجعه کنید.
شروع کنید
برای شروع بهینهسازی عملکرد در برنامه موجود، به ایجاد Baseline Profiles مراجعه کنید.
تولید نمایه درمقابل ساختهای نسخه پخش
درک تفاوت در پیکربندیهای ساخت موردنیاز هنگام تولید فایلهای نمایه راهاندازی و Baseline (برای مثال، baseline-prof.txt و startup-prof.txt) درمقابل هنگام ساخت APK نسخه نهایی که از این نمایهها استفاده میکند، مهم است.
هنگام تولید فایلهای نمایه (برای مثال، benchmark):
هنگام ضبط Baseline Profile با آزمایش، برنامهتان نباید مبهم باشد.
برای اطمینان از اینکه قوانین نمایه تولیدشده دقیقاً با امضاهای روش کد شما مطابقت دارد، باید مبهمسازی و بهینهسازی (R8) را برای تنوع ساخت مورداستفاده برای تولید نمایه خاموش کنید. این تنوع باید با تنوع ساخت نسخه پخش شما متفاوت باشد، که در آن مبهمسازی و بهینهسازی فعال است. برای این کار، isMinifyEnabled = false را برای تنوع ساخت تولید نمایه تنظیم کنید. اگر از افزونه Baseline Profile Gradle استفاده نمیکنید،
باید مطمئن شوید که -dontobfuscate و -dontoptimize اعمال شدهاند. افزونه Baseline Profile Gradle بهطور خودکار این پیکربندی را برای شما انجام میدهد.
میتوانید با باز کردن فایل نمایه نوشتار تولیدشده (برای مثال، baseline-prof.txt) و بررسی اینکه نامهای کلاس و روش مبهمسازی نشده باشند، درستیسنجی کنید که برنامهتان درطول تولید نمایه مبهمسازی نشده باشد.
هنگام ساختن APK نسخه پخش نهایی:
هنگام ساختن برنامه نسخه پخش، برنامهتان باید مبهمسازی شود. ساخت نسخه پخش شما باید isMinifyEnabled = true داشته باشد تا از ابهامسازی، کوچکسازی، و بهینهسازی بهرهمند شود. R8 بهطور خودکار قوانین را از فایلهای نمایه غیرمبهم شما بازنویسی میکند تا با کد مبهم و بهینهشده در APK نسخه شما مطابقت داشته باشد. ساخت با تبدیل صحیح قوانین از فایل نوشتاری غیرمبهم استفاده میکند.
اگر میخواهید بهینهسازی چیدمان DEX (که توسط «نمایههای راهاندازی» هدایت میشود) کار کند، برنامه نسخه پخش شما باید مبهمسازی شود و از R8 با همه بهینهسازیهای فعالشده استفاده کند.
گردشهای کار پیشرفته (غیر Gradle):
اگر از گردش کار پیشرفته غیرGradle (مثل Bazel، Buck، یا خطوط لوله خودکارسازی CI سفارشی) برای تولید نمایههایتان استفاده میکنید، همچنان باید از همان اصول پیروی کنید. برنامهتان نباید هنگام ضبط نمایه مبهم یا بهینهسازی شود. اما وقتی برنامه نسخه پخشتان را میسازید، باید آن را مبهمسازی کنید. R8 فایل قوانین نوشتاری مبهمنشده را پردازش میکند و قوانین را بهدرستی تبدیل میکند تا برنامه انتشار مبهمشده اعمال شود.
حداقل نسخههای پایدار توصیهشده
زنجیره وابستگی نسخههای پخش پایدار و توسعهای ارائه میدهد. برای تولید و نصب «نمایه پایه»، از نسخههای پشتیبانیشده زیر یا نسخههای بالاتر افزونه Android Gradle، کتابخانه Macrobenchmark، و Profile Installer استفاده کنید. این وابستگیها در زمانهای مختلف موردنیاز هستند و باهم بهعنوان زنجیره ابزار کار میکنند تا «نمایه پایه» بهینه را فعال کنند.
- افزایه Android Gradle:
com.android.tools.build:8.0.0 - کتابخانه Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.5.0 - نصبکننده نمایه:
androidx.profileinstaller:profileinstaller:1.4.1
توصیه میکنیم برای ایجاد و مدیریت «نمایههای پایه» از جدیدترین نسخه AGP استفاده کنید. در اینجا عملکردهای اصلی که با نسخههای مختلف AGP ارائه میشود آورده شده است:
| نسخه AGP | ویژگیها |
|---|---|
| ۱-۹ |
پشتیبانی کامل از دایرکتوری مجموعه منبع (واحدهای کتابخانه):
علاوهبر دایرکتوریهای آگاه از گوناگونی، میتوانید
چند فایل منبع «نمایه خط پایه» را با نام دلخواه، مثل
src/free/generated/baselineProfiles/baseline-prof1.txt،
برای واحدهای کتابخانه و همچنین واحدهای برنامه اعلام کنید.
|
| ۸٫۴ | نصبهای محلی برنامه از نسخههای ساخت غیرقابلاشکالزدایی بااستفاده از ابزار خط فرمان Gradle wrapper یا Android Studio، «نمایههای پایه» را نصب میکند، بنابراین عملکرد نسخه ساخت محلی شما بیشتر با نسخه تولید مطابقت دارد. این بهروزرسانی بر عملکرد تولید Baseline Profiles تأثیری ندارد. |
| ۳-۸ |
|
| ۲-۸ |
|
| ۸.۰ | حداقل نسخه توصیهشده: از افزونه Baseline Profile Gradle برای تولید Baseline Profiles با یک وظیفه Gradle استفاده کنید.
|
| ۴-۷ |
حداقل نسخه پشتیبانیشده: برنامهها میتوانند Baseline Profiles را از کتابخانهها مصرف کنند و Baseline Profile خودشان را در فایل src/main/baseline-prof.txt ارائه دهند.
|
تنظیمات منبع نمایه آگاه از گونه
بااستفاده از «افزایه Android Gradle» (AGP) نسخه ۸.۰ برای برنامهها و AGP نسخه ۸.۳ برای کتابخانهها، میتوانید قوانین «نمایه پایه» را در دایرکتوری مجموعه منبع اختصاصی قرار دهید، از محدودیتهای یک مسیر ثابت (برای مثال، src/main/baseline-prof.txt) فراتر بروید، و چندین فایل را فعال کنید.
این کار پشتیبانی قوی از انواع را تسهیل میکند و به شما امکان میدهد «نمایههای پایه» متمایزی را تعریف کنید که برای انواع و نسخههای ساخت خاص سفارشی شدهاند (برای مثال، بااستفاده از دایرکتوریهایی مانند src/variant/baselineProfiles/)، که تضمین میکند قوانین بهینهسازی عملکرد بهطور دقیق برای هر برنامه یا کتابخانه دودویی منحصربهفرد اعمال میشوند.
نمونه تولید نمایه
در زیر نمونه کلاسی برای ایجاد «نمایه پایه» برای راهاندازی برنامه، و همچنین چندین رویداد پیمایش و پیمایش بااستفاده از کتابخانه توصیهشده Macrobenchmark آورده شده است:
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
uiAutomator {
// App startup journey.
startApp(PACKAGE_NAME)
// Find and click elements using the new DSL
onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
onElement { viewIdResourceName == "myLazyColumn" }.also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
pressBack()
}
}
}
}
برای کسب اطلاعات بیشتر درباره استفاده از کتابخانه UI Automator برای خودکارسازی مسیرهای کاربر، به نوشتن آزمایشهای خودکار با UI Automator مراجعه کنید.
میتوانید این کد را در بافت کامل و با جزئیات بیشتر بهعنوان بخشی از نمونههای عملکرد ما در GitHub ببینید.
شامل چه مواردی باشد
هنگام استفاده از «نمایههای پایه» در برنامه، میتوانید کد راهاندازی برنامه و تعاملات رایج کاربر مانند پیمایش بین صفحهها یا پیمایش را اضافه کنید. همچنین میتوانید کل جریانها مثل ثبتنام، ورود به سیستم، یا پرداخت را جمعآوری کنید. هر مسیر کاربری که ازنظر شما حیاتی است میتواند با بهبود عملکرد زمان اجرای خود از Baseline Profiles بهرهمند شود.
اگر رویکردهای مختلفی را برای بهبود عملکرد امتحان میکنید، Baseline Profiles را برای هر دو شاخه آزمایشتان درنظر بگیرید. با انجام این کار، میتوانید تفسیر نتایج را آسانتر کنید و مطمئن شوید که همه کاربران بهطور مداوم کد کامپایلشده را اجرا میکنند.
کتابخانهها میتوانند Baseline Profiles خودشان را ارائه دهند و آنها را با نسخههای پخششده ارسال کنند تا عملکرد برنامه را بهبود بخشند. برای مثال، بخش استفاده از Baseline Profile در عملکرد Jetpack Compose را ببینید.
نحوه عملکرد «نمایههای مبنا»
هنگام توسعه برنامه یا کتابخانه، تعریف «نمایههای پایه» را برای پوشش دادن تعاملات رایج کاربر که در آنها زمان یا تأخیر پرداز زدن مهم است درنظر بگیرید. نحوه عملکرد آنها به این صورت است:
قوانین نمایه قابلخواندن برای انسان برای برنامهتان تولید میشود و بهصورت دودویی در برنامه کامپایل میشود. میتوانید آنها را در
assets/dexopt/baseline.profپیدا کنید. سپس میتوانید Android App Bundle (AAB) را طبق معمول در Google Play بارگذاری کنید.Google Play نمایه را پردازش میکند و آن را مستقیماً همراه با APK برای کاربران ارسال میکند. درطول نصب، ART روشهای موجود در نمایه را بهصورت AOT کامپایل میکند که باعث میشود این روشها سریعتر اجرا شوند. اگر نمایه حاوی روشهای استفادهشده در راهاندازی برنامه یا درطول پرداز زدن قاب باشد، کاربر ممکن است زمان راهاندازی سریعتر و لرزش کمتری را تجربه کند.
این جریان با تجمیع «نمایههای ابری» همکاری میکند تا عملکرد را براساس استفاده واقعی از برنامه درطول زمان تنظیم دقیق کند.
مقایسه Baseline Profiles و Startup Profiles
برای تعریف و تولید فایلهای نمایه از Baseline Profile Gradle Plugin استفاده میکنید.
این افزونه به فرایند ساخت متصل میشود و AGP این قوانین نمایه قابلخواندن برای انسان را به قالب دودویی کامپایل میکند—که بهعنوان baseline.prof در APK یا AAB بستهبندی شده است—و ART میتواند بهطور مؤثر برای کامپایل دروندستگاهی از آن استفاده کند، بهشرطی که کوچکتر از ۱٫۵ مگابایت باشد.
این فایلهای نمایه تولیدشده معمولاً startup-prof.txt و
baseline-prof.txt نامیده میشوند. اگرچه محتوای آنها ممکن است گاهی مشابه بهنظر برسد،
بهویژه اگر عمدتاً روی راهاندازی تمرکز کرده باشید، آنها اهداف متمایزی را دنبال میکنند
و بر عملکرد در مراحل مختلف تأثیر میگذارند:
نمایه پایه
فایل «نمایه پایه» حاوی مجموعه جامعی از قوانین است که «زمان اجرای Android» (ART) از آن برای پیشکامپایل کردن مسیرهای کد پرکاربرد استفاده میکند، که عملکرد برنامه را فراتر از راهاندازی بهینه میکند.
فایل «نمایه مبنا» معمولاً یک اَبَرمجموعه از قوانین موجود در
«نمایه راهاندازی» شما است. این فایل شامل همه قوانین لازم برای بهینهسازی راهاندازی برنامه (تولیدشده ازطریق تکلیف Gradle baselineProfile) بههمراه نمایههای اضافی برای دیگر مسیرهای قطعی کاربر است. برای مثال، پیمایش،
و پیمایش در صفحههای مختلف.
این قوانین اضافی غیرراهاندازی بدون توجه به مقدار فیلد پیکربندی includeInStartupProfile تولید میشوند.
نمایه شرکت نوآفرین
فایل «نمایه راهاندازی» حاوی قوانینی است که بهطور خاص برای مسیر راهاندازی برنامهتان بهینهسازی شده است. درطول کامپایل، D8 کد بایت جاوا را به قالب DEX تبدیل میکند.
سپس R8 از این فایل برای تأثیرگذاری بر چیدمان فایلهای DEX شما استفاده میکند و مطمئن میشود
که کد راهاندازی حیاتی در فایل DEX اصلی قرار میگیرد تا سریعتر
اجرا شود. بهطور کلی، باید includeInStartupProfile را فقط برای سناریوهای آزمایشی ضروری برای نمایش اولیه برنامه روی true تنظیم کنید. برای اطلاعات بیشتر،
ایجاد نمایههای راهاندازی را ببینید.
نمایههای ابری
«نمایههای ابری» شکل دیگری از «بهینهسازی با راهنمایی نمایه» (PGO) را ارائه میدهند که توسط «فروشگاه Google Play» جمعآوری شده و برای کامپایل زمان نصب توزیع شده است، همراه با «نمایههای پایه».
درحالیکه «نمایههای Cloud» براساس تعاملات کاربر واقعی با برنامه هدایت میشوند، توزیع آنها پساز بهروزرسانی چند ساعت تا چند روز طول میکشد که این امر دردسترس بودن آنها را محدود میکند. تا زمانی که نمایهها بهطور کامل توزیع نشوند، عملکرد برنامه برای کاربران برنامههای جدید یا بهروزشده بهینه نخواهد بود. علاوهبراین، Cloud Profiles فقط از دستگاههای Android دارای Android 9 (سطح میانای برنامهسازی کاربردی ۲۸) یا بالاتر پشتیبانی میکند و فقط برای برنامههایی که پایگاه کاربر بهاندازه کافی بزرگ دارند بهخوبی مقیاسبندی میشود.
رفتار کامپایل در نسخههای Android
نسخههای پلاتفرم Android از رویکردهای مختلفی برای کامپایل کردن برنامه استفاده میکنند که هرکدام مبادله عملکرد مربوط به خود را دارند. Baseline Profiles با ارائه نمایهای برای همه نصبها، روشهای کامپایل قبلی را بهبود میبخشد.
| نسخه Android | روش گردآوری | رویکرد بهینهسازی |
|---|---|---|
| ۵ تا ۶ (سطح میانای برنامهسازی کاربردی ۲۱ تا ۲۳) | AOT کامل | کل برنامه درطول نصب بهینهسازی میشود، که منجربه زمان انتظار طولانی برای استفاده از برنامه، افزایش استفاده از RAM و فضای دیسک، و زمان طولانیتر برای بار کردن کد از دیسک میشود و احتمالاً زمان راهاندازی سرد را افزایش میدهد. |
| ۷ تا ۸٫۱ (سطح ایپیآی ۲۴ تا ۲۷) | AOT جزئی (نمایه مبنا) | «نمایههای پایه»
توسط androidx.profileinstaller در اولین اجرا
نصب میشوند، وقتی که
پیمانه برنامه این وابستگی را
تعریف میکند. ART میتواند با افزودن
قوانین نمایه بیشتر درطول
استفاده از برنامه و کامپایل
کردن آنها در زمان بیکار
بودن دستگاه، این عملکرد را
بیشتر بهبود بخشد. این کار
فضای دیسک و زمان بار کردن کد از دیسک را بهینهسازی میکند و درنتیجه زمان انتظار برای برنامه را کاهش میدهد. |
| ۹ (سطح API ۲۸) و بالاتر | AOT جزئی (نمایه مبنا + نمایه ابری) | Play از «نمایههای پایه» درطول نصب برنامه برای بهینهسازی APK و نمایههای ابری (درصورت وجود) استفاده میکند. پساز نصب، نمایههای ART در Play بارگذاری و تجمیع میشوند و سپس بهعنوان «نمایههای ابری» به کاربران دیگر ارائه میشوند تا هنگام نصب یا بهروزرسانی برنامه از آنها استفاده کنند. |
مشکلات شناختهشده
در زیر مشکلات و راهحلهای احتمالی، یا مشکلاتی که درحالحاضر برای آنها راهگریزهایی درحال توسعه است آورده شده است:
ممکن است تولید «نمایه پایه» بهدلیل تنظیمات اجازه در برخی دستگاهها، ازجمله دستگاههای OnePlus، ناموفق باشد. برای حل این مشکل، گزینه غیرفعال کردن نظارت بر اجازهها را در تنظیمات گزینههای توسعهدهندگان خاموش کنید.
برای ارائه موفقیتآمیز «نمایههای پایه» برای کتابخانهها، حداقل از افزونه Baseline Profile Gradle نسخه ۱.۲.۳ یا AGP نسخه ۸.۳ استفاده کنید (مشکل شماره ۳۱۳۹۹۲۰۹۹).
اگر «نمایههای پایه» را با فرمان
./gradlew app:generateBaselineProfileتولید کنید، محکهای واحد آزمایشی نیز اجرا میشوند، و نتایج دور ریخته میشوند. اگر این اتفاق افتاد، میتوانید فقط «نمایههای پایه» را با اجرای فرمان با-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfileتولید کنید. این مشکل در AGP 8.2 برطرف شده است.فرمان تولید «نمایههای مبنا» برای همه انواع ساخت—
./gradlew app:generateBaselineProfile—فقط «نمایههای مبنا» را برای نوع ساخت نسخه پخش تولید میکند. این مشکل در AGP 8.1 برطرف شده است.کانالهای توزیع برنامه غیراز «فروشگاه Google Play» ممکن است از استفاده از «نمایههای پایه» در زمان نصب پشتیبانی نکنند. کاربران برنامههای نصبشده ازطریق این کانالها مزایا را تا زمانی که dexopt پسزمینه اجرا نشود (که احتمالاً شبانه است) نمیبینند.
همرسانی داخلی برنامه «فروشگاه Play» از «نمایههای پایه» پشتیبانی نمیکند؛ اما دسته هدف آزمایشی داخلی پشتیبانی میکند.
بهینهسازی باتری در برخیاز دستگاهها، مثل دستگاههای Huawei، میتواند در نصب نمایه اختلال ایجاد کند. برای اطمینان از اینکه نمایههایتان بهطور مؤثر نصب شدهاند، هرگونه بهینهسازی باتری را در دستگاههای محک خود غیرفعال کنید.
منابع بیشتر
توصیهشده برای شما
- توجه: وقتی جاوا اسکریپت خاموش باشد، نوشتار پیوند نمایش داده میشود
- ایجاد «نمایههای مبنا» {:#creating-profile-rules}
- ایجاد و اندازهگیری «نمایههای پایه» بدون Macrobenchmark
- بهینهسازیهای چیدمان DEX و نمایههای راهاندازی