إنشاء ملفات شخصية أساسية

يمكنك إنشاء ملفات شخصية تلقائيًا لكل إصدار من التطبيق باستخدام مكتبة Jetpack Macrobenchmark و BaselineProfileRule. ننصحك باستخدام com.android.tools.build:gradle:8.0.0 أو إصدار أحدث، الذي يتضمّن تحسينات على عملية التصميم عند استخدام "الملفات الشخصية للمرجع".

في ما يلي الخطوات العامة لإنشاء "ملف شخصي للمرجع" جديد:

  1. إعداد وحدة "الملف الشخصي للمرجع"
  2. تحديد اختبار JUnit الذي يساعد في إنشاء "الملفات الشخصية للمرجع"
  3. إضافة رحلات المستخدمين الأساسية (CUJ) التي تريد تحسينها
  4. إنشاء "الملف الشخصي للمرجع"

بعد إنشاء "الملف الشخصي للمرجع"، يمكنك قياس أدائه باستخدام جهاز فعلي لقياس التحسينات في السرعة.

إنشاء "ملف شخصي للمرجع" جديد باستخدام الإصدار 8.2 من "مكوّن Android الإضافي لبرنامج Gradle" أو إصدار أحدث

أسهل طريقة لإنشاء "الملف الشخصي للمرجع" جديد هي استخدام نموذج وحدة "الملف الشخصي للمرجع"، الذي يتوفّر بدءًا من استوديو Android Iguana والإصدار 8.2 من "مكوّن إضافي لنظام Gradle المتوافق مع Android".

يعمل نموذج وحدة "منشئ الملفات الشخصية للمرجع" في استوديو Android على أتمتة عملية إنشاء وحدة جديدة لإنشاء و قياس أداء "الملفات الشخصية للمرجع". عند تشغيل النموذج، يتم إنشاء معظم رموز إعدادات التصميم النموذجية وإنشاء "الملف الشخصي للمرجع" والتحقّق منه. ينشئ النموذج رموزًا لإنشاء "الملفات الشخصية للمرجع" وقياس أدائها لقياس وقت بدء تشغيل التطبيق.

إعداد وحدة "الملف الشخصي للمرجع"

لتشغيل نموذج وحدة "منشئ الملفات الشخصية للمرجع"، اتّبِع الخطوات التالية:

  1. انقر على ملف > جديد > وحدة جديدة
  2. اختَر نموذج منشئ الملفات الشخصية للمرجع في لوحة النماذج واضبطه:
    الشكل 1. نموذج وحدة "منشئ الملفات الشخصية للمرجع"

    في ما يلي الحقول في النموذج:

    • التطبيق المستهدَف: يحدّد التطبيق الذي يتم إنشاء "الملف الشخصي للمرجع" له. إذا كان لديك وحدة تطبيق واحدة فقط في مشروعك، لن يظهر في هذه القائمة سوى عنصر واحد.
    • اسم الوحدة: الاسم الذي تريده لوحدة "الملف الشخصي للمرجع" التي يتم إنشاؤها
    • اسم الحزمة: اسم الحزمة الذي تريده لوحدة "الملف الشخصي للمرجع"
    • اللغة: ما إذا كنت تريد أن تكون الرموز البرمجية التي تم إنشاؤها بلغة Kotlin أو Java.
    • لغة إعدادات التصميم: ما إذا كنت تريد استخدام Kotlin Script (KTS) أو Groovy لبرامج إعدادات التصميم
    • استخدام جهاز مُدار من Gradle: إذا كنت تستخدم أجهزة مُدارة من Gradle لاختبار تطبيقك.
  3. انقر على إنهاء وسيتم إنشاء الوحدة الجديدة. إذا كنت تستخدم نظام التحكّم بالمصادر ، قد يُطلب منك إضافة ملفات الوحدة التي تم إنشاؤها حديثًا إلى نظام التحكّم بالمصادر.

تحديد منشئ "الملف الشخصي للمرجع"

تحتوي الوحدة التي تم إنشاؤها حديثًا على اختبارات لإنشاء "الملف الشخصي للمرجع" وقياس أدائه واختبار بدء تشغيل التطبيق الأساسي فقط. ننصحك بتوسيع نطاق هذه الاختبارات لتشمل رحلات المستخدمين الأساسية وسير عمل بدء التشغيل المتقدّم. تأكَّد من أنّ أي اختبارات ذات صلة ببدء تشغيل التطبيق موجودة في كتلة rule مع ضبط includeInStartupProfile على true، وعلى العكس من ذلك، لضمان الأداء الأمثل، تأكَّد من عدم تضمين أي اختبارات غير ذات صلة ببدء تشغيل التطبيق في "ملف بدء التشغيل". تُستخدم عمليات تحسين بدء تشغيل التطبيق لتحديد جزء خاص من "الملف الشخصي للمرجع" يُعرف باسم "ملف بدء التشغيل".

