با استفاده از کتابخانه Jetpack Macrobenchmark و BaselineProfileRule
پروفایلها را بهطور خودکار برای هر نسخه برنامه ایجاد کنید. توصیه میکنیم از com.android.tools.build:gradle:8.0.0
یا بالاتر استفاده کنید، که در هنگام استفاده از نمایههای خط پایه، با پیشرفتهای ساخت همراه است.
این مراحل کلی برای ایجاد یک نمایه پایه جدید است:
- ماژول Baseline Profile را تنظیم کنید.
- تست JUnit را تعریف کنید که به تولید پروفایل های پایه کمک می کند.
- سفرهای کاربر حیاتی (CUJ) را که می خواهید بهینه کنید اضافه کنید.
- نمایه خط پایه را ایجاد کنید.
پس از ایجاد نمایه خط پایه، آن را با استفاده از یک دستگاه فیزیکی برای اندازه گیری بهبود سرعت محک بزنید.
ساده ترین راه برای ایجاد یک نمایه پایه جدید، استفاده از الگوی ماژول نمایه پایه است که با شروع Android Studio Iguana و افزونه Android Gradle (AGP) 8.2 در دسترس است.
الگوی ماژول Baseline Profile Generator Android Studio ایجاد یک ماژول جدید را برای تولید و محک گذاری نمایه های خط پایه به صورت خودکار انجام می دهد. اجرای الگو بیشتر پیکربندی ساخت، تولید نمایه خط پایه و کد تأیید را ایجاد می کند. این الگو کدی را برای تولید و محک زدن نمایههای خط پایه برای اندازهگیری راهاندازی برنامه ایجاد میکند.
برای اجرای قالب ماژول Baseline Profile، مراحل زیر را دنبال کنید:
- File > New > New Module را انتخاب کنید
- قالب Baseline Profile Generator را در پانل Templates انتخاب کرده و آن را پیکربندی کنید:
فیلدهای قالب به شرح زیر است:
- برنامه هدف : مشخص می کند که نمایه خط پایه برای کدام برنامه تولید می شود. وقتی فقط یک ماژول اپلیکیشن در پروژه خود دارید، تنها یک مورد در این لیست وجود دارد.
- نام ماژول : نامی که برای ماژول Baseline Profile در حال ایجاد میخواهید.
- نام بسته : نام بسته ای که برای ماژول Baseline Profile می خواهید.
- زبان : چه بخواهید کد تولید شده Kotlin یا Java باشد.
- زبان پیکربندی ساخت : چه بخواهید از Kotlin Script (KTS) یا Groovy برای اسکریپت های پیکربندی ساخت خود استفاده کنید.
- از دستگاه با مدیریت Gradle استفاده کنید : آیا از دستگاه های مدیریت شده Gradle برای آزمایش برنامه خود استفاده می کنید.
- روی Finish کلیک کنید و ماژول جدید ایجاد می شود. اگر از کنترل منبع استفاده می کنید، ممکن است از شما خواسته شود که فایل های ماژول جدید ایجاد شده را به کنترل منبع اضافه کنید.
ماژول جدید ایجاد شده شامل تست هایی برای تولید و محک زدن نمایه خط پایه و آزمایش راه اندازی برنامه اولیه است. توصیه میکنیم این موارد را تقویت کنید تا شامل CUJ و گردش کار راهاندازی پیشرفته باشد. اطمینان حاصل کنید که تستهای مربوط به راهاندازی برنامه در یک بلوک rule
قرار دارند و includeInStartupProfile
روی true
تنظیم شده است. برعکس، برای عملکرد بهینه، مطمئن شوید که تستهایی که مربوط به راهاندازی برنامه نیستند در نمایه راهاندازی گنجانده نشده است. بهینهسازیهای راهاندازی برنامه برای تعریف بخش خاصی از نمایه خط پایه به نام نمایه راهاندازی استفاده میشوند.
اگر این CUJها را خارج از نمایه خط پایه تولید شده و کد محک انتزاعی کنید، به قابلیت نگهداری کمک می کند تا بتوان برای هر دو مورد استفاده قرار داد. این بدان معنی است که تغییرات در CUJ های شما به طور مداوم استفاده می شود.
الگوی ماژول Baseline Profile یک پیکربندی اجرای جدید برای ایجاد نمایه خط پایه اضافه می کند. اگر از طعمهای محصول استفاده میکنید، Android Studio پیکربندیهای اجرای چندگانه ایجاد میکند تا بتوانید پروفایلهای پایه جداگانه برای هر طعم ایجاد کنید.
هنگامی که پیکربندی اجرای Generate Baseline Profile کامل شد، نمایه خط پایه تولید شده را در فایل src/ variant /generated/baselineProfiles/baseline-prof.txt
در ماژولی که در حال نمایه سازی است کپی می کند. گزینه های مختلف یا نوع ساخت انتشار هستند یا یک نوع ساخت که شامل نوع ساخت انتشار است.
نمایه خط پایه تولید شده در اصل در build/outputs
ایجاد می شود. مسیر کامل با توجه به نوع یا طعم برنامه در حال نمایه و اینکه آیا از یک دستگاه مدیریت شده توسط Gradle یا یک دستگاه متصل برای پروفایل استفاده می کنید، تعیین می شود. اگر از نامهای استفاده شده توسط کد و پیکربندیهای ساخت ایجاد شده توسط الگو استفاده میکنید، نمایه خط پایه در build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt
ایجاد میشود. احتمالاً مجبور نخواهید بود مستقیماً با این نسخه از نمایه خط پایه تولید شده تعامل داشته باشید، مگر اینکه به صورت دستی آن را در ماژول های هدف کپی کنید (توصیه نمی شود).
اگر نمیتوانید از الگوی ماژول نمایه پایه استفاده کنید، از الگوی ماژول Macrobenchmark و افزونه Baseline Profile Gradle برای ایجاد یک نمایه پایه جدید استفاده کنید. توصیه می کنیم از این ابزارها با Android Studio Giraffe و AGP 8.1 استفاده کنید.
در اینجا مراحل ایجاد یک نمایه پایه جدید با استفاده از الگوی ماژول Macrobenchmark و افزونه Baseline Profile Gradle آمده است:
- یک ماژول Macrobenchmark را در پروژه Gradle خود راه اندازی کنید .
- یک کلاس جدید به نام
BaselineProfileGenerator
تعریف کنید:class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { startActivityAndWait() } ) }
مولد میتواند شامل تعاملاتی با برنامه شما فراتر از راهاندازی برنامه باشد. این به شما امکان میدهد عملکرد زمان اجرا برنامه خود را بهینه کنید، مانند پیمایش لیستها، اجرای انیمیشنها و پیمایش در یک
Activity
. نمونههای دیگری از آزمایشهایی را ببینید که از@BaselineProfileRule
برای بهبود سفرهای حیاتی کاربر استفاده میکنند. افزونه Baseline Profile Gradle را اضافه کنید (
libs.plugins.androidx.baselineprofile
). این افزونه تولید پروفایل های پایه و نگهداری آنها را در آینده آسان تر می کند.برای ایجاد نمایه خط پایه، وظایف
:app:generateBaselineProfile
یا:app:generate Variant BaselineProfile
Gradle را در ترمینال اجرا کنید.ژنراتور را بهعنوان یک آزمایش ابزاری بر روی یک دستگاه فیزیکی ریشهدار، شبیهساز یا دستگاه مدیریتشده Gradle اجرا کنید. اگر از یک دستگاه مدیریت شده Gradle استفاده می کنید،
aosp
به عنوانsystemImageSource
تنظیم کنید، زیرا برای تولید کننده پروفایل پایه به دسترسی ریشه نیاز دارید.در پایان کار تولید، نمایه خط پایه در
app/src/ variant /generated/baselineProfiles
کپی میشود.
توصیه میکنیم با استفاده از الگوی ماژول پروفایل پایه آندروید استودیو (ترجیحا) یا الگوی Macrobenchmark یک نمایه پایه ایجاد کنید، اما میتوانید به تنهایی از افزونه Baseline Profile Gradle نیز استفاده کنید. برای مطالعه بیشتر در مورد پلاگین Baseline Profile Gradle، به پیکربندی نسل نمایه خط پایه خود مراجعه کنید.
در اینجا نحوه ایجاد نمایه پایه با استفاده از افزونه Baseline Profile Gradle به طور مستقیم آورده شده است:
- یک ماژول
com.android.test
جدید ایجاد کنید—مثلاً:baseline-profile
. فایل
build.gradle.kts
را برای:baseline-profile
پیکربندی کنید:- افزونه
androidx.baselineprofile
را اعمال کنید. - اطمینان حاصل کنید که
targetProjectPath
به ماژول:app
اشاره می کند. - به صورت اختیاری، یک دستگاه با مدیریت Gradle (GMD) اضافه کنید. در مثال زیر،
pixel6Api31
است. اگر مشخص نشده باشد، افزونه از یک دستگاه متصل، شبیه سازی شده یا فیزیکی استفاده می کند. - همانطور که در مثال زیر نشان داده شده است، پیکربندی مورد نظر خود را اعمال کنید.
کاتلین plugins { id("com.android.test") id("androidx.baselineprofile") } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath = ":app" // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices += "pixel6Api31" // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices = false }
شیار plugins { id 'com.android.test' id 'androidx.baselineprofile' } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath ':app' // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device 'Pixel 6' apiLevel 31 systemImageSource 'aosp' } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices ['pixel6Api31'] // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices false }
- افزونه
یک تست Baseline Profile در ماژول تست
:baseline-profile
ایجاد کنید. مثال زیر تستی است که برنامه را راه اندازی می کند و منتظر می ماند تا بیکار شود.کاتلین class BaselineProfileGenerator { @get:Rule val baselineRule = BaselineProfileRule() @Test fun startupBaselineProfile() { baselineRule.collect("com.myapp") { startActivityAndWait() } } }
جاوا public class BaselineProfileGenerator { @Rule Public BaselineProfileRule baselineRule = new BaselineProfileRule(); @Test Public void startupBaselineProfile() { baselineRule.collect( "com.myapp", (scope -> { scope.startActivityAndWait(); Return Unit.INSTANCE; }) ) } }
فایل
build.gradle.kts
را در ماژول برنامه بهروزرسانی کنید، برای مثال:app
.- افزونه
androidx.baselineprofile
را اعمال کنید. - یک وابستگی
baselineProfile
به ماژول:baseline-profile
اضافه کنید.
کاتلین plugins { id("com.android.application") id("androidx.baselineprofile") } android { // There are no changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile(project(":baseline-profile")) }
شیار plugins { id 'com.android.application' id 'androidx.baselineprofile' } android { // No changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile ':baseline-profile' }
- افزونه
با اجرای وظایف
:app:generateBaselineProfile
یا:app:generate Variant BaselineProfile
Gradle نمایه را ایجاد کنید.در پایان کار تولید، نمایه خط پایه در
app/src/ variant /generated/baselineProfiles
کپی میشود.
امکان تولید نمایه های پایه با AGP 7.3-7.4 وجود دارد، اما ما قویاً توصیه می کنیم حداقل به AGP 8.1 ارتقا دهید تا بتوانید از افزونه Baseline Profile Gradle و آخرین ویژگی های آن استفاده کنید.
اگر نیاز به ایجاد نمایه های پایه با AGP 7.3-7.4 دارید، مراحل مشابه مراحل AGP 8.1 است، با استثنائات زیر:
- افزونه Baseline Profile Gradle را اضافه نکنید.
- برای تولید نمایههای پایه، وظیفه Gradle
./gradlew [emulator name][flavor][build type]AndroidTest
را اجرا کنید. به عنوان مثال،./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest
. - شما باید قوانین نمایه خط پایه ایجاد شده را به صورت دستی در کد خود اعمال کنید .
ژنراتور Baseline Profile یک فایل متنی با فرمت قابل خواندن توسط انسان (HRF) روی دستگاه ایجاد می کند و آن را در دستگاه میزبان شما کپی می کند. برای اعمال نمایه تولید شده در کد خود، این مراحل را دنبال کنید:
فایل HRF را در پوشه ساخت ماژولی که نمایه را در آن ایجاد میکنید، پیدا کنید:
[module]/build/outputs/managed_device_android_test_additional_output/[device]
.نمایهها از الگوی نامگذاری
[class name]-[test method name]-baseline-prof.txt
پیروی میکنند که به شکل زیر است:BaselineProfileGenerator-startup-baseline-prof.txt
.نمایه تولید شده را در
src/main/
کپی کنید و نام فایل را بهbaseline-prof.txt
تغییر دهید.یک وابستگی به کتابخانه ProfileInstaller در فایل
build.gradle.kts
برنامه خود اضافه کنید تا در جایی که نمایههای ابری در دسترس نیستند، کامپایل نمایه خط پایه محلی را فعال کنید. این تنها راه برای بارگذاری یک نمایه پایه به صورت محلی است.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.0") }
در حالی که قوانین HRF اعمال شده به شکل باینری کامپایل شده و در APK یا AAB گنجانده شده است، نسخه تولیدی برنامه خود را بسازید. سپس برنامه خود را طبق معمول توزیع کنید.
برای محک زدن نمایه خط پایه خود، یک پیکربندی جدید اجرای آزمایشی ابزاری Android از عمل ناودان ایجاد کنید که معیارهای تعریف شده در فایل StartupBenchmarks.kt
یا StartupBencharks.java
را اجرا می کند. برای کسب اطلاعات بیشتر در مورد تست معیار، به ایجاد کلاس Macrobenchmark و اندازهگیری خودکار با کتابخانه Macrobenchmark مراجعه کنید.
هنگامی که این را در Android Studio اجرا می کنید، خروجی ساخت شامل جزئیات بهبود سرعت است که نمایه Baseline ارائه می دهد:
StartupBenchmarks_startupCompilationBaselineProfiles timeToInitialDisplayMs min 161.8, median 178.9, max 194.6 StartupBenchmarks_startupCompilationNone timeToInitialDisplayMs min 184.7, median 196.9, max 202.9
دو معیار کلیدی برای اندازه گیری زمان راه اندازی اپلیکیشن به شرح زیر است:
- زمان تا نمایش اولیه (TTID)
- مدت زمانی که طول می کشد تا اولین فریم از رابط کاربری برنامه نمایش داده شود.
- زمان نمایش کامل (TTFD)
- TTID به اضافه زمان نمایش محتوایی که پس از نمایش فریم اولیه به صورت ناهمزمان بارگیری می شود.
پس از فراخوانی متد reportFullyDrawn()
ComponentActivity
، TTFD گزارش میشود. اگر reportFullyDrawn()
هرگز فراخوانی نشود، به جای آن TTID گزارش می شود. ممکن است لازم باشد هنگام reportFullyDrawn()
تا زمانی که بارگیری ناهمزمان کامل شود، به تاخیر بیاندازید. به عنوان مثال، اگر UI حاوی یک لیست پویا مانند RecyclerView
یا لیست تنبل باشد ، ممکن است لیست با یک کار پس زمینه پر شود که پس از اولین ترسیم لیست و بنابراین پس از علامت گذاری رابط کاربری به عنوان کاملاً رسم شده تکمیل می شود. در چنین مواردی، کدی که پس از رسیدن رابط کاربری به حالت کاملا ترسیم شده اجرا میشود، در نمایه خط پایه گنجانده نمیشود.
برای گنجاندن جمعیت لیست به عنوان بخشی از نمایه پایه خود، با استفاده از getFullyDrawnReporter()
FullyDrawnReporter
دریافت کنید و یک گزارشگر به آن در کد برنامه خود اضافه کنید. پس از تکمیل کار پسزمینه، گزارشگر را رها کنید. FullyDrawnReporter
متد reportFullyDrawn()
فراخوانی نمی کند تا زمانی که همه گزارشگران آزاد شوند. با انجام این کار، Baseline Profile شامل مسیرهای کد مورد نیاز برای پر کردن لیست می شود. این رفتار برنامه را برای کاربر تغییر نمیدهد، اما به نمایه خط پایه اجازه میدهد تمام مسیرهای کد لازم را شامل شود.
اگر برنامه شما از Jetpack Compose استفاده میکند، از APIهای زیر برای نشان دادن وضعیت کاملاً ترسیم شده استفاده کنید:
-
ReportDrawn
نشان می دهد که composable شما بلافاصله برای تعامل آماده است. -
ReportDrawnWhen
یک گزاره مانندlist.count > 0
را می گیرد تا نشان دهد که سازنده شما چه زمانی برای تعامل آماده است. -
ReportDrawnAfter
یک روش تعلیق را انتخاب می کند که وقتی کامل شد، نشان می دهد که composable شما برای تعامل آماده است.
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- معیارهای ماکرو بنچمارک را ضبط کنید
- یک ماکرو بنچمارک بنویسید
- کتابخانه JankStats