ایجاد پروفایل های پایه

با استفاده از کتابخانه Jetpack Macrobenchmark و BaselineProfileRule ، پروفایل‌ها را به‌طور خودکار برای هر نسخه برنامه ایجاد کنید. توصیه می‌کنیم از com.android.tools.build:gradle:8.0.0 یا بالاتر استفاده کنید، که در هنگام استفاده از نمایه‌های خط پایه، با پیشرفت‌های ساخت همراه است.

این مراحل کلی برای ایجاد یک نمایه پایه جدید است:

  1. ماژول Baseline Profile را تنظیم کنید.
  2. تست JUnit را تعریف کنید که به تولید پروفایل های پایه کمک می کند.
  3. سفرهای کاربر حیاتی (CUJ) را که می خواهید بهینه کنید اضافه کنید.
  4. نمایه خط پایه را ایجاد کنید.

پس از ایجاد نمایه خط پایه، آن را با استفاده از یک دستگاه فیزیکی برای اندازه گیری بهبود سرعت محک بزنید.

یک نمایه پایه جدید با AGP 8.2 یا بالاتر ایجاد کنید

ساده ترین راه برای ایجاد یک نمایه پایه جدید، استفاده از الگوی ماژول نمایه پایه است که با شروع Android Studio Iguana و افزونه Android Gradle (AGP) 8.2 در دسترس است.

الگوی ماژول Baseline Profile Generator Android Studio ایجاد یک ماژول جدید را برای تولید و محک گذاری نمایه های خط پایه به صورت خودکار انجام می دهد. اجرای الگو بیشتر پیکربندی ساخت، تولید نمایه خط پایه و کد تأیید را ایجاد می کند. این الگو کدی را برای تولید و محک زدن نمایه‌های خط پایه برای اندازه‌گیری راه‌اندازی برنامه ایجاد می‌کند.

ماژول Baseline Profile را تنظیم کنید

برای اجرای قالب ماژول Baseline Profile، مراحل زیر را دنبال کنید:

  1. File > New > New Module را انتخاب کنید
  2. قالب Baseline Profile Generator را در پانل Templates انتخاب کرده و آن را پیکربندی کنید:
    شکل 1. الگوی ماژول ژنراتور پروفایل پایه.

    فیلدهای قالب به شرح زیر است:

    • برنامه هدف : مشخص می کند که نمایه خط پایه برای کدام برنامه تولید می شود. وقتی فقط یک ماژول اپلیکیشن در پروژه خود دارید، تنها یک مورد در این لیست وجود دارد.
    • نام ماژول : نامی که برای ماژول Baseline Profile در حال ایجاد می‌خواهید.
    • نام بسته : نام بسته ای که برای ماژول Baseline Profile می خواهید.
    • زبان : چه بخواهید کد تولید شده Kotlin یا Java باشد.
    • زبان پیکربندی ساخت : چه بخواهید از Kotlin Script (KTS) یا Groovy برای اسکریپت های پیکربندی ساخت خود استفاده کنید.
    • از دستگاه با مدیریت Gradle استفاده کنید : آیا از دستگاه های مدیریت شده Gradle برای آزمایش برنامه خود استفاده می کنید.
  3. روی Finish کلیک کنید و ماژول جدید ایجاد می شود. اگر از کنترل منبع استفاده می کنید، ممکن است از شما خواسته شود که فایل های ماژول جدید ایجاد شده را به کنترل منبع اضافه کنید.

ژنراتور Baseline Profile را تعریف کنید

