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

يعرض هذا المستند أفضل الممارسات للمساعدة في تشخيص المشاكل والتأكّد من عمل ملفاتك الشخصية الأساسية بشكل صحيح لتوفير أكبر فائدة.

مشاكل الإصدار

إذا نسخت مثال الملفات الشخصية الأساسية في نموذج تطبيق Now in Android، قد تواجه إخفاقات في الاختبار أثناء مهمة "الملف الشخصي الأساسي" تشير إلى أنه لا يمكن إجراء الاختبارات على محاكي:

./gradlew assembleDemoRelease
Starting a Gradle Daemon (subsequent builds will be faster)
Calculating task graph as no configuration cache is available for tasks: assembleDemoRelease
Type-safe project accessors is an incubating feature.

> Task :benchmarks:pixel6Api33DemoNonMinifiedReleaseAndroidTest
Starting 14 tests on pixel6Api33

com.google.samples.apps.nowinandroid.foryou.ScrollForYouFeedBenchmark > scrollFeedCompilationNone[pixel6Api33] FAILED
        java.lang.AssertionError: ERRORS (not suppressed): EMULATOR
        WARNINGS (suppressed):
        ...

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

installDemoRelease -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile

يمكنك بدلاً من ذلك إنشاء إعدادات تشغيل مخصّصة في "استوديو Android" لتفعيل الملفات الشخصية الأساسية على أدوات المحاكاة من خلال اختيار تشغيل > تعديل عمليات الضبط:

إضافة إعدادات تشغيل مخصّصة لإنشاء الملفات الشخصية الأساسية في Now في Android
الشكل 1. أضِف إعدادات تشغيل مخصّصة لإنشاء الملفات الشخصية الأساسية في Now في Android.

مشاكل التثبيت

يُرجى التأكّد من أنّ حزمة APK أو تنسيق AAB الذي تنشئه هو صيغة إصدار تتضمّن الملفات الشخصية المرجعية. الطريقة الأسهل للتحقق من ذلك هي من خلال فتح APK في "استوديو Android" من خلال اختيار إنشاء > تحليل APK، وفتح APK، والبحث عن الملف الشخصي في ملف /assets/dexopt/baseline.prof.

البحث عن ملف شخصي أساسي باستخدام APK Viewer في "استوديو Android"
الشكل 2. ابحث عن ملف شخصي أساسي باستخدام "عارض APK" في "استوديو Android".

يجب تجميع الملفات الشخصية الأساسية على الجهاز الذي يتم تشغيل التطبيق عليه. وبالنسبة إلى عمليات التثبيت في متجر التطبيقات والتطبيقات التي تم تثبيتها باستخدام PackageInstaller، يتم تجميع البيانات على الجهاز فقط كجزء من عملية تثبيت التطبيقات. ومع ذلك، عند تثبيت التطبيق من "استوديو Android" من مصدر غير معروف أو عند استخدام أدوات سطر الأوامر، تكون مكتبة Jetpack ProfileInstaller مسؤولة عن إدراج الملفات الشخصية في قائمة انتظار التجميع أثناء عملية تحسين DEX التالية في الخلفية. في هذه الحالات، إذا أردت التأكّد من استخدام ملفاتك الشخصية المرجعية، قد تحتاج إلى فرض تجميع ملفات شخصية أساسية. يتيح لك ProfileVerifier الاستعلام عن حالة تثبيت الملف الشخصي وتجميعه، كما هو موضّح في المثال التالي:

Kotlin

private const val TAG = "MainActivity"

class MainActivity : ComponentActivity() {
  ...
  override fun onResume() {
    super.onResume()
    lifecycleScope.launch {
      logCompilationStatus()
    }
  }

