موضوع جانبي من درس أول تطبيق أندرويد.

يعني إيه Gradle؟

الـ Gradle هو نظام بناء تلقائي (Automation Build System).

إنك تعمل build للتطبيق يعني تحوّل اللي كتبته لحاجة الموبايل يقدر يسطّبها. ووظيفة Gradle الأساسية إنه يعمل automation لكل الخطوات المعقدة والروتينية دي: بياخد الكود (Kotlin أو Java) والملفات المساعدة (زي الصور وملفات الـ XML) ويحوّلهم لتطبيق نهائي قابل للتثبيت زي ملف الـ APK.

يعني Gradle بياخد الكود اللي إنت كاتبه مع الـ Android SDK ويحوّلهم لملف APK واحد جاهز للتثبيت.

قبل Gradle كان الوضع إزاي؟

زمان لما كنت تقرر تكتب تطبيق، كنت بتمشي على شوية خطوات بإيدك لحد ما توصل للمرحلة النهائية وهي الـ Publish:

  1. بتشوف التطبيق عبارة عن إيه، وتحدد الـ libraries اللي محتاجها (كود جاهز كاتبه حد تاني).
  2. كل library من دول محتاجة libraries تانية عشان تشتغل — دي الـ dependencies بتاعتها. وكنت بتدوّر عليهم manual في الـ repositories (مخازن الـ libraries على النت).
  3. بتكتب الكود، وبعدين تعدّيه بنفسك على Compiling → Testing → Publishing.
  4. وعشان ينفذوا الـ tasks دي، الـ developers كانوا بيكتبوا build scripts بنفسهم، وكانت بتبقى معقدة.

ومن هنا جه Gradle اللي سهّل كل الشغل ده بمراحله.

الـ Build Configuration

دي المرحلة اللي بتقول فيها لـ Gradle: “عايزك تبني التطبيق إزاي؟”

بتكتب إعدادات البناء جوه ملفات اسمها build.gradle (أو build.gradle.kts لو بتكتبها بـ Kotlin)، وبتحدد فيها حاجات زي:

  • الـ Plugins — إضافات بتعلّم Gradle شغلانات جديدة، زي الـ Android Application Plugin (هنتكلم عنه تحت في AGP).
  • الـ SDK Versions — التطبيق هيتبني على أنهي إصدار أندرويد:
    • compileSdk — الـ SDK Platform اللي بيتعمل بيها compile للتطبيق، وهي اللي بتحدد الـ APIs اللي كودك يقدر يستخدمها.
    • targetSdk — إصدار الأندرويد اللي التطبيق اتصمم واتجرّب عليه، والأندرويد بيظبط شوية من تصرفاته على أساسه.
    • (والـ minSdk — أقدم أندرويد يقدر يسطّب التطبيق — بيتحدد هنا برضه، واخترناه API 29 في أول تطبيق أندرويد.)
  • الـ Dependencies — الـ libraries اللي التطبيق محتاجها.
  • الـ Build Types — غالبًا اتنين:
    • debug — للتطوير، والـ Android Studio بيعمله sign أوتوماتيك بـ debug key، وبيبقى debuggable.
    • release — النسخة اللي بتنشرها.
  • الـ Signing Config — الـ key اللي بيتعمل بيه sign للـ APK لو عايز release موقّع. والأندرويد مش بيسطّب أي تطبيق غير لما يكون signed.

ببساطة: الـ Build Configuration هو المكان اللي بتقول فيه لـ Gradle كل التفاصيل عشان يعرف يعمل الـ build صح، من غير ما تكتب scripts يدوية معقدة.

الـ Dependency Management

دي واحدة من أقوى مميزات Gradle.

زمان كنت بتنزّل الـ libraries بنفسك من الـ repositories، وكمان بتدوّر يدوي على الـ Transitive Dependencies بتاعتها. الـ transitive dependency هي library المكتبة اللي إنت عايزها محتاجاها: لو تطبيقك محتاج library اسمها A، و A محتاجة B، يبقى B دي transitive dependency لتطبيقك.

دلوقتي بتعمل حاجة واحدة بس: بتكتب في build.gradle اسم المكتبة والإصدار اللي عايزه، كده:

dependencies {
    implementation("androidx.appcompat:appcompat:1.7.0")
}

و Gradle بيروح يدوّر عليها لوحده في الـ repositories (زي Maven Central أو Google’s Maven repository)، وينزّلها مع كل الـ transitive dependencies بتاعتها أوتوماتيك.

يعني Gradle بيديرلك كل حاجة اسمها Dependency Management من غير ما تتدخل.

الـ Tasks