ماژول جدید ایجاد شده شامل تست هایی برای تولید و محک زدن نمایه خط پایه و آزمایش راه اندازی برنامه اولیه است. توصیه می‌کنیم این موارد را تقویت کنید تا شامل CUJ و گردش کار راه‌اندازی پیشرفته باشد. اطمینان حاصل کنید که تست‌های مربوط به راه‌اندازی برنامه در یک بلوک rule قرار دارند و includeInStartupProfile روی true تنظیم شده است. برعکس، برای عملکرد بهینه، مطمئن شوید که تست‌هایی که مربوط به راه‌اندازی برنامه نیستند در نمایه راه‌اندازی گنجانده نشده است. بهینه‌سازی‌های راه‌اندازی برنامه برای تعریف بخش خاصی از نمایه خط پایه به نام نمایه راه‌اندازی استفاده می‌شوند.

اگر این CUJها را خارج از نمایه خط پایه تولید شده و کد محک انتزاعی کنید، به قابلیت نگهداری کمک می کند تا بتوان برای هر دو مورد استفاده قرار داد. این بدان معنی است که تغییرات در CUJ های شما به طور مداوم استفاده می شود.

نمایه Baseline را ایجاد و نصب کنید

الگوی ماژول Baseline Profile یک پیکربندی اجرای جدید برای ایجاد نمایه خط پایه اضافه می کند. اگر از طعم‌های محصول استفاده می‌کنید، Android Studio پیکربندی‌های اجرای چندگانه ایجاد می‌کند تا بتوانید پروفایل‌های پایه جداگانه برای هر طعم ایجاد کنید.

پیکربندی اجرای Generate Baseline Profile.
شکل 2. اجرای این پیکربندی نمایه خط پایه را ایجاد می کند.

هنگامی که پیکربندی اجرای 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 ایجاد می‌شود. احتمالاً مجبور نخواهید بود مستقیماً با این نسخه از نمایه خط پایه تولید شده تعامل داشته باشید، مگر اینکه به صورت دستی آن را در ماژول های هدف کپی کنید (توصیه نمی شود).

یک نمایه پایه جدید با AGP 8.1 ایجاد کنید

اگر نمی‌توانید از الگوی ماژول نمایه پایه استفاده کنید، از الگوی ماژول Macrobenchmark و افزونه Baseline Profile Gradle برای ایجاد یک نمایه پایه جدید استفاده کنید. توصیه می کنیم از این ابزارها با Android Studio Giraffe و AGP 8.1 استفاده کنید.

در اینجا مراحل ایجاد یک نمایه پایه جدید با استفاده از الگوی ماژول Macrobenchmark و افزونه Baseline Profile Gradle آمده است:

  1. یک ماژول Macrobenchmark را در پروژه Gradle خود راه اندازی کنید .
  2. یک کلاس جدید به نام BaselineProfileGenerator تعریف کنید:
    class BaselineProfileGenerator {
        @get:Rule
        val baselineProfileRule = BaselineProfileRule()
    
        @Test
        fun startup() = baselineProfileRule.collect(
            packageName = "com.example.app",
            profileBlock = {
                startActivityAndWait()
            }
        )
    }

    مولد می‌تواند شامل تعاملاتی با برنامه شما فراتر از راه‌اندازی برنامه باشد. این به شما امکان می‌دهد عملکرد زمان اجرا برنامه خود را بهینه کنید، مانند پیمایش لیست‌ها، اجرای انیمیشن‌ها و پیمایش در یک Activity . نمونه‌های دیگری از آزمایش‌هایی را ببینید که از @BaselineProfileRule برای بهبود سفرهای حیاتی کاربر استفاده می‌کنند.

  3. افزونه Baseline Profile Gradle را اضافه کنید ( libs.plugins.androidx.baselineprofile ). این افزونه تولید پروفایل های پایه و نگهداری آنها را در آینده آسان تر می کند.

  4. برای ایجاد نمایه خط پایه، وظایف :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 به طور مستقیم آورده شده است:

  1. یک ماژول com.android.test جدید ایجاد کنید—مثلاً :baseline-profile .
  2. فایل build.gradle.kts را برای :baseline-profile پیکربندی کنید:

    1. افزونه androidx.baselineprofile را اعمال کنید.
    2. اطمینان حاصل کنید که targetProjectPath به ماژول :app اشاره می کند.
    3. به صورت اختیاری، یک دستگاه با مدیریت Gradle (GMD) اضافه کنید. در مثال زیر، pixel6Api31 است. اگر مشخص نشده باشد، افزونه از یک دستگاه متصل، شبیه سازی شده یا فیزیکی استفاده می کند.
    4. همانطور که در مثال زیر نشان داده شده است، پیکربندی مورد نظر خود را اعمال کنید.

    کاتلین

    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
    }
  3. یک تست 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;
                })
            )
        }
    }
  4. فایل build.gradle.kts را در ماژول برنامه به‌روزرسانی کنید، برای مثال :app .

    1. افزونه androidx.baselineprofile را اعمال کنید.
    2. یک وابستگی 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'
    }
  5. با اجرای وظایف :app:generateBaselineProfile یا :app:generate Variant BaselineProfile Gradle نمایه را ایجاد کنید.

  6. در پایان کار تولید، نمایه خط پایه در app/src/ variant /generated/baselineProfiles کپی می‌شود.