  private suspend fun logCompilationStatus() {
     withContext(Dispatchers.IO) {
        val status = ProfileVerifier.getCompilationStatusAsync().await()
        when (status.profileInstallResultCode) {
            RESULT_CODE_NO_PROFILE ->
                Log.d(TAG, "ProfileInstaller: Baseline Profile not found")
            RESULT_CODE_COMPILED_WITH_PROFILE ->
                Log.d(TAG, "ProfileInstaller: Compiled with profile")
            RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION ->
                Log.d(TAG, "ProfileInstaller: Enqueued for compilation")
            RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING ->
                Log.d(TAG, "ProfileInstaller: App was installed through Play store")
            RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST ->
                Log.d(TAG, "ProfileInstaller: PackageName not found")
            RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ ->
                Log.d(TAG, "ProfileInstaller: Cache file exists but cannot be read")
            RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE ->
                Log.d(TAG, "ProfileInstaller: Can't write cache file")
            RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION ->
                Log.d(TAG, "ProfileInstaller: Enqueued for compilation")
            else ->
                Log.d(TAG, "ProfileInstaller: Profile not compiled or enqueued")
        }
    }
}

Java


public class MainActivity extends ComponentActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onResume() {
        super.onResume();

        logCompilationStatus();
    }

    private void logCompilationStatus() {
         ListeningExecutorService service = MoreExecutors.listeningDecorator(
                Executors.newSingleThreadExecutor());
        ListenableFuture<ProfileVerifier.CompilationStatus> future =
                ProfileVerifier.getCompilationStatusAsync();
        Futures.addCallback(future, new FutureCallback<>() {
            @Override
            public void onSuccess(CompilationStatus result) {
                int resultCode = result.getProfileInstallResultCode();
                if (resultCode == RESULT_CODE_NO_PROFILE) {
                    Log.d(TAG, "ProfileInstaller: Baseline Profile not found");
                } else if (resultCode == RESULT_CODE_COMPILED_WITH_PROFILE) {
                    Log.d(TAG, "ProfileInstaller: Compiled with profile");
                } else if (resultCode == RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION) {
                    Log.d(TAG, "ProfileInstaller: Enqueued for compilation");
                } else if (resultCode == RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING) {
                    Log.d(TAG, "ProfileInstaller: App was installed through Play store");
                } else if (resultCode == RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST) {
                    Log.d(TAG, "ProfileInstaller: PackageName not found");
                } else if (resultCode == RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ) {
                    Log.d(TAG, "ProfileInstaller: Cache file exists but cannot be read");
                } else if (resultCode
                        == RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE) {
                    Log.d(TAG, "ProfileInstaller: Can't write cache file");
                } else if (resultCode == RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION) {
                    Log.d(TAG, "ProfileInstaller: Enqueued for compilation");
                } else {
                    Log.d(TAG, "ProfileInstaller: Profile not compiled or enqueued");
                }
            }

            @Override
            public void onFailure(Throwable t) {
                Log.d(TAG,
                        "ProfileInstaller: Error getting installation status: " + t.getMessage());
            }
        }, service);
    }
}

تقدم رموز النتائج التالية تلميحات عن سبب بعض المشاكل:

