هيكل مشروع أندرويد
هيكل مشروع أندرويد
عندما يُنشئ Android Studio مشروعًا جديدًا، يُوجِد تخطيطًا محددًا للمجلدات يجب على كل مطوّر أندرويد فهمه. هذا التخطيط ليس عشوائيًا — فكل مجلد يرتبط بمفهوم في خط أنابيب البناء. معرفة مكان الأشياء والسبب يُخبرك بمكان إجراء التغييرات وما سيحدث حين تفعل ذلك.
المنظور العام للمشروع
في جذر المشروع ستجد طبقتين متمايزتين: مستوى المشروع ومستوى وحدة التطبيق. مشاريع أندرويد متعددة الوحدات افتراضيًا (حتى لو كان تطبيقك يحتوي على وحدة واحدة فقط). ملفا build.gradle وsettings.gradle الخارجيان ينتميان إلى مستوى المشروع، أما مجلد app/ فهو وحدة التطبيق الفعلية.
شجرة مصادر Java
يقع كل كود التطبيق تحت app/src/main/java/ في هرمية حزم Java المعتادة. يُنشئ Android Studio حزمة افتراضية بناءً على معرّف التطبيق (Application ID) الذي أدخلته عند إنشاء المشروع (مثلًا com.example.myapp). كل Activity وFragment وService وBroadcastReceiver وفئة مساعدة تكتبها تذهب إلى هنا.
applicationId في build.gradle مستقلّان، لكن إبقاءهما متطابقَين يتجنّب الالتباس. معرّف التطبيق هو ما يُميّز تطبيقك على متجر Play وعلى الجهاز؛ لا يمكنك تغييره بعد النشر.
مجلد res/
يفصل أندرويد الكود عن الموارد. كل شيء بصري أو قابل للإعداد — تخطيطات وصور وألوان ونصوص — يقع ضمن res/ في مجلدات فرعية مُسمّاة حسب نوعها. يُجمّع نظام البناء كل مورد إلى معرّف رقمي ويُولّد فئة R حتى يتمكّن كود Java من الإشارة إلى الموارد بالاسم في وقت التجميع.
res/layout/— ملفات XML تصف التسلسل الهرمي للواجهة لكل شاشة أو fragment.res/values/— ملفات XML للقيم المسمّاة:strings.xmlوcolors.xmlوdimens.xmlوstyles.xml.res/drawable/— الرسوميات المتجهة وغيرها من الصور (PNG وملفات XML للأشكال).res/mipmap-*/— أيقونات مشغّل التطبيق بكثافات مختلفة (hdpi، xhdpi، xxhdpi …).res/menu/— تعريفات قوائم XML لقوائم الخيارات والقوائم السياقية.res/anim/— ملفات XML لحركات Tween.
الوصول إلى مورد نصي من Java يبدو كالتالي:
res/values/strings.xml وأشر إليها عبر R.string.*. هذا هو أساس التوطين — إضافة res/values-ar/strings.xml للعربية كل ما يلزم لدعم لغة جديدة.
AndroidManifest.xml
يُعدّ AndroidManifest.xml في المسار app/src/main/AndroidManifest.xml الملف الإعدادي الأهم في مشروعك. قبل أن ينفّذ نظام أندرويد أي مكوّن من مكوّنات تطبيقك، يجب تصريح ذلك المكوّن هنا. يُعلن الملف أيضًا عن:
- اسم حزمة التطبيق (يُستخدم لحلّ أسماء الفئات النسبية).
- كل
<activity>و<service>و<receiver>و<provider>في التطبيق. - نشاط المشغّل (Launcher Activity) — الذي يبدأ حين يضغط المستخدم على الأيقونة — عبر
<intent-filter>يحمل الإجراءMAINوالفئةLAUNCHER. - الأذونات التي يحتاج التطبيق من المستخدم (
<uses-permission>). - الحد الأدنى وإصدار SDK المستهدف (عبر
<uses-sdk>، وإن كانت هذه الأيام تُحدَّد في Gradle عادةً).
<intent-filter> تعيين android:exported="true" أو "false". إغفال هذا يتسبّب في فشل البناء. نشاط المشغّل يكون دائمًا exported="true"؛ أما الأنشطة الداخلية التي يبدأها تطبيقك فقط فينبغي أن تكون exported="false".
نظام بناء Gradle
يستخدم أندرويد Gradle أداةً للبناء. ثمة سكريبتا بناء يجب عليك فهمهما: سكريبت مستوى المشروع وسكريبت مستوى الوحدة.
build.gradle على مستوى المشروع — يُعلن عن إضافات Gradle المتاحة لجميع الوحدات. نادرًا ما تُعدّل هذا الملف فيما عدا إضافة إضافة جديدة إلى classpath.
app/build.gradle على مستوى الوحدة — هنا تقضي معظم وقتك. يتحكّم في إصدارات Android SDK وإعدادات التوقيع وكل تبعيات المكتبات التي يستخدمها تطبيقك.
الإعدادات الأساسية لفهمها:
- compileSdk — إصدار SDK الذي يستخدمه المُجمِّع. اضبطه على أحدث إصدار مستقر حتى تتمكن من استخدام واجهات API الجديدة في وقت التجميع (مع فحوصات وقت التشغيل للأجهزة الأقدم).
- minSdk — أقدم إصدار أندرويد سيعمل عليه تطبيقك. تخفيضه يوسّع جمهورك المحتمل لكنه يُقيّد واجهات API التي يمكنك استدعاؤها دون قيود.
- targetSdk — يُخبر أندرويد بنموذج السلوك الذي يتوقعه تطبيقك. كلّما رفعته، اخترت سلوكيات النظام الجديدة (مثل التخزين المحدود النطاق وأذونات الإشعارات). تُلزم Google Play التطبيقات باستهداف SDK حديث.
- applicationId — المعرّف الفريد لتطبيقك على متجر Play. لا يمكن تغييره بعد النشر.
implementation تعني أن المكتبة متاحة لوحدتك لكنها لا تُعرَّض للوحدات الأخرى التي تعتمد على وحدتك — وهو الخيار الصحيح لكل تبعية تقريبًا. testImplementation تُضيف مكتبة لاختبارات الوحدة على JVM فقط؛ أما androidTestImplementation فللاختبارات المزوّدة (على الجهاز) فقط. أبقِ مكتبات الاختبار بعيدةً عن classpath الرئيسية.
settings.gradle
يُخبر ملف settings.gradle في جذر المشروع Gradle بالوحدات الموجودة. في التطبيقات أحادية الوحدة يحتوي ببساطة على:
حين تُضيف وحدة مكتبة أو وحدة ميّزة إلى مشروعك، تُضيف سطر include ':moduleName' آخر هنا وتُنشئ المجلد المقابل.
الخلاصة
هيكل مشروع أندرويد هو فصل متعمّد للاهتمامات: تُجمّع مصادر Java منطقك، ويُخرج res/ كل ما يتغيّر بحسب اللغة أو كثافة الشاشة، ويُسجّل AndroidManifest.xml مكوّناتك مع نظام التشغيل، وتربط سكريبتات Gradle كل ذلك معًا في APK أو AAB. في الدرس القادم ستُنشئ Activity وتربطها بتخطيط، مستفيدًا مباشرةً من هذه المجلدات.