یک نمایه پایه جدید با AGP 7.3-7.4 ایجاد کنید

امکان تولید نمایه های پایه با AGP 7.3-7.4 وجود دارد، اما ما قویاً توصیه می کنیم حداقل به AGP 8.1 ارتقا دهید تا بتوانید از افزونه Baseline Profile Gradle و آخرین ویژگی های آن استفاده کنید.

اگر نیاز به ایجاد نمایه های پایه با AGP 7.3-7.4 دارید، مراحل مشابه مراحل AGP 8.1 است، با استثنائات زیر:

قوانین ایجاد شده را به صورت دستی اعمال کنید

ژنراتور Baseline Profile یک فایل متنی با فرمت قابل خواندن توسط انسان (HRF) روی دستگاه ایجاد می کند و آن را در دستگاه میزبان شما کپی می کند. برای اعمال نمایه تولید شده در کد خود، این مراحل را دنبال کنید:

  1. فایل HRF را در پوشه ساخت ماژولی که نمایه را در آن ایجاد می‌کنید، پیدا کنید: [module]/build/outputs/managed_device_android_test_additional_output/[device] .

    نمایه‌ها از الگوی نام‌گذاری [class name]-[test method name]-baseline-prof.txt پیروی می‌کنند که به شکل زیر است: BaselineProfileGenerator-startup-baseline-prof.txt .

  2. نمایه تولید شده را در src/main/ کپی کنید و نام فایل را به baseline-prof.txt تغییر دهید.

  3. یک وابستگی به کتابخانه ProfileInstaller در فایل build.gradle.kts برنامه خود اضافه کنید تا در جایی که نمایه‌های ابری در دسترس نیستند، کامپایل نمایه خط پایه محلی را فعال کنید. این تنها راه برای بارگذاری یک نمایه پایه به صورت محلی است.

    dependencies {
         implementation("androidx.profileinstaller:profileinstaller:1.4.1")
    }
    
  4. در حالی که قوانین HRF اعمال شده به شکل باینری کامپایل شده و در APK یا AAB گنجانده شده است، نسخه تولیدی برنامه خود را بسازید. سپس برنامه خود را طبق معمول توزیع کنید.

نمایه خط پایه را محک بزنید

برای محک زدن نمایه خط پایه خود، یک پیکربندی جدید اجرای آزمایشی ابزاری Android از عمل ناودان ایجاد کنید که معیارهای تعریف شده در فایل StartupBenchmarks.kt یا StartupBencharks.java را اجرا می کند. برای کسب اطلاعات بیشتر در مورد تست معیار، به ایجاد کلاس Macrobenchmark و اندازه‌گیری خودکار با کتابخانه Macrobenchmark مراجعه کنید.

شکل 3. تست های اندروید را از اکشن ناودان اجرا کنید.

هنگامی که این را در 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 شما برای تعامل آماده است.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}