تخطَّ إلى المحتوى

بناء تطبيق Flutter ونشره: APK و App Bundle والويب

الدرس 33 من 33 · Flutter

تطبيقك يعمل على المحاكي وعلى هاتفك وهو موصول بالكمبيوتر. لكن كيف ترسله إلى صديق ليجربه؟ وكيف يصل إلى متجر Google Play؟ في هذا الدرس الأخير من الكورس ستتعلم الرحلة من مشروع على جهازك إلى ملف جاهز للتثبيت والنشر.

Flutter يبني تطبيقك بثلاث طرق مختلفة، ولكل واحدة غرض:

الوضع الأمر الغرض
Debug flutter run التطوير: إعادة تحميل سريعة ورسائل أخطاء مفصلة، لكنه بطيء وحجمه كبير
Profile flutter run --profile قياس الأداء على جهاز حقيقي
Release flutter run --release النسخة النهائية: سريعة وصغيرة وبلا أدوات تطوير

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

والشريط الأحمر المكتوب عليه «DEBUG» في زاوية الشاشة يظهر في وضع التطوير فقط، ويختفي تلقائياً في النسخة النهائية.

قبل البناء: هوية التطبيق

Section titled “قبل البناء: هوية التطبيق”

الاسم الذي يظهر تحت الأيقونة في الهاتف يتحدد لكل منصة في ملفها:

  • أندرويد: في android/app/src/main/AndroidManifest.xml، غيّر قيمة android:label داخل وسم application.
  • iOS: في ios/Runner/Info.plist، غيّر القيمة التي تحت المفتاح CFBundleDisplayName.

لكل تطبيق في العالم معرّف فريد، مثل com.example.my_app. المتجر يميّز تطبيقك به، ولا يمكن تغييره بعد النشر. والصيغة المعتادة: اسم نطاقك معكوساً ثم اسم التطبيق، مثل com.yourname.notes. الأسهل أن تحدده عند إنشاء المشروع:

نافذة طرفيّة
flutter create --org com.yourname notes

في pubspec.yaml:

pubspec.yaml
version: 1.2.0+5
  • ما قبل + هو اسم الإصدار الذي يراه المستخدم في المتجر: 1.2.0.
  • ما بعد + هو رقم البناء: رقم صحيح يجب أن يزيد مع كل نسخة ترفعها إلى المتجر، حتى لو لم يتغير اسم الإصدار. المتجر يرفض ملفاً رقم بنائه مستخدم من قبل.

الأيقونة الافتراضية هي شعار Flutter. لتغييرها يدوياً تحتاج عشرات الصور بأحجام مختلفة لكل منصة. الأسهل استخدام حزمة flutter_launcher_icons: تعطيها صورة واحدة مربعة بحجم 1024×1024، وهي تولّد كل الأحجام.

pubspec.yaml
dev_dependencies:
flutter_launcher_icons: ^0.14.0
flutter_launcher_icons:
android: true
ios: true
image_path: "assets/icon/icon.png"

ثم نفّذ:

نافذة طرفيّة
flutter pub get
dart run flutter_launcher_icons

لاحظ أن الحزمة تحت dev_dependencies، لأنها أداة تستخدمها أنت أثناء التطوير، ولا تدخل في التطبيق النهائي. وراجع صفحة الحزمة في pub.dev لمعرفة أحدث إصدار وباقي الإعدادات.

ملف APK هو ملف تثبيت تطبيقات أندرويد. ترسله لأي شخص فيثبته مباشرة.

نافذة طرفيّة
flutter build apk --release

بعد انتهاء البناء تجد الملف في:

build/app/outputs/flutter-apk/app-release.apk

هذا الملف يحتوي على نسخ لكل أنواع معالجات الهواتف، فيكون حجمه كبيراً. لتحصل على ملف أصغر لكل نوع:

نافذة طرفيّة
flutter build apk --split-per-abi

ينتج ثلاثة ملفات، وأشهرها app-arm64-v8a-release.apk الذي يعمل على أغلب الهواتف الحديثة.

متجر 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

قبل النشر على المتجر يجب توقيع التطبيق بمفتاح رقمي يخصك. التوقيع يثبت أن التحديثات القادمة منك أنت وليست من شخص ينتحل تطبيقك.

تخيّله مثل ختم الشركة على مستنداتها: أي ورقة بلا الختم مرفوضة.

