المصدر: https://gradle.org/wp-content/uploads/2016/03/Build-Performance-Gradle.png

كيف تقلل وقت بناء Gradle الخاص بك بنسبة 65 ٪؟

Gradle هو نظام بناء قوي للغاية. يتعامل مع العملية المعقدة للغاية لبناء ملفات .dx من شفرة مصدر java ، ودمج جميع الموارد والأصول في حزمة التطبيق (.apk) وتوقيع الطلب.

لكن الدرج ليس مثاليًا. إنه أبطأ نسبيًا من أنظمة البناء الأخرى الموجودة هناك.

لماذا يجب أن تهتم بوقت بناء مشروعك؟

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

الآن ، دعنا نفترض أنك تعمل في مشروع تطبيق I / O'16 أعلاه لمدة 6 ساعات يوميًا وقم بتشغيل gradle build لتثبيت ملف apk debug على جهاز الاختبار الخاص بك لمدة 15 مرة تقريبًا ، ستقضي 35 دقيقة يوميًا وحوالي 3 ساعات أسبوعيًا (حوالي 10٪ من إجمالي الوقت) مجرد الجلوس في وضع الخمول ومشاهدة بناء الركض.

لهذا السبب من المهم للغاية تحسين توقيت البناء. كلما قل الوقت الذي تقضيه في مشاهدة اللعبة بناء مشروعك ، يمكنك أن تكون أكثر إنتاجية. بعد كل شيء ، الوقت ثمين.

لقد طبقت بعض التعديلات في عملية الإنشاء الخاصة بي لتقليل وقت الإنشاء ، وفيما يلي بعض النصائح التي تساعدك على تقليل توقيتات الإنشاء الخاصة بك.

هنا على سبيل المثال الغرض ، سوف نستخدم تطبيق Google I / O كمشروع عينة. سنقوم بتشغيل جميع المعايير في هذا المشروع. يحتوي هذا المشروع على أكثر من 28 تبعيات ومراجع أسلوب 41538. أيضا ، شفرة المصدر للتطبيق متاحة علنا ​​على جيثب.

إخراج anlyser APK لتطبيق Google I / O 16

بناء دون أي تعديلات:

لنقيس الوقت اللازم لإنشاء التطبيق وتصحيحه من المشروع باستخدام التكوين الحالي باستخدام الأمر أدناه.

./gradlew android: assembleDebug - ملف التعريف
- سيقول الملف الشخصي gradle لقياس الوقت المستغرق لتنفيذ كل مهمة وتفريغ تلك البيانات في ملف HTML. يمكنك العثور على هذا التقرير ضمن / projectDir / build / reports / profile profile.
  • كما ترى ، فإن الأمر يستغرق دقيقتين و 43 ثانية لإنشاء apk debug من المصدر على جهازي. الحفاظ على هذا الرقم في عقلك.
قد تختلف هذه الأوقات المرجعية على جهازك وفقًا لتكوين النظام لديك. أنا هنا سأستخدم جهاز Macbook Pro 2016 بحجم 13 بوصة مع شريط اللمس لتشغيل جميع هذه المهام.

الآن ، دعونا نحاول تقليل هذه المرة.

دورة بناء Gradle:

يحتوي Gradle على ثلاث مراحل متميزة في دورة حياة الإنشاء:

  1. التهيئة: في هذه المرحلة من دورة حياة البناء ، يختار gradle المشروع ويقرر الأشياء التي سيتم بنائها.
  2. التكوين: هنا ، سيقوم gradle بتقييم البرنامج النصي للبناء الخاص بك ، وتكوين جميع الإضافات وتقييم الرسم البياني للمهمة.
  3. التنفيذ: في هذه المرحلة ، يتم تشغيل جميع المهام التي تم تقييمها في المرحلة السابقة لإنجاز العمل وإنشاء التطبيق.

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

لذلك ، كيف يمكننا قياس الوقت المستغرق لتنفيذ المرحلتين الأوليين؟ لحسن الحظ ، يوفر gradle - أمر تشغيل جاف ، يُخبر gradle بتقييم المشروع ولكن لا تقوم بأي مهمة. وبالتالي لن يتم تنفيذ مرحلة التنفيذ. لذلك ، قم بتشغيل هذا الأمر في المحطة الطرفية:

./gradlew android: assembleDebug - dry-run --profile

هنا هو الوقت الذي تستغرقه المرحلة الأولى على مشروع Google I / O.

بناء توقيت ل - المدى الجاف

يمكنك أن ترى في الإحصائيات المذكورة أعلاه أن المهارة قد مرت حوالي 7.8 ثانية فقط لتهيئة المشروع وتكوينه. هذا هو مضيعة للوقت تماما بالنسبة لنا.

