بناء تطبيق Flutter ونشره: APK و App Bundle والويب
تطبيقك يعمل على المحاكي وعلى هاتفك وهو موصول بالكمبيوتر. لكن كيف ترسله إلى صديق ليجربه؟ وكيف يصل إلى متجر Google Play؟ في هذا الدرس الأخير من الكورس ستتعلم الرحلة من مشروع على جهازك إلى ملف جاهز للتثبيت والنشر.
أوضاع التشغيل الثلاثة
Section titled “أوضاع التشغيل الثلاثة”Flutter يبني تطبيقك بثلاث طرق مختلفة، ولكل واحدة غرض:
| الوضع | الأمر | الغرض |
|---|---|---|
| Debug | flutter run |
التطوير: إعادة تحميل سريعة ورسائل أخطاء مفصلة، لكنه بطيء وحجمه كبير |
| Profile | flutter run --profile |
قياس الأداء على جهاز حقيقي |
| Release | flutter run --release |
النسخة النهائية: سريعة وصغيرة وبلا أدوات تطوير |
تخيّل وضع Debug مثل سيارة في ورشة: غطاء المحرك مفتوح وأجهزة الفحص موصولة، فهي مناسبة للإصلاح لا للسباق. ووضع Release هو السيارة نفسها بعد إغلاق الغطاء وخروجها إلى الطريق.
والشريط الأحمر المكتوب عليه «DEBUG» في زاوية الشاشة يظهر في وضع التطوير فقط، ويختفي تلقائياً في النسخة النهائية.
قبل البناء: هوية التطبيق
Section titled “قبل البناء: هوية التطبيق”اسم التطبيق
Section titled “اسم التطبيق”الاسم الذي يظهر تحت الأيقونة في الهاتف يتحدد لكل منصة في ملفها:
- أندرويد: في
android/app/src/main/AndroidManifest.xml، غيّر قيمةandroid:labelداخل وسمapplication. - iOS: في
ios/Runner/Info.plist، غيّر القيمة التي تحت المفتاحCFBundleDisplayName.
معرّف التطبيق
Section titled “معرّف التطبيق”لكل تطبيق في العالم معرّف فريد، مثل com.example.my_app. المتجر يميّز تطبيقك به، ولا يمكن تغييره بعد النشر. والصيغة المعتادة: اسم نطاقك معكوساً ثم اسم التطبيق، مثل com.yourname.notes. الأسهل أن تحدده عند إنشاء المشروع:
flutter create --org com.yourname notesرقم الإصدار
Section titled “رقم الإصدار”في pubspec.yaml:
version: 1.2.0+5- ما قبل
+هو اسم الإصدار الذي يراه المستخدم في المتجر:1.2.0. - ما بعد
+هو رقم البناء: رقم صحيح يجب أن يزيد مع كل نسخة ترفعها إلى المتجر، حتى لو لم يتغير اسم الإصدار. المتجر يرفض ملفاً رقم بنائه مستخدم من قبل.
الأيقونة
Section titled “الأيقونة”الأيقونة الافتراضية هي شعار Flutter. لتغييرها يدوياً تحتاج عشرات الصور بأحجام مختلفة لكل منصة. الأسهل استخدام حزمة flutter_launcher_icons: تعطيها صورة واحدة مربعة بحجم 1024×1024، وهي تولّد كل الأحجام.
dev_dependencies: flutter_launcher_icons: ^0.14.0
flutter_launcher_icons: android: true ios: true image_path: "assets/icon/icon.png"ثم نفّذ:
flutter pub getdart run flutter_launcher_iconsلاحظ أن الحزمة تحت dev_dependencies، لأنها أداة تستخدمها أنت أثناء التطوير، ولا تدخل في التطبيق النهائي. وراجع صفحة الحزمة في pub.dev لمعرفة أحدث إصدار وباقي الإعدادات.
بناء APK
Section titled “بناء APK”ملف APK هو ملف تثبيت تطبيقات أندرويد. ترسله لأي شخص فيثبته مباشرة.
flutter build apk --releaseبعد انتهاء البناء تجد الملف في:
build/app/outputs/flutter-apk/app-release.apkهذا الملف يحتوي على نسخ لكل أنواع معالجات الهواتف، فيكون حجمه كبيراً. لتحصل على ملف أصغر لكل نوع:
flutter build apk --split-per-abiينتج ثلاثة ملفات، وأشهرها app-arm64-v8a-release.apk الذي يعمل على أغلب الهواتف الحديثة.
App Bundle: صيغة المتجر
Section titled “App Bundle: صيغة المتجر”متجر Google Play لا يقبل APK للتطبيقات الجديدة، بل يطلب صيغة Android App Bundle بالامتداد .aab:
flutter build appbundleوالملف الناتج في:
build/app/outputs/bundle/release/app-release.aabالفرق: الـ Bundle لا يُثبَّت مباشرة. ترفعه إلى المتجر، والمتجر يولّد منه لكل مستخدم ملفاً مناسباً لهاتفه بالضبط، فيكون التنزيل أصغر.
| APK | App Bundle | |
|---|---|---|
| الامتداد | .apk |
.aab |
| يُثبَّت مباشرة على الهاتف | نعم | لا |
| مناسب لـ | الإرسال المباشر والتجربة | الرفع إلى Google Play |
توقيع التطبيق
Section titled “توقيع التطبيق”قبل النشر على المتجر يجب توقيع التطبيق بمفتاح رقمي يخصك. التوقيع يثبت أن التحديثات القادمة منك أنت وليست من شخص ينتحل تطبيقك.
تخيّله مثل ختم الشركة على مستنداتها: أي ورقة بلا الختم مرفوضة.
الخطوات باختصار:
- تنشئ ملف مفاتيح (Keystore) مرة واحدة بأداة
keytoolالتي تأتي مع Java. - تكتب مسار الملف وكلمات مروره في ملف
android/key.properties. - تعدّل ملف
android/app/build.gradle.ktsليقرأ هذه القيم ويوقّع بها نسخة release.
التفاصيل الدقيقة تتغير قليلاً بين إصدارات Flutter، فاتبعها من الصفحة الرسمية: ابحث عن «Build and release an Android app» في توثيق Flutter.
النشر على الويب
Section titled “النشر على الويب”نفس الكود يعمل موقعاً:
flutter build webالنتيجة مجلد build/web فيه ملفات ثابتة: index.html وملفات JavaScript. ترفع هذا المجلد إلى أي استضافة ملفات ثابتة، مثل Firebase Hosting أو GitHub Pages أو Cloudflare Pages، فيعمل تطبيقك في المتصفح.
وماذا عن iOS؟
Section titled “وماذا عن iOS؟”بناء تطبيقات iPhone يحتاج جهاز Mac عليه برنامج Xcode، وحساب مطوّر مدفوعاً من Apple للنشر على App Store. الأمر هو flutter build ipa، والرفع يتم عبر Xcode. إذا لم يكن عندك Mac فابدأ بأندرويد والويب، فالكود نفسه سيعمل على iOS عندما تتوفر لك الأدوات.
الطريق إلى Google Play
Section titled “الطريق إلى Google Play”- أنشئ حساب مطوّر في Google Play Console. يُدفع رسم تسجيل مرة واحدة.
- أنشئ تطبيقاً جديداً، واملأ بياناته: الاسم والوصف ولقطات الشاشة والأيقونة.
- أجب عن استبيانات المحتوى والخصوصية، وأضف رابط سياسة الخصوصية.
- ارفع ملف
.aabالموقّع. - أرسل التطبيق للمراجعة، وانتظر الموافقة.
المتجر يطلب غالباً فترة اختبار مغلق مع مجموعة من المختبرين قبل السماح بالنشر العام للحسابات الجديدة. اقرأ الشروط الحالية في صفحة المساعدة الخاصة بـ Play Console، لأنها تتغير من وقت لآخر.
قائمة فحص قبل النشر
Section titled “قائمة فحص قبل النشر”- معرّف التطبيق ليس
com.example. - اسم التطبيق وأيقونته صحيحان.
- رقم البناء أكبر من النسخة السابقة.
- الأذونات المطلوبة موجودة في
AndroidManifest.xml. - جرّبت نسخة release على هاتف حقيقي.
- التطبيق يتعامل مع انقطاع الإنترنت بلا توقف.
- ملف المفاتيح محفوظ في مكان آمن وخارج Git.
جرّب بنفسك
Section titled “جرّب بنفسك”- شغّل أحد مشاريعك بالأمر
flutter run --releaseوقارن سرعته بوضع التطوير. - ابنِ ملف APK لتطبيق الملاحظات، وانقله إلى هاتفك وثبّته.
- غيّر اسم التطبيق في
AndroidManifest.xmlوأعد البناء. - تحدٍّ: نفّذ
flutter build web، وافتح المجلد الناتج بخادم محلي بسيط، وجرّب تطبيقك في المتصفح.
أخطاء شائعة
Section titled “أخطاء شائعة”- إرسال نسخة debug للمستخدمين: بطيئة وحجمها كبير وعليها شريط DEBUG. استخدم
--releaseدائماً. - نسيان زيادة رقم البناء: يرفض المتجر الملف برسالة أن رقم الإصدار مستخدم.
- رفع ملف المفاتيح إلى مستودع عام: أي شخص يحصل عليه يستطيع توقيع تطبيقات باسمك.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما الصيغة التي يطلبها متجر Google Play للتطبيقات الجديدة؟
المتجر يستقبل .aab ويولّد منه ملف تثبيت مناسباً لكل جهاز. أما APK فللتثبيت المباشر والتجربة.
سؤال
في السطر version: 2.1.0+14 داخل pubspec.yaml، ماذا يمثل الرقم 14؟
ما بعد + هو رقم البناء، ويجب أن يكون أكبر من كل الأرقام السابقة التي رُفعت إلى المتجر.
الخلاصة
Section titled “الخلاصة”- وضع Debug للتطوير فقط، و Release للنسخة النهائية السريعة.
- جهّز الهوية قبل البناء: الاسم والمعرّف والأيقونة ورقم الإصدار.
flutter build apkللتثبيت المباشر، وflutter build appbundleللمتجر.- وقّع التطبيق بملف مفاتيح تحفظه جيداً ولا ترفعه إلى Git.
flutter build webينتج موقعاً ثابتاً. مبروك! أنهيت كورس Flutter كاملاً، فابدأ الآن بتطبيقك الحقيقي الأول.