استخدِم مكتبة Macrobenchmark لاختبار حالات الاستخدام الأكبر لتطبيقك، بما في ذلك بدء تشغيل التطبيق وعمليات معالجة واجهة المستخدم المعقّدة، مثل التمرير السريع في RecyclerView
أو تشغيل الرسوم المتحركة. إذا كنت تريد اختبار أجزاء أصغر من الرمز، يمكنك الرجوع إلى مكتبة Microbenchmark. توضّح هذه الصفحة كيفية إعداد مكتبة Macrobenchmark.
تعرض المكتبة نتائج قياس الأداء في كلّ من وحدة تحكّم "استوديو Android" وملف JSON يتضمّن تفاصيل أكثر. ويوفّر أيضًا ملفات تتبُّع يمكنك تحميلها وتحليلها في Android Studio.
استخدِم مكتبة Macrobenchmark في بيئة دمج مستمر (CI)، كما هو موضّح في مقالة قياس الأداء في عملية الدمج المستمر.
يمكنك استخدام Macrobenchmark لإنشاء "ملفات تعريف خط الأساس". عليك أولاً إعداد مكتبة Macrobenchmark، وبعد ذلك يمكنك إنشاء ملف Baseline Profile.
إعداد المشروع
ننصحك باستخدام Macrobenchmark مع أحدث إصدار من Android Studio للاستفادة من ميزات بيئة التطوير المتكاملة التي تتوافق مع Macrobenchmark.
إعداد وحدة Macrobenchmark
تتطلّب اختبارات Macrobenchmark توفُّر وحدة
com.android.test
نموذجية منفصلة عن رمز تطبيقك، وهي المسؤولة عن تنفيذ الاختبارات
التي تقيس أداء تطبيقك.
في "استوديو Android"، يتوفّر نموذج لتبسيط عملية إعداد وحدة Macrobenchmark. ينشئ نموذج وحدة قياس الأداء تلقائيًا وحدة في مشروعك لقياس أداء التطبيق الذي تم إنشاؤه بواسطة وحدة تطبيق، بما في ذلك نموذج لقياس أداء بدء التشغيل.
لاستخدام نموذج الوحدة لإنشاء وحدة جديدة، اتّبِع الخطوات التالية:
انقر بزر الماوس الأيمن على مشروعك أو وحدتك في لوحة المشروع في "استوديو Android"، ثم اختَر جديد > وحدة.
انقر على مقياس الأداء من لوحة النماذج. يمكنك تخصيص التطبيق المستهدَف، أي التطبيق الذي سيتم قياس أدائه، بالإضافة إلى اسم الحزمة والوحدة النمطية لوحدة Macrobenchmark الجديدة.
انقر على إنهاء.
الشكل 1. نموذج وحدة مقياس الأداء
إعداد التطبيق
لتقييم أداء تطبيق، يُعرف باسم التطبيق المستهدَف في Macrobenchmark، يجب أن يكون التطبيق profileable
، ما يتيح قراءة معلومات التتبُّع التفصيلية بدون التأثير في الأداء. يضيف معالج الوحدات العلامة <profileable>
تلقائيًا إلى ملف AndroidManifest.xml
الخاص بالتطبيق.
تأكَّد من أنّ التطبيق المستهدَف يتضمّن الإصدار
ProfilerInstaller
1.3 أو الإصدارات الأحدث، وهو الإصدار الذي تحتاج إليه مكتبة Macrobenchmark لتفعيل عملية تسجيل الملفات الشخصية وإعادة الضبط ومحو ذاكرة التخزين المؤقت للتظليل.
اضبط إعدادات التطبيق الذي يتم قياس أدائه على أن تكون مشابهة قدر الإمكان لإعدادات الإصدار العلني أو الإصدار المتاح على المتجر. اضبطه على أنّه غير قابل للتصحيح، ومن الأفضل تفعيل تصغير الحجم، ما يؤدي إلى تحسين الأداء. ويتم ذلك عادةً من خلال إنشاء نسخة من صيغة الإصدار، التي تنفّذ الإجراءات نفسها، ولكن يتم توقيعها محليًا باستخدام مفاتيح تصحيح الأخطاء.
بدلاً من ذلك، يمكنك استخدام initWith
لتوجيه Gradle بتنفيذ ذلك نيابةً عنك:
Kotlin
buildTypes { getByName("release") { isMinifyEnabled = true isShrinkResources = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) } create("benchmark") { initWith(getByName("release")) signingConfig = signingConfigs.getByName("debug") } }
Groovy
buildTypes { getByName("release") { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) // In real app, this would use its own release keystore signingConfig = signingConfigs.getByName("debug") } }
للمساعدة في ضمان أنّ تشغيل مقياس الأداء يؤدي إلى إنشاء واختبار الإصدار الصحيح من تطبيقك، كما هو موضّح في الشكل 2، اتّبِع الخطوات التالية:
- نفِّذ عملية مزامنة Gradle.
- افتح لوحة إنشاء صيغ.
- اختَر صيغة مقياس الأداء لكلّ من التطبيق ووحدة Macrobenchmark.
الشكل 2. اختَر صيغة مقياس الأداء.
(اختياري) إعداد تطبيق متعدد الوحدات
إذا كان تطبيقك يتضمّن أكثر من وحدة Gradle، تأكَّد من أنّ نصوص البرامج الإنشائية تعرف نوع الإصدار الذي يجب تجميعه. أضِف السمةmatchingFallbacks
إلى نوع الإصدار benchmark
في الوحدتَين :macrobenchmark
و:app
. يمكن أن تتضمّن بقية وحدات Gradle الإعدادات نفسها كما كان من قبل.
Kotlin
create("benchmark") { initWith(getByName("release")) signingConfig = signingConfigs.getByName("debug") matchingFallbacks += listOf("release") }
Groovy
benchmark { initWith buildTypes.release signingConfig signingConfigs.debug matchingFallbacks = ['release'] }
بدون ذلك، سيؤدي نوع الإصدار benchmark
الذي تمت إضافته حديثًا إلى تعذُّر إنشاء الإصدار
وستظهر رسالة الخطأ التالية:
> Could not resolve project :shared.
Required by:
project :app
> No matching variant of project :shared was found.
...
عند اختيار صيغ الإنشاء في مشروعك، اختَر benchmark
للوحدتَين :app
و:macrobenchmark
، وrelease
لأي وحدات أخرى في تطبيقك، كما هو موضّح في الشكل 3:
الشكل 3. متغيرات قياس الأداء لمشروع متعدد الوحدات مع تحديد نوعَي الإصدار والبنية الخاصة بقياس الأداء
لمزيد من المعلومات، راجِع مقالة استخدام إدارة التبعيات المتوافقة مع الأنواع.
(اختياري) إعداد نُسخ المنتج
إذا كان لديك عدة إصدارات من المنتج في تطبيقك، عليك ضبط :macrobenchmark
الوحدة النمطية لكي تعرف إصدار المنتج الذي يجب إنشاؤه وقياس أدائه.
تستخدِم الأمثلة الواردة في هذه الصفحة نوعَي المنتج في الوحدة :app
: demo
وproduction
، كما هو موضّح في المقتطف التالي:
Kotlin
flavorDimensions += "environment" productFlavors { create("demo") { dimension = "environment" // ... } create("production") { dimension = "environment" // ... } }
Groovy
flavorDimensions 'environment' productFlavors { demo { dimension 'environment' // ... } production { dimension 'environment' // ... } }
بدون عملية الضبط هذه، قد يظهر لك خطأ في الإنشاء مشابه لما يحدث عند استخدام وحدات Gradle متعددة:
Could not determine the dependencies of task ':macrobenchmark:connectedBenchmarkAndroidTest'.
> Could not determine the dependencies of null.
> Could not resolve all task dependencies for configuration ':macrobenchmark:benchmarkTestedApks'.
> Could not resolve project :app.
Required by:
project :macrobenchmark
> The consumer was configured to find a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'benchmark', attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '7.3.0'. However we cannot choose between the following variants of project :app:
- demoBenchmarkRuntimeElements
- productionBenchmarkRuntimeElements
All of them match the consumer attributes:
...
يوضّح القسمان التاليان طريقتَين لإعداد قياس الأداء باستخدام عدة نكهات منتج.
استخدام missingDimensionStrategy
يؤدي تحديد missingDimensionStrategy
في defaultConfig
ضمن وحدة :macrobenchmark
إلى توجيه نظام الإنشاء لاستخدام سمة نوع المنتج الاحتياطية. حدِّد السمات التي تريد استخدامها إذا لم تعثر عليها في الوحدة.
في المثال التالي، يتم استخدام نكهة production
كالسِمة التلقائية:
Kotlin
defaultConfig { missingDimensionStrategy("environment", "production") }
Groovy
defaultConfig { missingDimensionStrategy "environment", "production" }
بهذه الطريقة، يمكن لوحدة :macrobenchmark
إنشاء مقياس أداء لنوع المنتج المحدّد فقط، وهو أمر مفيد إذا كنت تعلم أنّ نوع منتج واحد فقط يتضمّن الإعداد المناسب لقياس الأداء.
تحديد متغيرات المنتج في وحدة :macrobenchmark
إذا أردت إنشاء نُسخ أخرى من المنتج وقياس أدائها، عليك تحديدها في وحدة :macrobenchmark
. حدِّدها بشكل مشابه لما هو وارد في الوحدة :app
، ولكن لا تُسنِد سوى productFlavors
إلى dimension
. لا يلزم ضبط أي إعدادات أخرى:
Kotlin
flavorDimensions += "environment" productFlavors { create("demo") { dimension = "environment" } create("production") { dimension = "environment" } }
Groovy
flavorDimensions 'environment' productFlavors { demo { dimension 'environment' } production { dimension 'environment' } }
بعد تحديد المشروع ومزامنته، اختَر صيغة البناء المناسبة من لوحة صيغ البناء، كما هو موضّح في الشكل 4:
الشكل 4. إصدارات تجريبية للمشروع مع نُسخ من المنتج تعرض "productionBenchmark" و "release" المحدّدين
لمزيد من المعلومات، راجِع مقالة حلّ أخطاء الإنشاء المتعلّقة بمطابقة الصيغ.
إنشاء فئة اختبار قياس الأداء الشامل
يتم توفير اختبارات قياس الأداء من خلال واجهة برمجة التطبيقات MacrobenchmarkRule
JUnit4 rule
في مكتبة Macrobenchmark. يحتوي على طريقة measureRepeated
تتيح لك تحديد شروط مختلفة حول كيفية تشغيل التطبيق المستهدَف وقياس أدائه.
يجب على الأقل تحديد packageName
للتطبيق المستهدف، وmetrics
التي تريد قياسها، وعدد iterations
التي يجب أن يتم تشغيل مقياس الأداء.
Kotlin
@LargeTest @RunWith(AndroidJUnit4::class) class SampleStartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() @Test fun startup() = benchmarkRule.measureRepeated( packageName = TARGET_PACKAGE, metrics = listOf(StartupTimingMetric()), iterations = DEFAULT_ITERATIONS, setupBlock = { // Press home button before each run to ensure the starting activity isn't visible. pressHome() } ) { // starts default launch activity startActivityAndWait() } }
Java
@LargeTest @RunWith(AndroidJUnit4.class) public class SampleStartupBenchmark { @Rule public MacrobenchmarkRule benchmarkRule = new MacrobenchmarkRule(); @Test public void startup() { benchmarkRule.measureRepeated( /* packageName */ TARGET_PACKAGE, /* metrics */ Arrays.asList(new StartupTimingMetric()), /* iterations */ 5, /* measureBlock */ scope -> { // starts default launch activity scope.startActivityAndWait(); return Unit.INSTANCE; } ); } }
للاطّلاع على جميع خيارات تخصيص مقياس الأداء، راجِع قسم تخصيص مقاييس الأداء.
تشغيل مقياس الأداء
.يمكنك إجراء الاختبار من داخل "استوديو Android" لقياس أداء تطبيقك على جهازك. يمكنك تشغيل مقاييس الأداء بالطريقة نفسها التي تشغّل بها أي @Test
أخرى باستخدام إجراء الهامش بجانب فئة الاختبار أو الطريقة، كما هو موضّح في الشكل 5.
الشكل 5. تشغيل Macrobenchmark باستخدام إجراء في الهامش بجانب فئة الاختبار
يمكنك أيضًا تشغيل جميع مقاييس الأداء في وحدة Gradle من سطر الأوامر من خلال تنفيذ الأمر connectedCheck
:
./gradlew :macrobenchmark:connectedCheck
يمكنك إجراء اختبار واحد من خلال تنفيذ ما يلي:
./gradlew :macrobenchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.macrobenchmark.startup.SampleStartupBenchmark#startup
راجِع مقالة قياس الأداء في التكامل المستمر للحصول على معلومات حول كيفية تنفيذ مقاييس الأداء ومراقبتها في التكامل المستمر.
نتائج قياس الأداء
بعد إجراء اختبار الأداء بنجاح، يتم عرض المقاييس مباشرةً في "استوديو Android"، ويتم إخراجها لاستخدامها في الدمج المتواصل في ملف JSON. تسجّل كل تكرار تم قياسه عملية تتبُّع منفصلة للنظام. يمكنك فتح نتائج التتبُّع هذه من خلال النقر على الروابط في جزء نتائج الاختبار، كما هو موضّح في الشكل 6:
الشكل 6. نتائج بدء تشغيل Macrobenchmark
عند تحميل التتبُّع، يطلب منك "استوديو Android" اختيار العملية التي تريد تحليلها. يتم ملء الاختيار مسبقًا بعملية التطبيق المستهدَف، كما هو موضّح في الشكل 7:
الشكل 7. اختيار عملية تتبُّع في "استوديو YouTube"
بعد تحميل ملف التتبُّع، يعرض "استوديو Android" النتائج في أداة تحليل استخدام وحدة المعالجة المركزية:
الشكل 8. تتبُّع الأخطاء في "استوديو YouTube"
يتم أيضًا نسخ تقارير JSON وأي آثار لتحديد المشاكل تلقائيًا من الجهاز إلى المضيف. تتم كتابة هذه السجلّات على الجهاز المضيف في الموقع التالي:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
الوصول إلى ملفات التتبُّع يدويًا
إذا أردت استخدام أداة Perfetto لتحليل ملف تتبُّع، عليك اتّباع خطوات إضافية. يتيح لك Perfetto فحص جميع العمليات التي تحدث على الجهاز أثناء عملية التتبُّع، بينما يقتصر فحص أداة تحليل استخدام وحدة المعالجة المركزية في Android Studio على عملية واحدة.
إذا استدعيت الاختبارات من "استوديو Android" أو من سطر أوامر Gradle، سيتم تلقائيًا نسخ ملفات التتبُّع من الجهاز إلى المضيف. يتم حفظها على الجهاز المضيف في الموقع التالي:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/TrivialStartupBenchmark_startup[mode=COLD]_iter002.perfetto-trace
بعد الحصول على ملف التتبُّع في نظام التشغيل المضيف، يمكنك فتحه في "استوديو Android" من خلال النقر على ملف > فتح في القائمة. تعرض هذه السمة طريقة عرض أداة Profiler الموضّحة في القسم السابق.
أخطاء في الإعدادات
في حال إعداد التطبيق بشكل غير صحيح، أي يمكن تصحيحه أو لا يمكن إنشاء ملف تعريف له، تعرض مكتبة Macrobenchmark رسالة خطأ بدلاً من عرض قياس غير صحيح أو غير مكتمل. يمكنك إخفاء هذه الأخطاء باستخدام الوسيطة androidx.benchmark.suppressErrors
.
تعرض Macrobenchmark أيضًا أخطاء عند محاولة قياس أداء محاكي أو جهاز منخفض البطارية، ما قد يؤدي إلى التأثير في مدى توفّر النواة وسرعة الساعة.
تخصيص مقاييس الأداء
تقبل الدالة measureRepeated
مَعلمات مختلفة تؤثّر في المقاييس التي تجمعها المكتبة، أو طريقة بدء تطبيقك وتجميعه، أو عدد التكرارات التي يتم تنفيذ قياس الأداء بها.
تسجيل المقاييس
المقاييس هي النوع الرئيسي من المعلومات المستخرَجة من مقاييس الأداء. تتوفّر المقاييس التالية:
لمزيد من المعلومات عن المقاييس، راجِع تسجيل مقاييس Macrobenchmark.
تحسين بيانات التتبُّع باستخدام الأحداث المخصّصة
قد يكون من المفيد تزويد تطبيقك بأحداث تتبُّع مخصّصة تظهر مع بقية تقرير التتبُّع ويمكن أن تساعد في تحديد المشاكل الخاصة بتطبيقك. لمزيد من المعلومات عن إنشاء أحداث تتبُّع مخصّصة، اطّلِع على تحديد الأحداث المخصّصة.
CompilationMode
يمكن أن تحدّد اختبارات الأداء الشامل CompilationMode
، الذي يحدّد مقدار التطبيق الذي يجب تجميعه مسبقًا من رمز بايت DEX (تنسيق رمز البايت داخل حزمة APK) إلى رمز الآلة (مشابه للغة C++ المجمّعة مسبقًا).
يتم تشغيل Macrobenchmark تلقائيًا باستخدام CompilationMode.DEFAULT
، ما يؤدي إلى تثبيت "الملف الأساسي"، إذا كان متاحًا، على الإصدار 7 من نظام التشغيل Android (المستوى 24 لواجهة برمجة التطبيقات) والإصدارات الأحدث.
إذا كنت تستخدم الإصدار 6 من نظام التشغيل Android (المستوى 23 من واجهة برمجة التطبيقات) أو إصدارًا أقدم، سيتم تجميع حزمة APK بالكامل كإجراء تلقائي للنظام.
يمكنك تثبيت "ملف تعريف أساسي" إذا كان التطبيق المستهدَف يتضمّن كلاً من "ملف التعريف الأساسي" ومكتبة ProfileInstaller
.
في نظام التشغيل Android 7 والإصدارات الأحدث، يمكنك تخصيص CompilationMode
للتأثير في مقدار التجميع المُسبَق على الجهاز لمحاكاة مستويات مختلفة من التجميع المسبَق (AOT) أو التخزين المؤقت أثناء التشغيل (JIT). يمكنك الاطّلاع على CompilationMode.Full
وCompilationMode.Partial
وCompilationMode.None
وCompilationMode.Ignore
.
تستند هذه الميزة إلى أوامر تجميع ART. يمحو كل مقياس أداء بيانات الملف الشخصي قبل البدء، وذلك للمساعدة في ضمان عدم حدوث تداخل بين مقاييس الأداء.
StartupMode
لتنفيذ عملية بدء نشاط، يمكنك تمرير وضع بدء تشغيل محدّد مسبقًا: COLD
أو WARM
أو HOT
. تغيّر هذه المَعلمة طريقة تشغيل النشاط وحالة العملية في بداية الاختبار.
لمزيد من المعلومات عن أنواع التشغيل، اطّلِع على وقت تشغيل التطبيق.
نماذج
يتوفّر مشروع نموذجي في نموذج Macrobenchmark الخاص بالمستودع على GitHub.
تقديم ملاحظات
للإبلاغ عن مشاكل أو إرسال طلبات ميزات في Jetpack Macrobenchmark، يُرجى الاطّلاع على أداة تتبُّع المشاكل العامة.
اقتراحات مخصصة لك
- ملاحظة: يتم عرض نص الرابط عندما تكون JavaScript غير مفعّلة
- مقاييس Capture Macrobenchmark
- إنشاء ملفات تعريف أساسية {:#creating-profile-rules}
- تنفيذ القياس تلقائيًا باستخدام مكتبة Macrobenchmark {:#measuring-optimization}