إعداد الوحدة الأساسية

تختلف حِزمة التطبيق عن حِزمة APK في أنّه لا يمكنك نشر حزمة التطبيق على الجهاز. وإنما هو تنسيق نشر يتضمن جميع الرموز والموارد المجمّعة للتطبيق في أداة إصدار واحدة. بعد تحميل حِزمة التطبيق الموقَّعة، يتوفّر في Google Play كل ما هو ضروري لإنشاء حِزم APK لتطبيقك وتوقيعها وعرضها للمستخدمين.

البدء

لن تتطلب معظم مشاريع التطبيقات الكثير من الجهد لإتاحة تنسيق "مجموعة حزمات تطبيق Android". وذلك لأنّ الوحدة التي تتضمّن رموزًا برمجية وموارد لقاعدة APK الأساسية في تطبيقك هي وحدة التطبيق العادية التي تحصل عليها تلقائيًا عند إنشاء مشروع تطبيق جديد في "استوديو Android". وهذا يعني أنّ الوحدة التي تطبّق المكوّن الإضافي application أدناه على ملف build.gradle توفّر الرمز والموارد اللازمة للوظائف الأساسية لتطبيقك.

رائع

// The standard application plugin creates your app's base module.
plugins {
 id 'com.android.application'
}

Kotlin

plugins {
    // The standard application plugin creates your app's base module.
    id("com.android.application")
}

بالإضافة إلى توفير الوظائف الأساسية لتطبيقك، توفّر الوحدة الأساسية أيضًا العديد من إعدادات الإصدار وإدخالات البيان التي تؤثر في مشروع التطبيق بالكامل.

إعدادات تصميم الوحدة الأساسية

بالنسبة إلى معظم مشاريع التطبيقات الحالية، لا تحتاج إلى تغيير أي إجراء في إعدادات إصدار الوحدة الأساسية. ومع ذلك، إذا كنت تفكر في إضافة وحدات ميزات إلى مشروع تطبيقك أو إذا سبق لك إصدار تطبيقك باستخدام حِزم APK متعددة، فهناك بعض الجوانب بشأن تهيئة إصدار الوحدة الأساسية التي يجب وضعها في الاعتبار.

رمز الإصدار وتحديثات التطبيق

باستخدام تنسيق "مجموعات حزمات تطبيق Android"، لم يعُد من الضروري إدارة رموز الإصدارات لحِزم APK متعدّدة تحمِّلها إلى Google Play. بدلاً من ذلك، يمكنك إدارة رمز إصدار واحد فقط في الوحدة الأساسية لتطبيقك، كما هو موضّح أدناه:

// In your base module build.gradle file
android {
    defaultConfig {
        …
        // You specify your app’s version code only in the base module.
        versionCode 5
        versionName "1.0"
    }
}

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

عندما تريد تحديث تطبيقك باستخدام رموز أو موارد جديدة، عليك تعديل رمز الإصدار في الوحدة الأساسية لتطبيقك وإنشاء حِزمة تطبيق جديدة كاملة. عند تحميل حِزمة التطبيق هذه إلى Google Play، يتم إنشاء مجموعة جديدة من حِزم APK بناءً على رمز الإصدار الذي تحدِّده الوحدة الأساسية. وبالتالي، عندما يحدِّث المستخدمون تطبيقك، يعرض Google Play لهم إصدارات محدّثة من جميع حِزم APK المثبَّتة حاليًا على الجهاز. وهذا يعني أنّ جميع حِزم APK المثبَّتة يتم تحديثها إلى رمز الإصدار الجديد.

اعتبارات أخرى

  • توقيع التطبيق: إذا ضمّنت معلومات التوقيع في ملفات الإصدار، يجب تضمينها فقط في ملف إعداد إصدار الوحدة الأساسية. لمزيد من المعلومات، يُرجى الاطّلاع على إعداد Gradle لتوقيع تطبيقك.
  • تقليص الرموز: إذا أردت تفعيل ميزة تقليص الرموز لمشروع التطبيق بالكامل (بما في ذلك وحدات ميزاته)، عليك إجراء ذلك من ملف Build.grale الخاص بالوحدة الأساسية. وهذا يعني أنّه يمكنك تضمين قواعد ProGuard المخصّصة في أي وحدة من الميزات، ولكن يتم تجاهل السمة minifyEnabled في إعدادات إصدار وحدة الميزات.
  • يتم تجاهل مجموعة splits: عند إنشاء حِزمة تطبيق، يتجاهل Gradle السمات في مجموعة android.splits. إذا كنت تريد التحكّم في أنواع إعدادات حِزم APK المتوافقة مع حزمة تطبيقك، يمكنك بدلاً من ذلك استخدام android.bundle من أجل إيقاف أنواع حِزم APK للإعدادات.
  • تحديد إصدارات التطبيقات: تحدِّد الوحدة الأساسية رمز الإصدار واسم الإصدار لمشروع التطبيق بالكامل. لمزيد من المعلومات، انتقِل إلى القسم الذي يتناول كيفية إدارة تحديثات التطبيقات.

إعادة تفعيل أو إيقاف أنواع إعدادات حِزم APK

عندما تنشئ حِزمة تطبيق بشكل تلقائي، تتيح هذه الحزمة إنشاء حِزم APK للإعداد لكل مجموعة من موارد اللغة وموارد كثافة الشاشة ومكتبات ABI. باستخدام مجموعة android.bundle في ملف build.gradle للوحدة الأساسية، كما هو موضّح أدناه، يمكنك إيقاف إتاحة استخدام نوع واحد أو أكثر من حِزم APK للإعدادات:

رائع

android {
    // When building Android App Bundles, the splits block is ignored.
    // You can remove it, unless you're going to continue to build multiple
    // APKs in parallel with the app bundle
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // This property is set to true by default.
            // You can specify `false` to turn off
            // generating configuration APKs for language resources.
            // These resources are instead packaged with each base and
            // feature APK.
            // Continue reading below to learn about situations when an app
            // might change setting to `false`, otherwise consider leaving
            // the default on for more optimized downloads.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

Kotlin

android {
    // When building Android App Bundles, the splits block is ignored.
    // You can remove it, unless you're going to continue to build multiple
    // APKs in parallel with the app bundle
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // This property is set to true by default.
            // You can specify `false` to turn off
            // generating configuration APKs for language resources.
            // These resources are instead packaged with each base and
            // feature APK.
            // Continue reading below to learn about situations when an app
            // might change setting to `false`, otherwise consider leaving
            // the default on for more optimized downloads.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

التعامل مع تغييرات اللغة

يحدّد Google Play مصادر اللغة المطلوب تثبيتها مع التطبيق بناءً على اختيار اللغة في إعدادات جهاز المستخدم. فكِّر في مستخدم يغيّر لغة النظام التلقائية بعد تنزيل تطبيقك. إذا كان تطبيقك يتيح هذه اللغة، سيطلب الجهاز وينزّل حِزم APK إضافية للإعدادات وينزّلها لموارد اللغة من Google Play.

بالنسبة إلى التطبيقات التي توفِّر أداة اختيار اللغة داخل التطبيق وتغيِّر لغة التطبيق ديناميكيًا، بغض النظر عن إعداد اللغة على مستوى النظام، عليك إجراء بعض التغييرات لمنع الأعطال بسبب عدم توفُّر الموارد. يمكنك إمّا ضبط السمة android.bundle.language.enableSplit على false، أو استخدام إمكانية تنزيل اللغات عند الطلب باستخدام مكتبة Play Core على النحو الموضَّح في القسم تنزيل موارد لغوية إضافية