RESULT_CODE_COMPILED_WITH_PROFILE
يتم تثبيت الملف الشخصي وتجميعه واستخدامه عند تشغيل التطبيق. هذه هي النتيجة التي تريد رؤيتها.
RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED
لم يتم العثور على أي ملف شخصي في حزمة APK أو تنسيق AAB قيد التشغيل. إذا ظهر لك هذا الخطأ، تأكّد من استخدام صيغة إصدار تتضمّن الملفات الشخصية الأساسية، ومن أنّ حزمة APK تحتوي على ملف شخصي.
RESULT_CODE_NO_PROFILE
لم يتم تثبيت أي ملف شخصي لهذا التطبيق عند تثبيته من خلال متجر التطبيقات أو مدير الحزم. السبب الرئيسي لظهور رمز الخطأ هو أن أداة تثبيت الملف الشخصي لم يتم تشغيلها بسبب إيقاف ProfileInstallerInitializer. يُرجى ملاحظة أنّه عند الإبلاغ عن هذا الخطأ، تم العثور على ملف شخصي مضمّن في حزمة APK للتطبيق. في حال عدم العثور على ملف شخصي مضمّن، يكون رمز الخطأ الذي يتم عرضه هو RESULT_CODE_ERROR_NO_PROFILE_EMBEDDED.
RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION
يمكن العثور على الملف الشخصي في حزمة APK أو تنسيق AAB ويتم وضعه في قائمة الانتظار للتجميع. عند تثبيت ملف شخصي من خلال ProfileInstaller، يتم وضعه في قائمة الانتظار للتجميع عند تشغيل تحسين DEX في الخلفية في المرة التالية. لا يكون الملف الشخصي نشطًا حتى يكتمل التجميع. لا تحاول قياس أداء ملفاتك الأساسية حتى يكتمل التجميع. قد تحتاج إلى فرض تجميع الملفات الشخصية الأساسية. لن يحدث هذا الخطأ عند تثبيت التطبيق من متجر التطبيقات أو مدير الحزم على الأجهزة التي تعمل بنظام Android 9 (واجهة برمجة التطبيقات 28) والإصدارات الأحدث، لأنّه يتم تنفيذ التحويل أثناء التثبيت.
RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING
تم تثبيت ملف شخصي غير متطابق وتجميع التطبيق معه. يحدث ذلك نتيجة التثبيت من خلال "متجر Google Play" أو "مدير الحزم". يُرجى العِلم أنّ هذه النتيجة تختلف عن RESULT_CODE_COMPILED_WITH_PROFILE لأنّ الملف الشخصي غير المطابق لن يجمع سوى أي طرق لا تزال تتم مشاركتها بين الملف الشخصي والتطبيق. الملف الشخصي أصغر بكثير من المتوقع، وسيتم تجميع عدد أقل من الطرق المستخدَمة في الملف الشخصي الأساسي.
RESULT_CODE_ERROR_CANT_WRITE_PROFILE_VERIFICATION_RESULT_CACHE_FILE
لا يمكن لـ ProfileVerifier كتابة ملف ذاكرة التخزين المؤقت لنتيجة إثبات الملكية. قد يحدث ذلك بسبب حدوث خطأ في أذونات مجلد التطبيق أو في حال عدم توفّر مساحة كافية على القرص على الجهاز.
RESULT_CODE_ERROR_UNSUPPORTED_API_VERSION
يتوافق
ProfileVerifieris running on an unsupported API version of Android. ProfileVerifier مع نظام التشغيل Android 9 (المستوى 28 لواجهة برمجة التطبيقات) والإصدارات الأحدث فقط.
RESULT_CODE_ERROR_PACKAGE_NAME_DOES_NOT_EXIST
يتم عرض PackageManager.NameNotFoundException عند الاستعلام عن PackageManager لحزمة التطبيق. ومن المفترض أن يحدث ذلك نادرًا. حاوِل إلغاء تثبيت التطبيق وإعادة تثبيت كل التطبيقات.
RESULT_CODE_ERROR_CACHE_FILE_EXISTS_BUT_CANNOT_BE_READ
هناك ملف ذاكرة تخزين مؤقت سابق لنتيجة إثبات الملكية، ولكن لا يمكن قراءته. نادرًا ما يحدث هذا. حاول إلغاء تثبيت التطبيق وإعادة تثبيت كل شيء.

استخدام ProfileVerifier في مرحلة الإنتاج

وفي مرحلة الإنتاج، يمكنك استخدام ProfileVerifier بالاقتران مع مكتبات تقارير الإحصاءات، مثل إحصاءات Google لبرنامج Firebase، لإنشاء أحداث إحصاءات تشير إلى حالة الملف الشخصي. على سبيل المثال، يعمل هذا على تنبيهك بسرعة في حال طرح إصدار جديد من التطبيق لا يحتوي على "الملفات الشخصية المرجعية".

فرض تجميع الملفات الشخصية الأساسية

إذا كانت حالة التجميع لملفاتك الشخصية الأساسية هي RESULT_CODE_PROFILE_ENQUEUED_FOR_COMPILATION، يمكنك فرض عملية التجميع الفوري باستخدام adb:

adb shell cmd package compile -r bg-dexopt PACKAGE_NAME

التحقّق من حالة التجميع بدون ProfileVerifier

إذا كنت لا تستخدم السمة ProfileVerifier، يمكنك التحقّق من حالة التجميع باستخدام adb، مع أنّها لا تقدّم إحصاءات عميقة مثل ProfileVerifier:

adb shell dumpsys package dexopt | grep -A 2 PACKAGE_NAME

يؤدي استخدام adb إلى إنشاء ما يشبه ما يلي:

  [com.google.samples.apps.nowinandroid.demo]
    path: /data/app/~~dzJiGMKvp22vi2SsvfjkrQ==/com.google.samples.apps.nowinandroid.demo-7FR1sdJ8ZTy7eCLwAnn0Vg==/base.apk
      arm64: [status=speed-profile] [reason=bg-dexopt] [primary-abi]
        [location is /data/app/~~dzJiGMKvp22vi2SsvfjkrQ==/com.google.samples.apps.nowinandroid.demo-7FR1sdJ8ZTy7eCLwAnn0Vg==/oat/arm64/base.odex]

