0Pricing
Android Academy · درس

إعداد إصدار البناء

حزم التطبيقات وتقليصها

إعداد إصدار البناء درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 4 دروس في المجموع.

من التصحيح إلى الإصدار

تُشغّل كل يوم إصدار debug من Android Studio. لكن Google Play يحتاج إلى إصدار release: أصغر حجمًا وأسرع، وغير موسوم بأنه قابل للتصحيح.

يختلف إصدار release بثلاث طرق أساسية: فهو موقّع بمفتاح الإصدار، ويحتوي على debuggable false، وعادةً ما يكون مصغّرًا لإزالة الرمز والموارد غير المستخدمة.

في هذا الدرس ستجهّز إصدارًا صحيحًا من التطبيق، وتنتج الملف الذي يريده Google Play: Android App Bundle (.aab).

أنواع البناء في Gradle

يعرّف Gradle نوعي بناء افتراضيين: debug وrelease. وتضبطهما في build.gradle.kts الخاص بالوحدة.

تُفعّل التحسينات داخل كتلة release. لاحظ isMinifyEnabled وisShrinkResources أدناه — فهما المفتاحان اللذان يجعلان تطبيقك أصغر حجمًا.

android {
    buildTypes {
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}

AAB مقابل APK

يتطلب Google Play ملف Android App Bundle (.aab)، وليس ملف .apk عاديًا.

  • يحتوي .apk على الرمز والموارد اللازمة لكل جهاز — جميع كثافات الشاشة، وجميع معماريات وحدة المعالجة المركزية، وجميع اللغات.
  • يُرفع .aab إلى Play، ثم ينشئ Play ملف APK صغيرًا ومحسّنًا لكل جهاز مستخدم بعينه.

والنتيجة: ينزّل المستخدمون حجمًا أقل، ويُثبَّت تطبيقك بحجم أصغر. وما زلت تستخدم ملفات APK للاختبار المباشر على الهاتف، لكنك تنشر AAB.

ما هو R8 / التصغير؟

عندما تكون قيمة isMinifyEnabled = true، يشغّل Android Studio أداة R8. تنفّذ R8 ثلاث مهام في مرور واحد:

  • التصغير — تزيل الفئات والطرائق التي لا يستدعيها تطبيقك مطلقًا.
  • التعمية — تعيد تسمية الفئات والطرائق إلى أسماء قصيرة مثل a وb وc لتوفير المساحة والحد من الهندسة العكسية.
  • التحسين — تدمج الرمز وتعيد كتابته ليعمل بسرعة أكبر.

كما يزيل تصغير الموارد (isShrinkResources = true) الموارد القابلة للرسم والتخطيطات والسلاسل النصية غير المستخدمة.

الحفاظ على القواعد باستخدام ProGuard

قد يزيل R8 أحيانًا التعليمات البرمجية التي لا تتم الإشارة إليها إلا عبر الانعكاس (مثلًا بواسطة Gson أو Retrofit أو التسلسل). ويمكنك حماية هذه التعليمات البرمجية باستخدام قواعد الاحتفاظ في proguard-rules.pro.

تخبر قاعدة الاحتفاظ R8 بما يلي: "لا تعِد تسمية هذه الفئات ولا تحذفها".

# proguard-rules.pro

# Keep data classes used with Gson reflection
-keep class com.example.app.model.** { *; }

# Keep Retrofit interface methods
-keepattributes Signature
-keepattributes *Annotation*

# Keep Kotlin metadata used by libraries
-keep class kotlin.Metadata { *; }

إدارة إصدارات تطبيقك

يحتاج كل إصدار إلى قيمتَي إصدار في build.gradle.kts:

  • versionCode — عدد صحيح يجب زيادته مع كل عملية رفع. ويستخدمه Play لمعرفة الإصدار الأحدث.
  • versionName — سلسلة نصية مقروءة للبشر مثل "1.4.0"، وتظهر للمستخدمين.

إذا نسيت زيادة versionCode، فسيرفض Play عملية الرفع باعتبارها نسخة مكررة.

android {
    defaultConfig {
        applicationId = "com.example.app"
        minSdk = 24
        targetSdk = 35
        versionCode = 12
        versionName = "1.4.0"
    }
}

إنشاء الحزمة في Android Studio

لإنشاء حزمة إصدار موقّعة من خلال الواجهة:

  • افتح Build → Generate Signed Bundle / APK.
  • اختر Android App Bundle.
  • حدّد مخزن المفاتيح والمفتاح، أو أنشئهما.
  • اختر متغير البناء release.

يشغّل Android Studio أداة R8، ويوقّع الحزمة، ثم يضع ملف .aab في app/release/. وهذا الملف الواحد هو ما ترفعه إلى Play.

الإنشاء من سطر الأوامر

بالنسبة إلى CI/CD أو البرامج النصية، أنشئ الحزمة باستخدام Gradle مباشرةً. ويتبع اسم المهمة النمط bundle<Variant>.

ينشئ bundleRelease ملف AAB. ويوضع الملف في app/build/outputs/bundle/release/.

# Build a release App Bundle (.aab)
./gradlew bundleRelease

# Output:
# app/build/outputs/bundle/release/app-release.aab

# Build a release APK instead (for direct install/testing)
./gradlew assembleRelease

فحص AAB واختباره

لا يمكنك تثبيت ملف .aab على الهاتف مباشرةً. لاختبار ملفات APK نفسها التي سينشئها Play، استخدم bundletool من Google.

تنشئ هذه الأداة ملفات APK مخصصة للجهاز من حزمتك، وتثبتها على جهاز متصل — وهو أقرب ما يكون إلى تنزيل حقيقي من Play.

# Generate APKs from the bundle for the connected device
java -jar bundletool.jar build-apks \
  --bundle=app-release.aab \
  --output=app.apks \
  --connected-device

# Install them on the device
java -jar bundletool.jar install-apks --apks=app.apks

إزالة تعليمات تصحيح الأخطاء من الإصدار

يجب ألا يسجّل إصدار الإنتاج بيانات حساسة أو يترك ميزات مخصصة لتصحيح الأخطاء مفعّلة. استخدم BuildConfig.DEBUG لتغيير السلوك حسب الحالة. وتكون قيمته true في إصدارات تصحيح الأخطاء فقط.

يمكن لـ R8 حتى إزالة الكتل المحمية بقيمة ثابتة هي false، ولذلك يساهم هذا أيضًا في تقليل الحجم.

fun setupLogging() {
    if (BuildConfig.DEBUG) {
        // Verbose logging only in debug builds
        Log.d("App", "Debug logging enabled")
        Timber.plant(Timber.DebugTree())
    } else {
        // Release: send to crash reporting only, no console spam
        Timber.plant(CrashReportingTree())
    }
}

قائمة التحقق قبل الإصدار

قبل إنشاء الحزمة النهائية، تأكد من الآتي:

  • تمت زيادة versionCode وتحديث versionName.
  • تم تفعيل isMinifyEnabled وisShrinkResources للإصدار.
  • تمت إضافة قواعد الاحتفاظ لأي مكتبات تعتمد على الانعكاس.
  • يفي targetSdk بالمتطلب الحالي لـ Play.
  • لا توجد تعليمات تسجيل مخصصة لتصحيح الأخطاء أو نقاط نهاية للاختبار في تعليمات الإصدار.
  • اختبرت ملف AAB باستخدام bundletool على جهاز حقيقي.

بعد اجتياز هذه الفحوصات، يصبح ملف .aab جاهزًا للرفع.

تحقق سريع

لقد عيّنت isMinifyEnabled = true، ثم يتعطل تطبيقك في الإصدار مع ظهور خطأ "class not found" من محلل JSON، بينما يعمل بصورة طبيعية في وضع تصحيح الأخطاء. ما السبب الأرجح؟

مراجعة: إعداد إصدار التطبيق

أصبحت تعرف الآن كيفية تحويل تطبيق مخصص لتصحيح الأخطاء إلى إصدار قابل للنشر:

  • يتطلب Play ملف .aab موقّعًا، وينشئ منه ملفات APK مخصصة لكل جهاز.
  • يفعّل نوع البناء release أداة R8 عبر isMinifyEnabled وisShrinkResources لتقليص الحجم والتعتيم والتحسين.
  • تحمي قواعد الاحتفاظ التعليمات البرمجية المعتمدة على الانعكاس من الإزالة.
  • زد versionCode وحدّث versionName دائمًا.
  • أنشئ الإصدار باستخدام ./gradlew bundleRelease واختبر الناتج باستخدام bundletool.

التالي: كيفية عمل التوقيع الذي يجعل هذا الإصدار موثوقًا.

الأسئلة الشائعة

هل درس «إعداد إصدار البناء» مجاني؟

نعم — نص درس «إعداد إصدار البناء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 4 دروس في المجموع.

ماذا ستتعلم في «إعداد إصدار البناء»؟

حزم التطبيقات وتقليصها تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «إعداد إصدار البناء»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد إصدار البناء
  2. توقيع التطبيق
  3. Play Console وقائمة التطبيق
  4. الإصدارات والتحديثات
← العودة إلى Android Academy