قد تختلف المشروعات الأكبر، أو تلك التي تنفّذ الكثير من منطق الإنشاء المخصص
يتطلب منك التدقيق في عملية الإنشاء للعثور على المؤثِّرات السلبية.
يمكنك القيام بذلك من خلال تحليل المدة التي تستغرقها Gradle لتنفيذ كل مرحلة من مراحل
دورة حياة التصميم وكل مهمة تصميم. على سبيل المثال،
إذا كان ملف الإصدار الشخصي
أن Gradle يقضي الكثير من الوقت في تهيئة مشروعك، فقد
تقترح أنك بحاجة إلى
نقل منطق الإصدار المخصّص خارج مرحلة الضبط:
بالإضافة إلى ذلك، إذا تستهلك المَهمة mergeDevDebugResources
مقدارًا كبيرًا
من وقت الإصدار، فقد يشير إلى أنك بحاجة إلى إما
تحويل صورك إلى تنسيق WebP
أو أوقِف معالجة ملفات PNG.
إذا كنت تستخدم يُعدّ Android Studio 4.0 أو الإصدارات الأحدث أفضل طريقة للتحقق من أداء الإصدار وهي استخدام أداة تحليل الإصدار.
بالإضافة إلى ذلك، هناك خياران لإنشاء ملف تعريفي خارج استوديو Android:
أداة
gradle-profiler
المستقلة، أداة قوية لإجراء تحليل معمّق لتصميمك.يتوفّر خيار
--profile
لنظام Gradle. أداة ملائمة متاحة من سطر أوامر Gradle.
استخدام أداة gradle-profiler
المستقلة
من أجل العثور على إعداد المشروع الذي يوفر لك أفضل سرعة إنشاء، عليك استخدام أداة تحليل Gradle، أداة لجمع معلومات التحليل وقياس الأداء لإصدارات Gradle. يتيح لك محلّل Gradle إنشاء سيناريوهات إنشاء وتنفيذها الأوقات، مما يمنع التباين الكبير بين النتائج ويضمن إمكانية التكرر النتائج.
وضع قياس الأداء وينبغي استخدامه لجمع معلومات حول عمليات الإنشاء النظيفة والتزايدية، أثناء وضع تحليل البيانات لجمع معلومات أكثر دقة عن عمليات التشغيل، بما في ذلك وحدة المعالجة المركزية (CPU) لقطات.
تتضمن بعض تهيئات إعداد المشروع لقياس الأداء ما يلي:
- إصدارات المكونات الإضافية
- إصدارات Gradle
- إعدادات JVM (حجم الذاكرة وحجم الاحتفاظ بالبيانات وجمع البيانات غير المرغوب فيها وما إلى ذلك)
- عدد العاملين في Gradle (
org.gradle.workers.max
) - خيارات لكل مكوّن إضافي لتحسين الأداء بشكل أكبر
الخطوات الأولى
- تثبيت Gradle-profiler من خلال اتّباع هذه التعليمات
- تشغيل:
gradle-profiler --benchmark --project-dir <root-project> :app:assembleDebug
سيؤدي ذلك إلى قياس أداء إصدار حديث تمامًا لأنّ --benchmark
يشغِّل
المهمة عدة مرات دون تغيير المشروع بينهما. بعد ذلك، ستفتح
إنشاء تقرير HTML ضمن دليل profile-out/
يعرض لك
وأوقات التصميم.
هناك سيناريوهات أخرى قد تكون أكثر فائدة لقياس الأداء:
- تغير الرمز في نص طريقة في إحدى الفئات التي تقوم فيها بمعظم عملك.
- تغييرات واجهة برمجة التطبيقات في وحدة يتم استخدامها طوال مشروعك بينما أقل بشكل متكرر من التغييرات على التعليمات البرمجية الخاصة بك، فإن هذا يكون له تأثير أكبر مفيدة لقياسها.
- تعديلات التصميم لمحاكاة التكرار على عمل واجهة المستخدم.
- سلسلة تعديلات لمحاكاة التعامل مع أعمال الترجمة.
- الإصدارات النظيفة لمحاكاة التغييرات التي تم إجراؤها على الإصدار نفسه (على سبيل المثال، نظام Gradle المتوافق مع Android
أو تحديث المكوّن الإضافي أو تحديث Gradle أو إجراء تعديلات على رمز التصميم
أقل من
buildSrc
).
من أجل قياس حالات الاستخدام هذه، يمكنك إنشاء سيناريو
التي تُستخدم لتنفيذ gradle-profiler
وتسري بشكل مناسب
التغييرات على مصادرك. يمكنك مراجعة بعض السيناريوهات الشائعة أدناه.
تحليل إعدادات مختلفة للذاكرة/وحدة المعالجة المركزية (CPU)
لقياس إعدادات مختلفة للذاكرة ووحدة المعالجة المركزية، يمكنك إنشاء
سيناريوهات متعددة تستخدم قيمًا مختلفة لـ org.gradle.jvmargs
. بالنسبة
على سبيل المثال، يمكنك إنشاء سيناريوهات:
# <root-project>/scenarios.txt
clean_build_2gb_4workers {
tasks = [":app:assembleDebug"]
gradle-args = ["--max-workers=4"]
jvm-args = ["-Xmx2048m"]
cleanup-tasks = ["clean"]
}
clean_build_parallelGC {
tasks = [":app:assembleDebug"]
jvm-args = ["-XX:+UseParallelGC"]
cleanup-tasks = ["clean"]
}
clean_build_G1GC_4gb {
tasks = [":app:assembleDebug"]
jvm-args = ["-Xmx4096m", "-XX:+UseG1GC"]
cleanup-tasks = ["clean"]
}
يجري تنفيذ العملية gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt
.
ثلاثة سيناريوهات، وسوف تتمكن من مقارنة المدة
يستغرق :app:assembleDebug
لكل إعداد من هذه الإعدادات.
تحليل إصدارات المكوّن الإضافي المختلفة لنظام Gradle
لمعرفة كيف يؤثر تغيير إصدار مكوّن Gradle الإضافي إنشاء سيناريو، وإنشاء سيناريو لقياس ذلك. يتطلب هذا بعض التحضير لجعل إصدار المكون الإضافي قابلاً لإدخاله من السيناريو. تغيير الجذر Build.gradle:
# <root-project>/build.gradle
buildscript {
def agpVersion = providers.systemProperty("agpVersion").forUseAtConfigurationTime().orNull ?: '4.1.0'
ext.kotlin = providers.systemProperty('kotlinVersion').forUseAtConfigurationTime().orNull ?: '1.4.0'
dependencies {
classpath "com.android.tools.build:gradle:$agpVersion"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin"
}
}
يمكنك الآن تحديد المكوّن الإضافي لنظام Gradle المتوافق مع Android والمكوّن الإضافي Kotlin Gradle من ملف السيناريوهات، وإضافة السيناريو بطريقة جديدة إلى ملفات المصدر:
# <root-project>/scenarios.txt
non_abi_change_agp4.1.0_kotlin1.4.10 {
tasks = [":app:assembleDebug"]
apply-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
System-properties {
"agpVersion" = "4.1.0"
"kotlinVersion" = "1.4.10"
}
non_abi_change_agp4.2.0_kotlin1.4.20 {
tasks = [":app:assembleDebug"]
apply-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
System-properties {
"agpVersion" = "4.2.0-alpha16"
"kotlinVersion" = "1.4.20"
}
إنشاء ملف تعريفي للإصدار التزايدي
معظم الإصدارات تدريجية، ما يجعلها واحدة من أهم السيناريوهات المختلفة. يتمتع محلل Gradle بدعم مكثف تحديد ملامح البناء التزايدي. قادر على تطبيق التغييرات على ملف مصدر تلقائيًا من خلال تغيير نص الطريقة أو إضافة طريقة جديدة أو تغيير تنسيق أو مورد سلسلة. بالنسبة مثلاً، يمكنك إنشاء سيناريوهات متزايدة مثل:
# <root-project>/scenarios.txt
non_abi_change {
tasks = [":app:assembleDebug"]
apply-non-abi-change-to = ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
}
abi_change {
tasks = [":app:assembleDebug"]
apply-abi-change-to = ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
}
layout_change {
tasks = [":app:assembleDebug"]
apply-android-layout-change-to = "app/src/main/res/your_layout_file.xml"
}
string_resource_change {
tasks = [":app:assembleDebug"]
apply-android-resource-value-change-to = "app/src/main/res/values/strings.xml"
}
يجري تنفيذ العملية gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt
.
سيتم إنشاء تقرير HTML الذي يضم بيانات قياس الأداء.
ويمكنك دمج سيناريوهات التزايد مع إعدادات أخرى، مثل حجم الذاكرة أو عدد العاملين، أو إصدار Gradle:
# <root-project>/scenarios.txt
non_abi_change_4g {
tasks = [":app:assembleDebug"]
apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
jvm-args = ["-Xmx4096m"]
}
non_abi_change_4g_8workers {
tasks = [":app:assembleDebug"]
apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
jvm-args = ["-Xmx4096m"]
gradle-args = ["--max-workers=8"]
}
non_abi_change_3g_gradle67 {
tasks = [":app:assembleDebug"]
apply-non-abi-change-to ["app/src/main/java/com/example/your_app/your_code_file.java,
"app/src/main/java/com/example/your_app/your_code_file.kt"]
jvm-args = ["-Xmx3072m"]
version = ["6.7"]
}
إنشاء ملف تعريفي لبنية نظيفة
من أجل قياس أداء إصدار نظيف، يمكنك إنشاء سيناريو تُستخدم لدفع تنفيذ ملف Gradle-profiler:
# <root-project>/scenarios.txt
clean_build {
tasks = [":app:assembleDebug"]
cleanup-tasks = ["clean"]
}
لتشغيل هذا السيناريو، استخدِم الأمر التالي:
gradle-profiler --benchmark --project-dir <root-project> --scenario-file scenarios.txt
استخدام خيار Gradle --profile
لإنشاء ملف تعريف تصميم وعرضه من سطر أوامر Gradle، نفذ الخطوات التالية:
- افتح نافذة سطر أوامر في جذر المشروع.
- عليك إجراء إنشاء نظيف من خلال إدخال الأمر التالي. أثناء الملف الشخصي
بنائك، فيجب عليك تنفيذ إنشاء نظيف بين كل إصدار ملف تعريف
لأنّ Gradle تتخطى المهام عندما لا يكون المدخلات إلى مهمة (مثل رمز المصدر)
التغيير. وبالتالي، دائمًا ما يعمل الإصدار الثاني بدون أي تغييرات في المدخلات بشكل أسرع لأن
لا تتم إعادة تشغيل المهام. لذا، فإن تنفيذ مهمة
clean
بين تصاميمك تضمن لك لمحة عن عملية الإنشاء بالكامل.// On Mac or Linux, run the Gradle wrapper using "./gradlew". gradlew clean
- تنفيذ إنشاء تصحيح أخطاء لإحدى نكهات منتجاتك، مثل سمة "dev" النكهة
مع العلامات التالية:
gradlew --profile --offline --rerun-tasks assembleFlavorDebug
-
--profile
: تفعِّل عملية إنشاء الملفات التعريفية. -
--offline
: يمنع Gradle من الجلب على الإنترنت والتبعيات لديك. وهذا يضمن أنها تضمن عدم حدوث أي تأخيرات بسبب Gradle أن محاولة تحديث تبعياتك لا تتداخل مع بيانات تحديد المواصفات. يُفترض أن تكون قد أنشأت بالفعل مشروعك مرة واحدة لجعل التأكد من تنزيل Gradle بالفعل وتخزين التبعيات المخزنة مؤقتًا. -
--rerun-tasks
: فرض إعادة تشغيل جميع المهام وتجاهلها في Gradle أي تحسينات للمهام.
-
-
بعد اكتمال عملية الإنشاء، استخدِم نافذة المشروع للانتقال إلى الدليل
project-root/build/reports/profile/
(بتنسيق كما هو موضح في الشكل 1). -
انقر بزر الماوس الأيمن على الملف
profile-timestamp.html
واختَره. فتح في المتصفح > الخيار التلقائي: يجب أن يبدو التقرير مشابهًا للتقرير كما هو موضح في الشكل 2. يمكنك فحص كل علامة تبويب في التقرير لمعرفة المزيد مثل علامة التبويب تنفيذ المهام التي توضح المدة التي استغرقها Gradle لتنفيذ كل مهمة إنشاء. -
اختياري: قبل إجراء أي تغييرات على مشروعك أو إنشاء التهيئة، فكرر الأمر في الخطوة 3، ولكن احذف علم
--rerun-tasks
نظرًا لأن Gradle تحاول توفير الوقت من خلال إعادة تنفيذ المهام التي لم تتغير إدخالاتها (تتم الإشارة إلى هذهUP-TO-DATE
في علامة التبويب تنفيذ المهمّة في التقرير، كما هو موضّح. في الشكل 3)، يمكنك تحديد المهام التي تؤدي عملاً عندما لا ينبغي أن يكون. على سبيل المثال، إذا كانت قيمة لم يتم وضع علامة على ":app:processDevUniversalDebugManifest
" بأنّهUP-TO-DATE
، قد يشير ذلك إلى أنّ إعدادات تصميمك هي تعديل البيان ديناميكيًا مع كل إصدار ومع ذلك، تحتاج بعض المهام إلى سيتم تنفيذها أثناء كل عملية إنشاء، مثل:app:checkDevDebugManifest
.
والآن بعد أن أصبح لديك تقرير إنشاء ملف شخصي، يمكنك البدء في البحث عن
فرص التحسين عن طريق فحص المعلومات في كل علامة تبويب
إبلاغ. يجب تجربة بعض إعدادات الإصدار لأنّ مزاياها قد
بين المشروعات ومحطات العمل. على سبيل المثال، قد تتضمن المشروعات ذات
قاعدة الرموز البرمجية قد تستفيد من تقليص الرموز
لإزالة الرموز غير المستخدَمة وتقليص حجم التطبيق ومع ذلك،
فقد تستفيد المشروعات أكثر من تعطيل تقليص التعليمات البرمجية تمامًا. بالإضافة إلى ذلك،
زيادة حجم كومة الذاكرة المؤقتة Gradle (باستخدام
org.gradle.jvmargs
) قد تؤثر سلبًا في الأداء على الأجهزة ذات الذاكرة المنخفضة.
بعد إجراء تغيير على تهيئة تصميمك، يُرجى ملاحظة نتائج التغييرات من خلال تكرار الخطوات أعلاه وإنشاء ملف إنشاء جديد. على سبيل المثال، يعرض الشكل 4 تقريرًا لعيّنة التطبيق نفسها بعد تطبيق النموذج. بعض التحسينات الأساسية الموضّحة في هذه الصفحة.