تشير قيمة الحالة إلى حالة تجميع الملف الشخصي وهي إحدى القيم التالية:

حالة التحويل البرمجي المعنى
speed‑profile هناك ملف شخصي مجمّع ويتم استخدامه.
verify ما مِن ملف شخصي مجمّع.

لا تعني الحالة verify أنّ حزمة APK أو تنسيق AAB لا تحتوي على ملف شخصي، لأنه يمكن وضعها في قائمة الانتظار للتجميع عند تنفيذ مَهمّة تحسين DEX التالية في الخلفية.

تشير قيمة السبب إلى ما يؤدي إلى تجميع الملف الشخصي وهي إحدى القيم التالية:

السبب المعنى
install‑dm تم تجميع الملف الشخصي الأساسي يدويًا أو بواسطة Google Play عند تثبيت التطبيق.
bg‑dexopt تم تجميع ملف شخصي عندما كان جهازك غير مستخدَم من قِبل أي برنامج حاليًا. قد يكون هذا ملفًا شخصيًا أساسيًا أو ملفًا شخصيًا تم جمعه أثناء استخدام التطبيق.
cmdline تم بدء التجميع باستخدام adb. قد يكون هذا ملفًا شخصيًا أساسيًا أو ملفًا شخصيًا تم جمعه أثناء استخدام التطبيق.

مشاكل في الأداء

يوضح هذا القسم بعض أفضل الممارسات لتحديد ملفاتك الشخصية الأساسية وقياس أدائها بشكل صحيح للاستفادة إلى أقصى حد من هذه الملفات.

قياس مقاييس الشركة الناشئة بشكل صحيح

ستكون ملفاتك الشخصية الأساسية أكثر فعالية إذا كانت مقاييس شركتك الناشئة محددة بشكل جيد. المقياسان الرئيسيان هما الوقت المُستغرَق للعرض الأولي (TTID) والوقت المستغرَق حتى العرض الكامل (TTFD).

يتم تسجيل TTID عندما يرسم التطبيق أول إطار له. من المهم أن تجعل هذا قصيرًا قدر الإمكان لأن عرض شيء ما يوضح للمستخدم أن التطبيق قيد التشغيل. يمكنك أيضًا عرض مؤشر تقدم غير محدد لتوضيح أن التطبيق يستجيب.

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

يجب تخفيض كل من TTID وTTFD قدر الإمكان لكي يبدو تطبيقك متجاوبًا مع مختلف الأجهزة.

يمكن للنظام اكتشاف TTID وعرضه في Logcat والإبلاغ عنه كجزء من مقاييس أداء بدء التشغيل. ومع ذلك، فإن النظام غير قادر على تحديد TTFD، ويتحمل التطبيق مسؤولية الإبلاغ عندما يصل إلى حالة تفاعلية مرسومة بالكامل. يمكنك إجراء ذلك من خلال الاتصال بالرقم reportFullyDrawn()، أو ReportDrawn إذا كنت تستخدم Jetpack Compose. إذا كانت لديك مهام متعددة يتم تنفيذها في الخلفية يجب إكمالها قبل اعتبار التطبيق مرسومًا بالكامل، يمكنك استخدام FullyDrawnReporter، كما هو موضّح في القسم تحسين دقة توقيت بدء التشغيل.

الملفات الشخصية للمكتبة والملفات الشخصية المخصّصة

عند قياس تأثير الملفات الشخصية، قد يكون من الصعب الفصل بين مزايا الملفات الشخصية في تطبيقك والملفات الشخصية التي تساهم بها المكتبات، مثل مكتبات Jetpack. عند إنشاء حزمة APK، يضيف المكوّن الإضافي لنظام Gradle المتوافق مع Android أي ملفات شخصية في تبعيات المكتبة بالإضافة إلى ملفك الشخصي المخصّص. يُعدّ هذا الإجراء جيدًا لتحسين الأداء العام، ويُنصح به لإصدارات الإصدارات. ومع ذلك، يصعب قياس مقدار المكاسب الإضافية في الأداء التي تحقّقها الملف الشخصي المخصّص.

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

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