الـ Task هي الوحدة الأساسية للشغل اللي Gradle بينفذه.

كل task بتعمل حاجة واحدة محددة، زي:

  • Compile للكود.
  • Package للـ APK.
  • تشغيل الـ Tests.
  • تنضيف الـ Build Folder.

لما تكتب في التيرمينال جوه فولدر المشروع حاجة زي:

./gradlew assembleDebug

إنت كده بتقول لـ Gradle ينفذ task اسمها assembleDebug، ودي بتعمل build للـ debug APK (وبيطلع افتراضيًا في app/build/outputs/apk/debug/).

الـ gradlew هو الـ Gradle Wrapper: script صغير جوه المشروع بينزّل ويشغّل نفس إصدار Gradle اللي المشروع متوقعه بالظبط، فمش محتاج تسطّب Gradle بنفسك. على Windows بتشغّل gradlew.bat (أو .\gradlew في PowerShell). ولما بتدوس Run أو Build في Android Studio، هو بيشغّل tasks زي دي بدالك.

و Gradle بيعرف الـ tasks الموجودة منين؟ من الـ plugins اللي ضفتها ومن الـ configuration اللي كتبتها.

الـ Build Lifecycle (دورة حياة البناء)

كل مرة Gradle بيعمل build، بيمشي على 3 مراحل رئيسية:

  1. Initialization بيقرا ملف settings.gradle ويحدد المشاريع (Modules) اللي داخلة في الـ build. الـ module هو جزء من المشروع ليه ملف build خاص بيه، والتطبيق البسيط بيبقى فيه module واحد اسمه app.

  2. Configuration بيقرا كل ملفات الـ build.gradle ويبني الـ Task Graph — يعني بيرتّب الـ tasks اللي هتتنفذ وإيه بيعتمد على إيه. مثلًا الـ package بتاع الـ APK معتمد إن الكود يتعمله compile الأول، فالـ compile لازم يتنفذ قبله.

  3. Execution بينفذ الـ tasks اللي إنت طلبتها بالترتيب الصح.

المراحل دي مهمة أكتر في المشاريع الكبيرة، لأن فهمها بيساعدك تكتب configuration كويسة وما تعملش حاجات بطيئة من غير داعي.

الـ Android Gradle Plugin (AGP)

الـ Gradle لوحده نظام بناء عام، مش مخصوص للأندرويد — بيعمل build لبرامج Java وسيرفرات وأنواع مشاريع كتير.

عشان كده جوجل عملت حاجة اسمها Android Gradle Plugin (AGP).

الـ plugin ده بيضيف لـ Gradle كل الـ tasks والأدوات الخاصة بالأندرويد، زي:

  • بناء الـ APK والـ AAB (الـ Android App Bundle — الصيغة اللي بترفعها على Google Play، وهو بيطلّع منها APK مناسب لكل جهاز).
  • التعامل مع الـ resources بتاعة التطبيق (الـ layouts والـ drawables يعني الصور).
  • الـ Multi-Dex — تقسيم كود التطبيق على كذا ملف DEX لما يبقى أكبر من إنه يتحط في ملف واحد.
  • الـ Build Variants — النسخ المختلفة اللي Gradle يقدر يبنيها من نفس المشروع، زي debug و release.
  • الـ Apply Changes — إنك تبعت التعديلات لتطبيق شغال من غير ما تسطّبه من الأول (وهو اللي جه مكان الـ Instant Run القديم).

لما تضيف الـ plugin ده في build.gradle، الـ Gradle بيتحول من نظام بناء عام لنظام بيفهم الأندرويد كويس جدًا.

الملفات الأساسية اللي بتتعامل معاها

  • settings.gradle — بيحدد أسماء الـ modules الموجودة في المشروع.
  • build.gradle (Project level) — إعدادات مشتركة لكل المشروع.
  • build.gradle (Module level) — إعدادات خاصة بكل module (زي الـ app module). وهنا بيبقى compileSdk و minSdk و targetSdk والـ dependencies.
  • gradle.properties — إعدادات عامة لـ Gradle نفسه، زي هو مسموحله ياخد memory قد إيه.
  • local.properties — بيتحط فيه مسار الـ Android SDK على جهازك. ولأن المسار ده بيختلف من جهاز للتاني، الملف ده مش بيتشارك على Git.

قبل Gradle كنت إنت المسؤول عن كل حاجة وبتعاني. دلوقتي Gradle هو المسؤول، وإنت بس بتكتبله الوصفة في الـ Build Configuration، وهو بيشتغل على كل الخطوات اللي كنت بتعملها قبل كده manual.