مقياس الأداء في التكامل المستمر

يمكنك تنفيذ مقاييس الأداء في أداة "التكامل المستمر" (CI) لتتبُّع الأداء بمرور الوقت ومعرفة أي تراجع في الأداء أو التحسينات قبل إصدار تطبيقك. توفر هذه الصفحة معلومات أساسية حول قياس الأداء في CI.

قبل البدء في قياس الأداء في CI، ضع في اعتبارك كيف يختلف تسجيل النتائج وتقييمها عن الاختبارات العادية.

نتائج ضبابية

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

استخدام الأجهزة الحقيقية

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

تنفيذ المعايير

قد يكون تنفيذ مقاييس الأداء كجزء من مسار CI مختلفًا عن تشغيلها محليًا من Android Studio. محليًا، تُجري عادةً اختبارات دمج Android من خلال مهمة Gradle connectedCheck واحدة. تعمل هذه المهمة تلقائيًا على إنشاء ملف APK واختبار ملف APK وإجراء الاختبارات على الأجهزة المتصلة بخادم CI. عند التشغيل في CI، يجب عادةً تقسيم هذا التدفق إلى مراحل منفصلة.

زيادة التشويق

بالنسبة إلى مكتبة مقاييس الأداء المصغّرة، شغِّل مهمة Gradle assemble[VariantName]AndroidTest، التي تنشئ حزمة APK للاختبار تحتوي على كل من رمز التطبيق والرمز الذي تم اختباره.

وبدلاً من ذلك، تطلب منك مكتبة مقاييس الأداء الكلي إنشاء حزمة APK مستهدَفة واختبار حزمة APK بشكل منفصل. لذلك، يمكنك تنفيذ مهام :app:assemble[VariantName] و:macrobenchmark:assemble[VariantName] Gradle.

التثبيت والتشغيل

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

للتثبيت، استخدِم الأمر adb install وحدِّد حزمة APK التجريبية أو حزمة APK المستهدَفة.

شغِّل أمر أداة adb shell am لتشغيل جميع مقاييس الأداء:

adb shell am instrument -w com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

عند استخدام مكتبة مقاييس الأداء الفائق، استخدِم androidx.test.runner.AndroidJUnitRunner العادي كعدّاء لأدوات قياس الأداء.

يمكنك تمرير وسيطات قياس حالة التطبيق نفسها كما في إعدادات Gradle باستخدام الوسيطة -e. للاطّلاع على جميع خيارات وسيطات قياس الأداء، يُرجى الاطّلاع على وسيطات قياس الأداء المصغر أو إضافة وسيطات قياس الأداء.

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

adb shell am instrument -w -e "androidx.benchmark.dryRunMode.enable" "true" com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

لمزيد من المعلومات حول كيفية إجراء اختبارات الأدوات من سطر الأوامر، يُرجى الاطّلاع على إجراء الاختبارات باستخدام ADB

قفل الساعات

يوفّر المكوّن الإضافي MicroMetric Gradle الأمر ./gradlew lockClocks لقفل ساعات وحدة المعالجة المركزية (CPU) للأجهزة المزوّدة بحق الوصول إلى الجذر. ويساعد ذلك في ضمان الاستقرار عند الوصول إلى الأجهزة الجذر، مثل إصدارات "userdebug". ويمكنك تكرار ذلك باستخدام نص أوامر lockClocks.sh المتاح في مصدر المكتبة.

يمكنك إما تشغيل النص البرمجي مباشرةً من مضيف في Linux أو Mac، أو يمكنك الدفع إلى الجهاز باستخدام بعض أوامر adb:

adb push path/lockClocks.sh /data/local/tmp/lockClocks.sh
adb shell /data/local/tmp/lockClocks.sh
adb shell rm /data/local/tmp/lockClocks.sh

إذا شغّلت النص البرمجي لـ Shell مباشرةً على مضيف، يرسِل هذه الأوامر إلى جهاز متصل.

لمعرفة مزيد من المعلومات عن أهمية قفل ساعات وحدة المعالجة المركزية (CPU)، يمكنك الاطّلاع على كيفية الحصول على مقاييس أداء متّسقة.

جمع النتائج

