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

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

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

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

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

أنشِئ ملفًا شخصيًا أساسيًا جديدًا يتضمّن AGP 8.2 أو إصدارًا أحدث.

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

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

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

لتشغيل قالب وحدة الملف الشخصي الأساسي، اتبع الخطوات التالية:

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

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

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

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

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

تساعد هذه الطريقة في الحفاظ على المستخدمين، إذا استخرَجت بيانات رحلة المستخدم الأساسية (CUJ) هذه خارج الملف الشخصي للمرجع الذي تم إنشاؤه ورمز قياس الأداء حتى يمكن استخدامها في كليهما. هذا يعني أنه يتم استخدام التغييرات على CUJs باستمرار.

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

يضيف نموذج وحدة الملف الشخصي الأساسي إعدادات تشغيل جديدة لإنشاء الملف الشخصي الأساسي. إذا كنت تستخدم نكهات المنتجات، سينشئ "استوديو 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 والإصدار 8.1 من AGP.

في ما يلي الخطوات التي يجب اتّباعها لإنشاء ملف شخصي جديد على مستوى الخطة الأساسية باستخدام نموذج وحدة قياس الأداء الإضافي والمكوّن الإضافي Baseline Profile Gradle:

  1. إعداد وحدة لقياس الأداء الفائق في مشروع 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. لإنشاء الملف الشخصي الأساسي، شغِّل مهام Gradle :app:generateBaselineProfile أو :app:generateVariantBaselineProfile في المحطة الطرفية.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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