دعنا نرى ما إذا كنا نستطيع تقليل الوقت المستغرق لتهيئة المشروع وتكوينه.

تكوين عند الطلب:

يحتوي تطبيق I / O من Google على مكونين / وحدات:

  • Android: يحتوي على شفرة المصدر المتعلقة بتطبيق andorid و
  • الخادم: يحتوي هذا الرمز على خادم الخلفية.

الآن ، إذا كنت بصدد إنشاء تطبيق Android ، فأنت لا تريد تكوين مكون الخادم. حق؟ لكن الإحصاء السابق يظهر أن gradle مرت ثانية تقريبًا لتكوين مكون الخادم فقط.

يوفر Gradle - علامة التهيئة عند الطلب ، والتي ستخبر gradle ببناء المشاريع التي تحتاج إلى بنائها فقط. لنقم بتشغيل هذا الأمر.

./gradlew android: assembleDebug - تشغيل سريع - ملف تعريف - تكوين حسب الطلب
بناء timimgs مع - تكوين عند الطلب

كما ترون ، إذا استخدمنا - config-on-demand ، فإن gradle سيتخطى تكوين وحدة الخادم وسيخفض وقت الإنشاء بمقدار ثانية تقريبًا. أعلم أن هذا ليس مكسبًا كبيرًا ، لكن القطرات الصغيرة يمكن أن تملأ البحيرة بأكملها !!!

انخفض الوقت: 1 ثانية (فوز 6 ٪).

كيف يمكنك تمكين التهيئة عند الطلب في android studio؟

يمكنك تمكين - التهيئة عند الطلب لكل بناء يمكنك إضافته org.gradle.configureondemand = true في ملف gradle.properties أو في استوديو android الخاص بك ، انتقل إلى التفضيلات> إنشاء ، تنفيذ ، نشر> مترجم وتحقق من التهيئة عند الطلب اختيار.

تمكين - التهيئة عند الطلب في Android Studio

تمكين البرنامج الخفي:

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

لن تكون قادرًا على رؤية فارق التوقيت في أول تصميم لك ، حيث يتعين على gradle التهيئة والبدء في البرنامج الخفي ، ولكن ستنخفض أوقات الإنشاء في الإنشاءات اللاحقة حيث تمت تهيئة daemon gradle بالفعل.

./gradlew android: assembleDebug - تشغيل سريع - ملف شخصي - تكوين حسب الطلب - daemon
بناء الوقت مع تمكين الخفي الدرجات

في حالتنا ، يتم تقليل وقت البناء بحوالي 4.5 ثواني. يا هلا!

انخفض الوقت بنسبة: 4.5 ثانية (71٪ فوز)

كيف يمكنك تمكين البرنامج الخفي في android studio؟

إذا كنت تستخدم إصدار gradle 3.0 أو أعلى ، فسيتم تمكين البرنامج الخفي للمجلد افتراضيًا. ولكن ، إذا كنت تعمل على إصدارات قديمة من gradle ، فيمكنك تمكينها لكل بناء بإضافة org.gradle.daemon = true في ملف gradle.properties الخاص بك.

احتفظ دائمًا بمحدثك:

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

لذلك ، تأكد دائمًا من أنك تستخدم أحدث إصدار من gradle. يمكنك الانتقال إلى /gradle/wrapper/gradle-wrapper.properties وترقية إصدار gradle عن طريق تغيير distributionUrl.

أثناء كتابة هذا المقال ، فإن أحدث إصدار لـ gradle هو 3.3. هنا هو الملف المحدّث لـ gradle-wrapper.properties لتطبيق I / O.

gradle-wrapper.properties
./gradlew android: assembleDebug - تشغيل سريع - ملف شخصي - تكوين حسب الطلب - daemon
بناء توقيت مع Gradle 3.3
انخفض الوقت بنسبة: 0.7 ثانية (82٪ فوز )

حتى الآن حققنا مكسبًا تقريبًا 82٪ في توقيت التهيئة والتهيئة. الآن ، دعونا نحاول تقليل الوقت المطلوب في مرحلة التنفيذ.

زيادة حجم الكومة:

منذ android studio 2.0 ، يستخدم gradle dex في هذه العملية لتقليل توقيت إنشاء المشروع.

"Dex in process" هي عملية تسمح بتشغيل عدة عمليات dex للتشغيل داخل VM واحد والتي يتم مشاركتها أيضًا مع gradle.

بشكل عام ، أثناء إنشاء التطبيقات ، تعمل عمليات dx المتعددة على مثيلات VM مختلفة.