تنتج مكتبات قياس الأداء عن القياسات بتنسيق JSON، بالإضافة إلى آثار التحليل إلى دليل على الجهاز الذي يعمل بنظام التشغيل Android بعد كل تشغيل لمقياس الأداء. تنتج مكتبة مقياس الأداء الفائق ملفات تتبُّع أداء متعددة: ملف واحد لكل تكرار تم قياسه لكل حلقة MacrobenchmarkRule.measureRepeated. ومع ذلك، ينشئ مقياس مقياس الأداء الصغرى ملف تتبُّع واحدًا فقط لجميع التكرارات لكل BenchmarkRule.measureRepeated. يتم أيضًا إخراج ملفات تتبُّع تحديد المواصفات في هذا الدليل نفسه.

حفظ الملفات وتحديد موقعها

إذا نفَّذت مقاييس الأداء من خلال Gradle، سيتم نسخ هذه الملفات تلقائيًا إلى دليل إخراج جهاز الكمبيوتر المضيف ضِمن build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/.

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

Benchmark: writing results to /storage/emulated/0/Android/media/com.example.macrobenchmark/com.example.macrobenchmark-benchmarkData.json

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

adb shell am instrument -w -e additionalTestOutputDir /sdcard/Download/ com.example.benchmark/androidx.benchmark.junit4.AndroidBenchmarkRunner

على نظام التشغيل Android 10 (المستوى 29 لواجهة برمجة التطبيقات) والإصدارات الأحدث، يتم إجراء اختبارات تطبيقك في وضع الحماية للتخزين تلقائيًا، ما يمنع تطبيقك من الوصول إلى الملفات خارج الدليل الخاص بالتطبيق. لتتمكن من الحفظ في دليل عام، مثل /sdcard/Download، عليك اجتياز وسيطة الأدوات التالية:

-e no-isolated-storage true

عليك أيضًا السماح صراحةً بخيارات مساحة التخزين القديمة في بيان مقياس الأداء:

<application android:requestLegacyExternalStorage="true" ... >

لمزيد من المعلومات، يُرجى الاطّلاع على الإيقاف المؤقت لمساحة التخزين المُفصَّلة.

استرداد الملفات

لاسترداد الملفات التي تم إنشاؤها من الجهاز، استخدِم الأمر adb pull الذي يسحب الملف المحدَّد إلى الدليل الحالي على المضيف:

adb pull /storage/emulated/0/Android/media/com.example.macrobenchmark/com.example.macrobenchmark-benchmarkData.json

لاسترداد كل benchmarkData من مجلد محدد، راجع المقتطف التالي:

# The following command pulls all files ending in -benchmarkData.json from the directory
# hierarchy starting at the root /storage/emulated/0/Android.
adb shell find /sdcard/Download -name "*-benchmarkData.json" | tr -d '\r' | xargs -n1 adb pull

يتم حفظ ملفات التتبُّع (.trace أو .perfetto-trace) في المجلد نفسه الذي يتضمّن benchmarkData.json، وبالتالي يمكنك جمعها بالطريقة نفسها.

مثال على بيانات قياس الأداء

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

{
    "context": {
        "build": {
            "brand": "google",
            "device": "blueline",
            "fingerprint": "google/blueline/blueline:12/SP1A.210812.015/7679548:user/release-keys",
            "model": "Pixel 3",
            "version": {
                "sdk": 31
            }
        },
        "cpuCoreCount": 8,
        "cpuLocked": false,
        "cpuMaxFreqHz": 2803200000,
        "memTotalBytes": 3753299968,
        "sustainedPerformanceModeEnabled": false
    },
    "benchmarks": [
        {
            "name": "startup",
            "params": {},
            "className": "com.example.macrobenchmark.startup.SampleStartupBenchmark",
            "totalRunTimeNs": 4975598256,
            "metrics": {
                "timeToInitialDisplayMs": {
                    "minimum": 347.881076,
                    "maximum": 347.881076,
                    "median": 347.881076,
                    "runs": [
                        347.881076
                    ]
                }
            },
            "sampledMetrics": {},
            "warmupIterations": 0,
            "repeatIterations": 3,
            "thermalThrottleSleepSeconds": 0
        }
    ]
}

مراجع إضافية