نظرة عامة على إنشاء Gradle

يتم عادةً إنشاء تطبيقات Android باستخدام نظام الإنشاء Gradle. قبل التعرّف على تفاصيل كيفية ضبط عملية الإنشاء، سنستكشف المفاهيم الأساسية لعملية الإنشاء حتى تتمكّن من فهم النظام بشكل كامل.

ما هو الإصدار؟

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

تتضمّن المهام أوامر تحوّل المدخلات إلى مخرجات. تحدِّد الإضافات المهام وإعداداتها. يؤدي تطبيق إضافة إلى عملية الإنشاء إلى تسجيل مهامها وربطها ببعضها البعض باستخدام مدخلاتها ومخرجاتها. على سبيل المثال، سيؤدي تطبيق المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) على ملف التصميم إلى تسجيل جميع المهام اللازمة لإنشاء حزمة APK أو مكتبة Android. يتيح لك المكوّن الإضافي java-library إنشاء ملف jar من رمز مصدر Java. تتوفّر مكوّنات إضافية مشابهة للغة Kotlin ولغات أخرى، ولكن المكوّنات الإضافية الأخرى تهدف إلى توسيع نطاق المكوّنات الإضافية. على سبيل المثال، تم تصميم المكوّن الإضافي protobuf لإضافة إمكانية استخدام بروتوكول buffer إلى المكوّنات الإضافية الحالية، مثل AGP أو java-library.

يُفضّل Gradle الاتفاقية على الضبط، لذا ستتضمّن المكوّنات الإضافية قيمًا تلقائية جيدة فور تثبيتها، ولكن يمكنك ضبط الإصدار بشكل أكبر من خلال لغة خاصة بالمجال (DSL) تعريفية. تم تصميم لغة DSL لتتيح لك تحديد ما تريد إنشاءه، بدلاً من كيفية إنشائه. تتولّى منطق الإضافات إدارة "كيفية" تنفيذ المهام. يتم تحديد هذا الإعداد في عدة ملفات إنشاء ضمن مشروعك (والمشاريع الفرعية).

يمكن أن تكون مدخلات المهام ملفات وأدلة بالإضافة إلى معلومات أخرى مشفّرة كأنواع Java (أعداد صحيحة أو سلاسل أو فئات مخصّصة). يمكن أن تكون النواتج عبارة عن دليل أو ملفات فقط لأنّه يجب كتابتها على القرص. يؤدي ربط مخرجات مهمة بمدخلات مهمة أخرى إلى ربط المهام ببعضها البعض، ما يعني أنّه يجب تنفيذ إحدى المهام قبل الأخرى.

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

ماذا يحدث عند تنفيذ إصدار Gradle؟

يتم تنفيذ عمليات إنشاء Gradle على ثلاث مراحل. ينفّذ كل من هذه المراحل أجزاء مختلفة من الرمز البرمجي الذي تحدّده في ملفات التصميم.

  • تحدّد مرحلة التهيئة المشاريع والمشاريع الفرعية التي سيتم تضمينها في عملية الإنشاء، كما تعمل على إعداد مسارات الفئات التي تحتوي على ملفات الإنشاء والمكوّنات الإضافية المستخدَمة. تركّز هذه المرحلة على ملف إعدادات تحدّد فيه المشاريع التي تريد إنشاءها والمواقع التي تريد استرداد المكوّنات الإضافية والمكتبات منها.
  • تسجّل عملية الإعداد مهامًا لكل مشروع، وتنفّذ ملف الإصدار لتطبيق مواصفات الإصدار الخاصة بالمستخدم. من المهم معرفة أنّ رمز الإعداد لن يتمكّن من الوصول إلى البيانات أو الملفات التي تم إنشاؤها أثناء التنفيذ.
  • التنفيذ هو الذي ينفّذ عملية "إنشاء" تطبيقك. يكون الناتج من عملية الإعداد رسمًا بيانيًا موجّهًا لا دوري (DAG) للمهام، يمثّل جميع خطوات الإنشاء المطلوبة التي طلبها المستخدم (المهام المقدَّمة في سطر الأوامر أو كقيم تلقائية في ملفات الإنشاء). يمثّل هذا الرسم البياني العلاقة بين المهام، سواء كانت العلاقة واضحة في تعريف المهمة أو مستندة إلى مدخلاتها ومخرجاتها. إذا كانت إحدى المهام تتضمّن إدخالاً يمثّل مخرجات مهمة أخرى، يجب تنفيذها بعد المهمة الأخرى. تنفّذ هذه المرحلة المهام القديمة بالترتيب المحدّد في الرسم البياني، وإذا لم تتغيّر مدخلات إحدى المهام منذ آخر تنفيذ لها، سيتخطّاها Gradle.

لمزيد من المعلومات، اطّلِع على دورة حياة الإصدار في Gradle.

لغات DSL للإعداد

يستخدم Gradle لغة خاصة بالنطاق (DSL) لإعداد عمليات الإنشاء. يركّز هذا الأسلوب التقريري على تحديد البيانات بدلاً من كتابة تعليمات مفصّلة (إلزامية). يمكنك كتابة ملفات الإصدار باستخدام Kotlin أو Groovy، ولكن ننصحك بشدة باستخدام Kotlin.

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

على سبيل المثال، قد يبدو إعداد جزء Android من الإصدار على النحو التالي:

Kotlin

android {
    namespace = "com.example.app"
    compileSdk {
        version = release(36) {
            minorApiLevel = 1
        }
    }
    // ...

    defaultConfig {
        applicationId = "com.example.app"
        minSdk {
            version = release(23)
        }
        targetSdk {
            version = release(36)