الخطوات باختصار:

  1. تنشئ ملف مفاتيح (Keystore) مرة واحدة بأداة keytool التي تأتي مع Java.
  2. تكتب مسار الملف وكلمات مروره في ملف android/key.properties.
  3. تعدّل ملف android/app/build.gradle.kts ليقرأ هذه القيم ويوقّع بها نسخة release.

التفاصيل الدقيقة تتغير قليلاً بين إصدارات Flutter، فاتبعها من الصفحة الرسمية: ابحث عن «Build and release an Android app» في توثيق Flutter.

نفس الكود يعمل موقعاً:

نافذة طرفيّة
flutter build web

النتيجة مجلد build/web فيه ملفات ثابتة: index.html وملفات JavaScript. ترفع هذا المجلد إلى أي استضافة ملفات ثابتة، مثل Firebase Hosting أو GitHub Pages أو Cloudflare Pages، فيعمل تطبيقك في المتصفح.

بناء تطبيقات iPhone يحتاج جهاز Mac عليه برنامج Xcode، وحساب مطوّر مدفوعاً من Apple للنشر على App Store. الأمر هو flutter build ipa، والرفع يتم عبر Xcode. إذا لم يكن عندك Mac فابدأ بأندرويد والويب، فالكود نفسه سيعمل على iOS عندما تتوفر لك الأدوات.

  1. أنشئ حساب مطوّر في Google Play Console. يُدفع رسم تسجيل مرة واحدة.
  2. أنشئ تطبيقاً جديداً، واملأ بياناته: الاسم والوصف ولقطات الشاشة والأيقونة.
  3. أجب عن استبيانات المحتوى والخصوصية، وأضف رابط سياسة الخصوصية.
  4. ارفع ملف .aab الموقّع.
  5. أرسل التطبيق للمراجعة، وانتظر الموافقة.

المتجر يطلب غالباً فترة اختبار مغلق مع مجموعة من المختبرين قبل السماح بالنشر العام للحسابات الجديدة. اقرأ الشروط الحالية في صفحة المساعدة الخاصة بـ Play Console، لأنها تتغير من وقت لآخر.

  • معرّف التطبيق ليس com.example.
  • اسم التطبيق وأيقونته صحيحان.
  • رقم البناء أكبر من النسخة السابقة.
  • الأذونات المطلوبة موجودة في AndroidManifest.xml.
  • جرّبت نسخة release على هاتف حقيقي.
  • التطبيق يتعامل مع انقطاع الإنترنت بلا توقف.
  • ملف المفاتيح محفوظ في مكان آمن وخارج Git.
  1. شغّل أحد مشاريعك بالأمر flutter run --release وقارن سرعته بوضع التطوير.
  2. ابنِ ملف APK لتطبيق الملاحظات، وانقله إلى هاتفك وثبّته.
  3. غيّر اسم التطبيق في AndroidManifest.xml وأعد البناء.
  4. تحدٍّ: نفّذ flutter build web، وافتح المجلد الناتج بخادم محلي بسيط، وجرّب تطبيقك في المتصفح.
  • إرسال نسخة debug للمستخدمين: بطيئة وحجمها كبير وعليها شريط DEBUG. استخدم --release دائماً.
  • نسيان زيادة رقم البناء: يرفض المتجر الملف برسالة أن رقم الإصدار مستخدم.
  • رفع ملف المفاتيح إلى مستودع عام: أي شخص يحصل عليه يستطيع توقيع تطبيقات باسمك.

سؤال

ما الصيغة التي يطلبها متجر Google Play للتطبيقات الجديدة؟

سؤال

في السطر version: 2.1.0+14 داخل pubspec.yaml، ماذا يمثل الرقم 14؟

  • وضع Debug للتطوير فقط، و Release للنسخة النهائية السريعة.
  • جهّز الهوية قبل البناء: الاسم والمعرّف والأيقونة ورقم الإصدار.
  • flutter build apk للتثبيت المباشر، و flutter build appbundle للمتجر.
  • وقّع التطبيق بملف مفاتيح تحفظه جيداً ولا ترفعه إلى Git.
  • flutter build web ينتج موقعاً ثابتاً. مبروك! أنهيت كورس Flutter كاملاً، فابدأ الآن بتطبيقك الحقيقي الأول.