يساعد في الحفاظ على إمكانية الصيانة إذا قمت بتجريد رحلات المستخدمين الأساسية هذه خارج "الملف الشخصي للمرجع" الذي تم إنشاؤه ورمز قياس الأداء حتى يمكن استخدامها لكليهما. وهذا يعني أنّ التغييرات التي يتم إجراؤها على رحلات المستخدمين الأساسية تُستخدم بشكل متّسق.

إنشاء "الملف الشخصي للمرجع" وتثبيته

يضيف نموذج وحدة "الملف الشخصي للمرجع" إعدادًا جديدًا للتشغيل لإنشاء "الملف الشخصي للمرجع". إذا كنت تستخدم نُسخ المنتجات، ينشئ "استوديو Android" إعدادات تشغيل متعدّدة حتى تتمكّن من إنشاء "ملفات شخصية للمرجع" منفصلة لكل نُسخة.

إعدادات التشغيل لإنشاء ملف Baseline Profile
الشكل 2. يؤدي تشغيل هذا الإعداد إلى إنشاء "الملف الشخصي للمرجع" .

عند اكتمال إعداد التشغيل إنشاء "الملف الشخصي للمرجع"، يتم نسخ "الملف الشخصي للمرجع" الذي تم إنشاؤه إلى 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. من المحتمل ألا تضطر إلى التفاعل مع هذا الإصدار من "الملف الشخصي للمرجع" الذي تم إنشاؤه مباشرةً ما لم تكن تنسخه يدويًا إلى الوحدات المستهدَفة (لا يُنصح بذلك).

إنشاء "ملف شخصي للمرجع" جديد باستخدام الإصدار 8.1 من "مكوّن Android الإضافي لبرنامج Gradle"

إذا لم تتمكّن من استخدام نموذج وحدة "الملف الشخصي للمرجع"، استخدِم نموذج وحدة Macrobenchmark والمكوّن الإضافي لبرنامج Gradle الخاص بـ "الملف الشخصي للمرجع" لإنشاء "ملف شخصي للمرجع" جديد. ننصحك باستخدام هذه الأدوات بدءًا من Android Studio Giraffe والإصدار 8.1 من "مكوّن Android الإضافي لبرنامج Gradle".

في ما يلي خطوات إنشاء "ملف شخصي للمرجع" جديد باستخدام نموذج وحدة Macrobenchmark والمكوّن الإضافي لبرنامج 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. أضِف المكوّن الإضافي لبرنامج Gradle الخاص بـ "الملف الشخصي للمرجع" (libs.plugins.androidx.baselineprofile). يسهّل المكوّن الإضافي إنشاء "الملفات الشخصية للمرجع" والحفاظ عليها في المستقبل.

  4. لإنشاء "الملف الشخصي للمرجع"، شغِّل مهام Gradle‏ :app:generateBaselineProfile أو :app:generateVariantBaselineProfile في المحطة الطرفية.

    شغِّل المنشئ كاختبار مُجهز على جهاز فعلي أو محاكي أو جهاز مُدار من Gradle تم عمل روت له. إذا كنت تستخدم جهازًا مُدارًا من Gradle، اضبط aosp كـ systemImageSource، لأنّك تحتاج إلى إذن الوصول إلى الروت لمنشئ "الملف الشخصي للمرجع".

    في نهاية مهمة الإنشاء، يتم نسخ "الملف الشخصي للمرجع" إلى app/src/variant/generated/baselineProfiles.

إنشاء "ملف شخصي للمرجع" جديد بدون نماذج

ننصحك بإنشاء "الملف الشخصي للمرجع" باستخدام نموذج وحدة "الملف الشخصي للمرجع" في استوديو Android (الخيار المفضّل) أو نموذج Macrobenchmark، ولكن يمكنك أيضًا استخدام المكوّن الإضافي لبرنامج Gradle الخاص بـ "الملف الشخصي للمرجع" بمفرده. لمزيد من المعلومات عن المكوّن الإضافي لبرنامج Gradle الخاص بـ "الملف الشخصي للمرجع" ، اطّلِع على مقالة ضبط عملية إنشاء "الملف الشخصي للمرجع".

في ما يلي كيفية إنشاء "ملف شخصي للمرجع" باستخدام المكوّن الإضافي لبرنامج Gradle الخاص بـ "الملف الشخصي للمرجع" مباشرةً:

  1. أنشئ وحدة com.android.test جديدة، على سبيل المثال، :baseline-profile.
  2. اضبط الملف build.gradle.kts للوحدة :baseline-profile:

    1. طبِّق المكوّن الإضافي androidx.baselineprofile.
    2. تأكَّد من أنّ targetProjectPath يشير إلى الوحدة :app.
    3. يمكنك اختياريًا إضافة جهاز مُدار من Gradle (GMD). في المثال التالي، يكون pixel6Api31. إذا لم يتم تحديد ذلك، يستخدم المكوّن الإضافي جهازًا متصلاً، سواء كان محاكيًا أو فعليًا.
    4. طبِّق الإعداد الذي تريده، كما هو موضّح في المثال التالي.

    Kotlin

    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. المثال التالي هو اختبار ينشئ "ملفًا شخصيًا للمرجع" لبدء تشغيل التطبيق.

    Kotlin

    class BaselineProfileGenerator {
    @get:Rule
    val baselineProfileRule = BaselineProfileRule()
    
    @Test
    fun startup() = baselineProfileRule.collect(
        packageName = "com.example.app",
        profileBlock = {
            uiAutomator { startApp(PACKAGE_NAME) }
        }
    )
    }

    Java

    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.

    Kotlin

    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. أنشئ الملف الشخصي عن طريق تشغيل مهام Gradle‏ :app:generateBaselineProfile أو :app:generateVariantBaselineProfile.

  6. في نهاية مهمة الإنشاء، يتم نسخ "الملف الشخصي للمرجع" إلى app/src/variant/generated/baselineProfiles.