عمليات dx متعددة تعمل على أجهزة VM مختلفة. (المصدر: https://www.youtube.com/watch؟v=-SY5nkNVUn0)

ولكن بدءًا من Android Studio 2.0 ، يتم تشغيل جميع عمليات dx هذه في جهاز VM واحد ، كما تتم مشاركة VM أيضًا مع وحدة التحكم. (يجب أن يكون لديك إصدار أداة الإصدار 23.0.2 أو أعلى لتمكين التنفيذ المباشر في العملية.)

عمليات dx متعددة تعمل على VM واحد. (المصدر: https://www.youtube.com/watch؟v=-SY5nkNVUn0)

هذا يقلل من وقت البناء بشكل ملحوظ حيث تعمل جميع عمليات التنفيذ المباشر على مثيلات VM نفسها. ولكن هذا يتطلب ذاكرة أكبر لاستيعاب جميع عمليات التنفيذ المباشر والمهد. هذا يعني أنك تحتاج إلى زيادة حجم كومة الذاكرة المؤقتة المطلوبة من قبل البرنامج الخفي للمهد. بشكل افتراضي ، يبلغ حجم كومة الذاكرة الخفية حوالي 1 غيغابايت. يجب عليك زيادة حجم الكومة بإضافة سطر أسفل في gradle.properties.

org.gradle.jvmargs = -Xmx3072m -XX: MaxPermSize = 512m -XX: + HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8

يختلف حجم الكومة المطلوب من آلة إلى أخرى. بالنسبة لجهازي ، وجدت أن حجم كومة الذاكرة المؤقتة 3 جيجا مثالي. أي زيادة أخرى في حجم الكومة لا تؤثر على توقيت الإنشاء بشكل كبير.

الآن ، لنشغل بنية نظيفة بالكامل باستخدام الأمر التالي:

./gradlew android: assembleDebug - ملف تعريف - تكوين حسب الطلب - Daemon
بناء timimg مع حجم كومة أكبر.
تقليل الوقت بمقدار: دقيقة و 43 ثانية (فوز بنسبة 63٪) - من دقيقتين و 43 ثانية إلى دقيقة واحدة

بناء modularise والتوازي:

اسمح للمبنى ببناء مشروعك بالتوازي. إذا كان لديك وحدات متعددة في مشروعك ، فعن طريق تمكين ذلك ، يمكن للمركز تشغيل عمليات الإنشاء لوحدات مستقلة متوازية. هذا قد يقلل من وقت البناء بشكل كبير لمشاريع معقدة للغاية ومتعددة الوحدات.

يمكنك تمكين التوازي عن طريق إضافة org.gradle.parallel = true في ملف gradle.properties الخاص بك.

نظرًا لأن مشروعنا لا يحتوي على وحدات متعددة ، فإن بناء التوازي لن يحدث فرقًا كبيرًا.

بناء توقيت مع تمكين البناء الموازي
تقليل الوقت بمقدار: دقيقة و 45 ثانية (64.5٪ فوز)

أشياء صغيرة أخرى يجب تذكرها:

  • تجنب الحسابات الثقيلة ، مثل زيادة رمز الإصدار من أوامر git أو تنزيل بعض الملفات من عنوان url أثناء إنشاء المشروع. سيقضي Gradle وقتًا في إجراء تلك الحسابات أو عمليات الشبكة وسيؤثر ذلك على توقيت البناء.
  • لا تستخدم التبعية الديناميكية مثل ،
ترجمة "com.android.support:appcompat-v7:23.0.+"

إذا كنت تستخدم التبعيات الديناميكية ، فسوف يتم الدخول إلى الإنترنت والتحقق مما إذا كان هناك أي إصدار أحدث متاح للمكتبة أم لا؟ (معظم الوقت ، هو مجرد مضيعة للوقت البناء الثمين). بدلاً من ذلك ، استخدم التبعيات الثابتة وقم بتحديثها يدويًا من وقت لآخر.

ترجمة "com.android.support:appcompat-v7:23.0.2"

TL، DR:

ستضيف القصة القصيرة الطويلة ، الأسطر أدناه إلى ملف gradle.properties وستحصل على انخفاض بنسبة 65٪ تقريبًا في وقت الإنشاء.

~ إذا أعجبك المقال ، فانقر فوق أدناه حتى يتمكن المزيد من الأشخاص من رؤيته! يمكنك أيضًا متابعتي على "متوسط" أو "على مدونتي" ، بحيث يمكنك الحصول على تحديثات بخصوص مقالاتي المستقبلية !! ~

https://paypal.me/kpatel2106؟locale.x=en_GB