صباح الخير نبدأ الاثنين بمواد ، تم إعداد ترجمتها خصيصًا لطلاب الدورة
"Android-developer. دورة متقدمة .
"
لقد قمت مؤخرًا بترحيل قاعدة بيانات Android إلى
Kure على AndroidX. يبدو لي أن هذه فرصة عظيمة للعمل على سرعة بناء المشروع. لطالما كان ل Gradle سمعة سيئة بسبب البطء واستهلاك الموارد ، لكنني فوجئت للغاية أن التغييرات الطفيفة في تكوين التجميع يمكن أن تزيد من سرعتها بشكل كبير.
انظر إلى مقاييس مسح التجميع قبل / بعد التحسين
قبل التحسين
بعد التحسين ️️انخفضت من 5.5 دقيقة إلى
17 ثانية؟ اصبح مجنونليس من الصعب الإفراط في ذلك مع التحسين لتقليل وقت التجميع. ولكن من أجل جعل الوظيفة مفهومة للمبتدئين ، سأركز عن عمد على التدابير البسيطة وغير المؤلمة التي اتخذتها من أجل الاقتراب من هذا المؤشر.
بادئ ذي بدء!
قبل البدء في التحسين ، من المهم اختبار مشروعنا لمعرفة الوقت الذي يستغرقه إنشاءه. يحتوي Gradle على خيار مسح مناسب يمكنك استخدامه لتحليل أداء مهمتك. قم بتشغيل الجهاز في Android Studio ثم قم بتشغيل الأمر التالي:
./gradlew assembleDebug --scan
عند الانتهاء بنجاح من التجميع ، سيُطلب منك قبول شروط الخدمة لتنزيل نتائج المسح. أدخل
نعم للمتابعة. بعد اكتمال المنشور ، ستتلقى رابطًا إلى الجهاز للتحقق من الفحص. افتحه.
هناك عدد قليل من الخيارات على الموقع ، ولكن من أجل الإيجاز ، سننظر في الأمر الأكثر أهمية.يعرض الملخص معلومات موجزة حول المهام المكتملة ووقت الانتهاء منها. ولكن ما يهمنا هنا هو قسم
الأداء . يقوم بتفصيل أكثر تفصيلاً لوقت الإنشاء الكلي ، كما هو موضح أدناه.

في قسم "الأداء" ، توجد علامة تبويب "
إعدادات" و "اقتراحات" تقدم توصيات لتحسين سرعة البناء. دعنا ننظر إليهم.

في هذا القسم ، يمكننا إيجاد بعض الإصلاحات البسيطة لتحسين السرعة. لذلك ، دعنا نواصل ونطبق هذه التصحيحات في مشروعنا.
الخطوة رقم 1: أدوات الترقية
يعمل فريق Android على تحسين وتطوير نظام الإنشاء باستمرار. وبالتالي ، في معظم الحالات ، يمكنك الحصول على تحسن كبير عن طريق تثبيت أحدث إصدار من مجموعة الأدوات.
خلال عملية إعادة البناء هذه ، كان مشروعنا على
الإصدار 3.2.1 من المكون الإضافي Gradle لبرنامج Android Studio (
عدة إصدارات أقدم من الإصدار الأخير ).
يمكنك اتباع
هذا الرابط للحصول على أحدث إصدار من Gradle Plugin. في وقت كتابة هذا التقرير ، كان الأحدث هو
الإصدار 3.4.0.ولكن هناك نقطة هنا يجب أن نتذكرها:
( ملاحظة: عند استخدام الإصدار 5.0 من Gradle أو أعلى ، يتم تقليل الحجم الافتراضي لخفي Gradle من 1 غيغابايت إلى 512 ميجابايت. يمكن أن يؤدي ذلك إلى أداء رديء في البنية. لتجاوز هذا الإعداد الافتراضي ، حدد حجم الذاكرة لخفي Gradle في gradle.properties مشروعك.)https://developer.android.com/studio/releases/gradle-pluginعند استخدام Gradle 5.0 والإصدارات الأحدث ، سنحتاج إلى زيادة حجم الذاكرة بشكل صريح حتى لا تتدهور سرعة التصميم الخاصة بنا. سوف نعود إلى هذا في غضون دقيقة.افتح ملف
build.gradle ذي المستوى
الأعلى ، والذي ستجده في جذر مشروعك ، وأضف السطر التالي إلى
قسم التبعية :
classpath 'com.android.tools.build:gradle:3.4.0'
تحتاج أيضًا إلى تحديث
عنوان URL للتوزيع في ملف خصائص Gradle Wrapper الموجود في
gradle/wrapper/gradle-wrapper.properties
. تحديث URL إلى ما يلي.
(
سيكون هذا الرابط متاحًا على صفحة مكون Android Gradle الإضافي . )
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
سوف تواجه خطأ عند استخدام Kotlin إذا كان إصدار المكون الإضافي Kotlin Gradle أقل من
1.3.0. إذا كان الأمر كذلك ، استخدم تلميح أداة IDE لتحديث المكون الإضافي Gradle لـ Kotlin إلى أحدث إصدار (في وقت كتابة هذا التقرير ، هذا هو
الإصدار 1.3.31 ).
حسنًا ، فلنشغل الإنشاء مرة أخرى من الجهاز لمعرفة ما إذا كنا قد أجرينا أي تحسينات.