Kotlin

android {
  ...
  buildTypes {
    ...
    // Release build with only library profiles.
    create("releaseWithoutCustomProfile") {
      initWith(release)
    }
    ...
  }
  ...
}
...
dependencies {
  ...
  // Remove the baselineProfile dependency.
  // baselineProfile(project(":baselineprofile"))
}

baselineProfile {
  variants {
    create("release") {
      from(project(":baselineprofile"))
    }
  }
}

رائع

android {
  ...
  buildTypes {
    ...
    // Release build with only library profiles.
    releaseWithoutCustomProfile {
      initWith(release)
    }
    ...
  }
  ...
}
...
dependencies {
  ...
  // Remove the baselineProfile dependency.
  // baselineProfile ':baselineprofile"'
}

baselineProfile {
  variants {
    release {
      from(project(":baselineprofile"))
    }
  }
}

يؤدي مثال الرمز السابق إلى إزالة تبعية baselineProfile من جميع المتغيّرات وتطبيقها بشكل انتقائي على صيغة release فقط. قد يبدو أنه من غير البديهي أن تتم إضافة الملفات الشخصية للمكتبة بعد إزالة التبعية على وحدة منتج الملف الشخصي. ومع ذلك، فإن هذه الوحدة تكون مسؤولة فقط عن إنشاء ملفك الشخصي المخصص. لا يزال مكوّن Android Gradle الإضافي قيد التشغيل لجميع الأنواع، وهو مسؤول عن تضمين الملفات الشخصية للمكتبات.

عليك أيضًا إضافة الصيغة الجديدة إلى وحدة منشئ الملف الشخصي. في هذا المثال، تتم تسمية وحدة المنتج :baselineprofile.

Kotlin

android {
  ...
    buildTypes {
      ...
      // Release build with only library profiles.
      create("releaseWithoutCustomProfile") {}
      ...
    }
  ...
}

رائع

android {
  ...
    buildTypes {
      ...
      // Release build with only library profiles.
      releaseWithoutCustomProfile {}
      ...
    }
  ...
}

لقياس الأداء باستخدام الملفات الشخصية للمكتبة فقط، نفِّذ ما يلي:

./gradlew :baselineprofile:connectedBenchmarkReleaseWithoutCustomProfileAndroidTest

لقياس الأداء باستخدام الملفات الشخصية للمكتبة وملفك الشخصي المخصّص، عليك تنفيذ ما يلي:

./gradlew :baselineprofile:connectedBenchmarkReleaseAndroidTest

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

SmallListStartupBenchmark_startupCompose[mode=COLD]
timeToInitialDisplayMs   min  70.8,   median  79.1,   max 126.0
Traces: Iteration 0 1 2 3 4 5 6 7 8 9

تتوفّر ملفات شخصية للمكتبة في العديد من مكتبات Jetpack Compose، لذا هناك بعض التحسينات التي يمكن إجراؤها باستخدام المكوّن الإضافي Baseline Profile Gradle. ومع ذلك، هناك تحسينات إضافية عند استخدام الملف الشخصي المخصّص:

SmallListStartupBenchmark_startupCompose[mode=COLD]
timeToInitialDisplayMs   min 57.9,   median 73.5,   max 92.3
Traces: Iteration 0 1 2 3 4 5 6 7 8 9

تجنُّب بدء تشغيل التطبيقات المرتبطة بوحدات الإدخال والإخراج

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

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

إذا كان تطبيقك يستخدم Hilt، يمكنك تقديم عمليات تنفيذ مزيفة متعلّقة بوحدات الإدخال والإخراج عند قياس الأداء في مقياسَي Micrometer وHilt.

تغطية جميع رحلات المستخدم المهمة

من المهم أن تتناول بدقة جميع رحلات المستخدم المهمة في إنشاء الملف الشخصي المرجعي لديك. لن يتم تحسين أي رحلات مستخدم غير مشمولة من خلال الملفات الشخصية الأساسية. تشمل الملفات الشخصية الأساسية الأكثر فعاليةً جميع رحلات المستخدم الشائعة للشركات الناشئة بالإضافة إلى رحلات المستخدم داخل التطبيق الحساسة للأداء، مثل قوائم التمرير.