الملفات الشخصية الأساسية المرجعية باستخدام مكتبة مقاييس الأداء المجمّعة

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

تتيح لك اختبارات Macrobenchmark التحكّم في عملية التجميع قبل القياس باستخدام واجهة برمجة التطبيقات CompilationMode. استخدِم قيم CompilationMode مختلفة لمقارنة الأداء مع حالات تجميع مختلفة. يوضّح مقتطف الرمز التالي كيفية استخدام المَعلمة CompilationMode لقياس فائدة "الملفات الشخصية الأساسية":

@RunWith(AndroidJUnit4ClassRunner::class)
class ColdStartupBenchmark {
    @get:Rule
    val benchmarkRule = MacrobenchmarkRule()

    // No ahead-of-time (AOT) compilation at all. Represents performance of a
    // fresh install on a user's device if you don't enable Baseline Profiles—
    // generally the worst case performance.
    @Test
    fun startupNoCompilation() = startup(CompilationMode.None())

    // Partial pre-compilation with Baseline Profiles. Represents performance of
    // a fresh install on a user's device.
    @Test
    fun startupPartialWithBaselineProfiles() =
        startup(CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Require))

    // Partial pre-compilation with some just-in-time (JIT) compilation.
    // Represents performance after some app usage.
    @Test
    fun startupPartialCompilation() = startup(
        CompilationMode.Partial(
            baselineProfileMode = BaselineProfileMode.Disable,
            warmupIteration = 3
        )
    )

    // Full pre-compilation. Generally not representative of real user
    // experience, but can yield more stable performance metrics by removing
    // noise from JIT compilation within benchmark runs.
    @Test
    fun startupFullCompilation() = startup(CompilationMode.Full())

    private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated(
        packageName = "com.example.macrobenchmark.target",
        metrics = listOf(StartupTimingMetric()),
        compilationMode = compilationMode,
        iterations = 10,
        startupMode = StartupMode.COLD,
        setupBlock = {
            pressHome()
        }
    ) {
        uiAutomator {
            startApp(packageName)
            onElement(5_000) { viewIdResourceName == "my-content"}
        }
    }
}

في لقطة الشاشة التالية، يمكنك الاطّلاع على النتائج مباشرةً في "استوديو Android" لتطبيق نموذج Now in Android الذي تم تشغيله على هاتف Google Pixel 7. تُظهر النتائج أنّ بدء تشغيل التطبيق يكون أسرع عند استخدام "الملفات الأساسية" (229.0 ملي ثانية) مقارنةً بعدم استخدام أي تجميع (324.8 ملي ثانية).

نتائج ColdstartupBenchmark
الشكل 1: نتائج ColdStartupBenchmark توضّح الوقت المستغرَق للعرض الأولي بدون تجميع (324 ملي ثانية)، والتجميع الكامل (315 ملي ثانية)، والتجميع الجزئي (312 ملي ثانية)، وملفات Baseline Profiles (229 ملي ثانية).

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

الوقت المستغرَق للعرض الكامل

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

ننصحك بتحسين كل من TTID وTTFD، لأنّ كلاهما مهم. يساعد انخفاض وقت التفاعل الأولي المستخدم في معرفة أنّ التطبيق يتم تشغيله فعليًا. من المهم أن تكون مدة TTFD قصيرة لضمان تفاعل المستخدم مع التطبيق بسرعة.

للاطّلاع على استراتيجيات الإبلاغ عن وقت اكتمال رسم واجهة مستخدم التطبيق، يُرجى الاطّلاع على تحسين دقة توقيت بدء التشغيل.

  • ملاحظة: يتم عرض نص الرابط عندما يكون JavaScript غير مفعَّل
  • [كتابة اختبار Macrobenchmark][11]
  • [تسجيل مقاييس Macrobenchmark][12]
  • كتابة اختبارات مبرمَجة باستخدام UI Automator
  • [تحليل عملية بدء تشغيل التطبيق وتحسينها {:#app-startup-analysis-optimization}][14]