الخطوة رقم 2: تحديث التكوينات
لذلك ، كنا قادرين على خفض حوالي 2.5 دقيقة من وقت البناء ، ولكن هذا لا يزال غير جيد بما فيه الكفاية. بعد دراسة سجلات البناء في الجهاز ، صادفت سطرًا واحدًا من شأنه أن يثير اهتمامنا:
(> المهمة: التطبيق: compileDevelopDebugJavawithJavac
قد يعطل Gradle التحويل البرمجي الإضافي لأن معالجات التعليقات التوضيحية التالية ليست تدريجية: butterknife-compiler-10.1.0.jar (com.jakewharton: butterknife-compiler: 10.1.0)، dagger-compiler-2.9.jar (com.google. خنجر: خنجر مترجم: 2.9).
ضع في اعتبارك إعداد علامة android.enableSeparateAnnotationProcessing-true التجريبية في ملف gradle.properties لبدء معالجة التعليقات التوضيحية في مهمة منفصلة وأداء تجميع تدريجي.)التحويل البرمجي التزايدي بشكل أساسي يمنع التحويل المهدر لمجموعة كاملة من الملفات المصدر وبدلاً من ذلك يجمع فقط تلك الملفات التي تم تعديلها. من السجلات ، من الواضح أننا لا نستخدم هذه الوظيفة. يقترح أن نستخدم
android.enableSeparateAnnotationProcessing=true
، ولكن على أي حال ، يجب ألا نستخدم تكوين
"annotationProcessor" لأن Kotlin يُستخدم في مشروعنا.
لحسن الحظ ، يضيف
الإصدار 1.3.30 من Kotlin دعمًا للمعالجة التوضيحية للتعليقات التوضيحية.
https://kotlinlang.org/docs/reference/kapt.html(المعالجة التوضيحية للتعليقات التوضيحية (من 1.3.30)
بدءًا من الإصدار 1.3.30 ، يدعم
kapt
معالجة التعليقات التوضيحية الإضافية كدالة تجريبية. حاليًا ، لا يمكن إجراء معالجة التعليقات التوضيحية بشكل تدريجي إلا إذا كانت جميع معالجات التعليقات التوضيحية المستخدمة تدريجية.
لتمكين معالجة التعليقات التوضيحية الإضافية ، أضف هذا السطر إلى ملف
gradle.properties
:
kapt.incremental.apt=true
لاحظ أن معالجة التعليقات التوضيحية الإضافية تتطلب تمكين
الترجمة الإضافية أيضًا.)
لذلك ، لنبدأ:
- 1. تغيير التكوين annotationProcessor إلى kapt
- 2. قم بتمكين علامة معالجة التعليقات التوضيحية التجريبية
افتح ملف
build.gradle
الخاص بالوحدة الخاصة بك وأضف السطر التالي إلى أعلى الملف:
apply plugin: 'kotlin-kapt'
ثم قم بتغيير جميع تكوينات annotationProcessor في قسم التبعيات لاستخدام kapt. على سبيل المثال:
//
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
//
kapt 'com.google.dagger:dagger-compiler:2.9'
افتح الآن ملف
gradle.properties الموجود في جذر مشروعك وأضف السطر التالي:
kapt.incremental.apt=true
دعنا ندير البناء مرة أخرى.

حسنًا ، يبدو أننا حققنا بعض التقدم.
الخطوة رقم 3: خصائص Gradle
نحن في المرحلة الأخيرة. هل تتذكر الخدعة التي واجهناها أثناء تحديث إصدار المكون الإضافي Gradle؟ اتضح أن الإصدارات الأحدث من Gradle تقلل من حجم الذاكرة المستخدمة إلى 512 ميجابايت. هذا هو التأكد من أن الأجهزة الضعيفة لا تستهلك الكثير من الذاكرة. لديّ جهاز كمبيوتر يحتوي على 16 غيغابايت من ذاكرة الوصول العشوائي ، حتى أتمكن من إطعام حوالي 2-3 من العربات إلى البرنامج الخفي Gradle ، ولكن قد تختلف أرقامك.
افتح ملف
gradle.properties الموجود في جذر مشروعك وأضف السطر التالي. تأكد من اختيار الحجم الذي يناسب متطلباتك ومواصفات الكمبيوتر.
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
أثناء قيامنا بذلك ، لنقم أيضًا بتمكين التجميعات المتوازية والتوليف عند الطلب في الخصائص.
هذا ما يبدو عليه الإصدار الأخير من ملف
gradle.properties
:
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true kapt.incremental.apt=true
org.gradle.parallel
- تسمح هذه العلامة لـ Gradle بتجميع الوحدات النمطية داخل المشروع بشكل متوازٍ ، بدلاً من التسلسل. هذا مفيد فقط للمشاريع متعددة الوحدات.org.gradle.configureondemand
- تقوم هذه العلامة بتكوين الوحدات النمطية الضرورية للمشروع فقط ، ولا تجمعها جميعًا.
بعد القيام بذلك ، دعونا نرى ما لدينا الآن مؤشرات سرعة التجميع:


ها أنت ذا!
الملاحظات الختامية
هذا ليس بأي حال تغطية واسعة لجميع الطرق لتحسين سرعة التجميع. هناك العديد من الأشياء الأخرى التي لم أغطيها في هذا المنشور ، مثل استخدام minSdk 21 عند استخدام MultiDex ، والمكتبات السابقة للفهرسة ، وتعطيل ضغط PNG ، إلخ.
لكن معظم هذه التكوينات تتطلب فهمًا أعمق لنظام إنشاء Android وتجربة العمل مع المشروعات الكبيرة متعددة الوحدات (حيث تكون الفوائد أكثر وضوحًا). الخطوات التي ذكرتها أعلاه يتم تنفيذها بسهولة من قبل المطورين الصغار ولها فوائد كبيرة. آمل أن يكون هذا يساعدك على زيادة سرعة البناء!
نراكم في المرة القادمة ، السلام عليكم!