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

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

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

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

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

إنشاء ملف تعريف أساسي جديد باستخدام AGP 8.2 أو إصدار أحدث

إنّ أسهل طريقة لإنشاء ملف شخصي جديد للقاعدة الأساسية هي استخدام نموذج ملف القاعدة الأساسية للوحدة، وهو متاح اعتبارًا من الإصدار 8.2 من Android Studio Iguana وAndroid Gradle Plugin (AGP).

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

إعداد وحدة "الملف الشخصي الأساسي"

لتنفيذ نموذج وحدة الملف الشخصي الأساسي، اتّبِع الخطوات التالية:

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

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

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

تحديد أداة إنشاء الملف الشخصي للمرجع

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

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

إنشاء الملف الشخصي الأساسي وتثبيته

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

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

إنشاء ملف تعريف أساسي جديد باستخدام AGP 8.1

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

في ما يلي خطوات إنشاء ملف قياس أداء أساسي جديد باستخدام نموذج ملف قياس أداء برمجي ضخم وإضافات 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.

إنشاء ملف نموذجي جديد بدون استخدام النماذج

ننصحك بإنشاء ملف تعريف أساسي باستخدام IDE لنظام التشغيل Android نموذج وحدة الملف الشخصي الأساسي (الخيار المفضّل) أو نموذج اختبار الأداء على مستوى النظام، ولكن يمكنك أيضًا استخدام المكوّن الإضافي 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 baselineRule = BaselineProfileRule()
    
        @Test
        fun startupBaselineProfile() {
            baselineRule.collect("com.myapp") {
                startActivityAndWait()
            }
        }
    }

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

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

إنشاء ملف تعريف أساسي جديد باستخدام AGP 7.3-7.4

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

إذا كنت بحاجة إلى إنشاء ملفات تعريف أساسية باستخدام AGP 7.3 أو 7.4، تكون الخطوات مماثلة لخطوات AGP 8.1، مع استثناءات التالية:

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

ينشئ أداة إنشاء الملف الشخصي الأساسي ملفًا نصيًا بتنسيق 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 الخاص بتطبيقك لتفعيل عملية compiling لملف Baseline Profile الخاص بالتطبيق في حال عدم توفّر ملفات Cloud Profiles. هذه هي الطريقة الوحيدة لتحميل ملف "الملف الشخصي للمرجع" على الجهاز بدون ربطه بحساب على Google.

    dependencies {
         implementation("androidx.profileinstaller:profileinstaller:1.4.1")
    }
    
  4. أنشئ إصدار تطبيقك العلني أثناء compiling قواعد HRF المطبَّقة في شكل ثنائي وتضمينها في حزمة APK أو حزمة AAB. بعد ذلك، يمكنك توزيع تطبيقك كالمعتاد.

قياس أداء الملف الشخصي الأساسي

لقياس أداء الملف الشخصي الأساسي، أنشئ ملف إعدادات جديدًا لتشغيل اختبار Android باستخدام الأدوات من إجراء الفاصل الزمني الذي ينفذ مقاييس الأداء المحدّدة فيملفStartupBenchmarks.kt أو StartupBencharks.java. للاطّلاع على مزيد من المعلومات عن اختبار قياس الأداء، اطّلِع على مقالتَي إنشاء فئة قياس أداء إجمالي وتبسيط عملية القياس باستخدام مكتبة قياس الأداء الإجمالي.

الشكل 3. يمكنك إجراء اختبارات Android من مربّع التنقّل.

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

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

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

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

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

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