إنشاء "ملف شخصي للمرجع" جديد باستخدام الإصدار 7.3-7.4 من "مكوّن Android الإضافي لبرنامج Gradle"

يمكنك إنشاء "الملفات الشخصية للمرجع" باستخدام الإصدار 7.3-7.4 من "مكوّن Android الإضافي لبرنامج Gradle"، ولكن ننصحك بشدة بالترقية إلى الإصدار 8.1 على الأقل من "مكوّن Android الإضافي لبرنامج Gradle" حتى تتمكّن من استخدام المكوّن الإضافي لبرنامج Gradle الخاص بـ "الملف الشخصي للمرجع" وأحدث ميزاته.

إذا كنت بحاجة إلى إنشاء "الملفات الشخصية للمرجع" باستخدام الإصدار 7.3-7.4 من "مكوّن Android الإضافي لبرنامج Gradle"، تكون الخطوات هي نفسها خطوات الإصدار 8.1 من "مكوّن Android الإضافي لبرنامج Gradle"، باستثناء ما يلي:

تطبيق القواعد التي تم إنشاؤها يدويًا

ينشئ منشئ "الملف الشخصي للمرجع" ملفًا نصيًا بتنسيق قابل للقراءة من قِبل الإنسان (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 من إجراء الحاشية.

عند تشغيل هذا الإعداد في "استوديو Android"، يحتوي ناتج التصميم على تفاصيل التحسينات في السرعة التي يوفّرها "الملف الشخصي للمرجع":

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)
الوقت المستغرَق للعرض الأولي بالإضافة إلى الوقت المستغرَق لعرض المحتوى الذي يتم تحميله بشكل غير متزامن بعد عرض الإطار الأولي

يتم الإبلاغ عن TTFD بعد استدعاء الـ reportFullyDrawn() في الـ ComponentActivity. إذا لم يتم استدعاء reportFullyDrawn() مطلقًا، يتم الإبلاغ عن TTID بدلاً من ذلك. قد تحتاج إلى تأخير وقت استدعاء reportFullyDrawn() إلى ما بعد اكتمال التحميل غير المتزامن. على سبيل المثال، إذا كانت واجهة المستخدم تحتوي على قائمة ديناميكية مثل RecyclerView أو قائمة مؤجّلة، قد يتم ملء القائمة من خلال مهمة في الخلفية تكتمل بعد رسم القائمة أولاً، وبالتالي بعد وضع علامة على واجهة المستخدم بأنّها مكتملة الرسم. في مثل هذه الحالات، لا يتم تضمين الرموز البرمجية التي يتم تشغيلها بعد أن تصل واجهة المستخدم إلى حالة الرسم الكامل في "الملف الشخصي للمرجع".

لتضمين ملء القائمة كجزء من "الملف الشخصي للمرجع"، احصل على FullyDrawnReporter باستخدام getFullyDrawnReporter() وأضِف أداة إعداد تقارير إليها في رموز تطبيقك. حرِّر أداة إعداد التقارير بعد أن تنتهي المهمة في الخلفية من ملء القائمة. لا تستدعي FullyDrawnReporter الطريقة reportFullyDrawn() إلى أن يتم تحرير جميع أدوات إعداد التقارير. من خلال إجراء ذلك، يتضمّن "الملف الشخصي للمرجع" مسارات الرموز البرمجية المطلوبة لملء القائمة. لا يؤدي ذلك إلى تغيير سلوك التطبيق بالنسبة إلى المستخدم، ولكنّه يسمح لـ "الملف الشخصي للمرجع" بتضمين جميع مسارات الرموز البرمجية الضرورية.

إذا كان تطبيقك يستخدم Jetpack Compose، استخدِم واجهات برمجة التطبيقات التالية للإشارة إلى حالة الرسم الكامل:

  • ReportDrawn يشير إلى أنّ العنصر المركّب جاهز على الفور للتفاعل.
  • ReportDrawnWhen يأخذ دالة منطقية، مثل list.count > 0، للإشارة إلى وقت استعداد العنصر المركّب للتفاعل.
  • ReportDrawnAfter يأخذ طريقة تعليق تشغيل تشير، عند اكتمالها، إلى أنّ العنصر المركّب جاهز للتفاعل.