نظرة عامة على عرض الميزات في Play

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

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

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

عند إنشاء وحدة ميزات جديدة باستخدام "استوديو Android"، يطبّق بيئة التطوير المتكاملة مكوّن Gradle الإضافي التالي على ملف build.gradle الخاص بالوحدة.

// The following applies the dynamic-feature plugin to your feature module.
// The plugin includes the Gradle tasks and properties required to configure and build
// an app bundle that includes your feature module.

plugins {
  id 'com.android.dynamic-feature'
}

تتوفّر العديد من السمات المتاحة لمكوّن التطبيق الإضافي العادي أيضًا لوحدة الميزات. توضّح الأقسام التالية الخصائص التي يجب تضمينها وتلك التي يجب عدم تضمينها في إعدادات الإصدار الخاصة بوحدة الميزات.

العناصر التي يجب عدم تضمينها في إعدادات إنشاء وحدة الميزات

وبما أنّ كل وحدة ميزات تعتمد على الوحدة الأساسية، فإنّها ترث أيضًا بعض الإعدادات. لذلك، يجب حذف ما يلي من ملف build.gradle الخاص بالوحدة المميزة:

  • إعدادات التوقيع: يتم توقيع حِزم التطبيقات باستخدام إعدادات التوقيع التي تحدّدها في الوحدة الأساسية.
  • سمة minifyEnabled: يمكنك تفعيل تصغير الرموز لمشروع تطبيقك بالكامل من إعدادات الإصدار الخاصة بالوحدة الأساسية فقط. لذلك، يجب حذف هذه السمة من الوحدات المميزة. ومع ذلك، يمكنك تحديد قواعد ProGuard إضافية لكل وحدة من وحدات الميزات.
  • versionCode وversionName: عند إنشاء حِزمة تطبيقك، يستخدم Gradle معلومات إصدار التطبيق التي يوفّرها الوحدة الأساسية. يجب حذف هذه السمات من ملف build.gradle الخاص بوحدة الميزات.

إنشاء علاقة بالوحدة الأساسية

عندما ينشئ Android Studio وحدة الميزات، يتيح ظهورها لوحدة التطبيق الأساسي من خلال إضافة السمة android.dynamicFeatures إلى ملف build.gradle الخاص بوحدة التطبيق الأساسي، كما هو موضّح أدناه:

// In the base module’s build.gradle file.
android {
    ...
    // Specifies feature modules that have a dependency on
    // this base module.
    dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}

بالإضافة إلى ذلك، يتضمّن "استوديو Android" الوحدة الأساسية كعنصر تابع لوحدة الميزات، كما هو موضّح أدناه:

// In the feature module’s build.gradle file:
...
dependencies {
    ...
    // Declares a dependency on the base module, ':app'.
    implementation project(':app')
}

تحديد قواعد ProGuard إضافية

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

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

يُرجى العِلم أنّه يتم دمج قواعد ProGuard هذه مع القواعد من الوحدات الأخرى (بما في ذلك الوحدة الأساسية) في وقت الإنشاء. لذلك، على الرغم من أنّ كل وحدة من وحدات الميزات قد تحدّد مجموعة جديدة من القواعد، تنطبق هذه القواعد على جميع الوحدات في مشروع التطبيق.

نشر تطبيقك

أثناء تطوير تطبيقك مع توفير دعم لوحدات الميزات، يمكنك نشر تطبيقك على جهاز متصل كما تفعل عادةً من خلال اختيار تشغيل > تشغيل من شريط القوائم (أو من خلال النقر على تشغيل في شريط الأدوات).

إذا كان مشروع تطبيقك يتضمّن وحدة ميزة واحدة أو أكثر، يمكنك اختيار الميزات التي تريد تضمينها عند نشر تطبيقك من خلال تعديل إعدادات التشغيل/تصحيح الأخطاء الحالية باتّباع الخطوات التالية:

  1. انقر على تشغيل (Run) > تعديل الإعدادات (Edit Configurations) من شريط القوائم.
  2. من اللوحة اليمنى في مربّع الحوار إعدادات التشغيل/تصحيح الأخطاء، اختَر إعدادات تطبيق Android التي تريدها.
  3. ضِمن الميزات الديناميكية التي سيتم نشرها في علامة التبويب عام، ضَع علامة في المربّع بجانب كل وحدة ميزات تريد تضمينها عند نشر تطبيقك.
  4. انقر على موافق.

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

استخدام وحدات الميزات لتخصيص عملية التسليم

تتمثّل إحدى المزايا الفريدة لوحدات الميزات في إمكانية تخصيص طريقة تنزيل الميزات المختلفة لتطبيقك على الأجهزة التي تعمل بالإصدار 5.0 من نظام التشغيل Android (المستوى 21 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث، وتحديد وقت تنزيلها. على سبيل المثال، لتقليل حجم التنزيل الأولي لتطبيقك، يمكنك ضبط ميزات معيّنة ليتم تنزيلها إما حسب الحاجة عند الطلب أو على الأجهزة التي تتوافق مع إمكانات معيّنة، مثل إمكانية التقاط الصور أو استخدام ميزات الواقع المعزّز.

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

لنفترض أنّ هناك تطبيقًا يتيح للمستخدمين شراء السلع وبيعها في سوق على الإنترنت. يمكنك تقسيم كلٍّ من وظائف التطبيق التالية إلى وحدات ميزات منفصلة:

  • تسجيل الدخول إلى الحساب وإنشاؤه
  • تصفُّح السوق
  • عرض سلعة للبيع
  • معالجة الدفعات

يوضِّح الجدول أدناه خيارات التسليم المختلفة التي تتيحها وحدات الميزات، وكيفية استخدامها لتحسين حجم التنزيل الأوّلي لتطبيق السوق التجريبي.

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

بالإضافة إلى ذلك، يمكن لتطبيقك طلب إلغاء تثبيت الميزات في وقت لاحق. لذا، إذا كنت تحتاج إلى ميزات معيّنة عند تثبيت التطبيق، ولكن ليس بعد ذلك، يمكنك تقليل حجم التثبيت من خلال طلب إزالة الميزة من الجهاز.

إذا كان التطبيق يتضمّن أنشطة تدريبية معيّنة، مثل دليل تفاعلي حول كيفية شراء السلع وبيعها في السوق، يمكنك تضمين هذه الميزة عند تثبيت التطبيق، بشكل تلقائي.

ومع ذلك، لتقليل حجم التطبيق المثبَّت، يمكن للتطبيق أن يطلب حذف الميزة بعد أن يكمل المستخدم التدريب.

تقسيم تطبيقك إلى وحدات باستخدام وحدات الميزات التي لا تضبط أي خيارات عرض متقدّمة

للتعرّف على كيفية تقليل حجم تطبيقك المثبَّت من خلال إزالة وحدات ميزات معيّنة قد لا يحتاجها المستخدم، يمكنك الاطّلاع على مقالة إدارة الوحدات المثبَّتة.

التسليم عند الطلب يسمح لتطبيقك بطلب وحدات الميزات وتنزيلها حسب الحاجة. إذا كان% 20 فقط من مستخدمي تطبيق السوق ينشرون سلعًا للبيع، ستكون إحدى الاستراتيجيات الجيدة لتقليل حجم التنزيل الأولي لمعظم المستخدمين هي إتاحة وظيفة التقاط الصور وتضمين وصف للسلعة وعرضها للبيع كتنزيل عند الطلب. وهذا يعني أنّه يمكنك ضبط وحدة الميزات الخاصة بوظيفة البيع في التطبيق بحيث لا يتم تنزيلها إلا عندما يبدي المستخدم اهتمامًا بعرض سلع للبيع في السوق.

بالإضافة إلى ذلك، إذا لم يعُد المستخدم يبيع سلعًا بعد فترة زمنية معيّنة، يمكن للتطبيق تقليل حجمه المثبَّت من خلال طلب إلغاء تثبيت الميزة.

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

باستخدام ميزة "التسليم الفوري"، يمكنك الاستفادة من "تطبيقات Google Play الفورية" للسماح للمستخدمين بتجربة ميزات معيّنة من تطبيقك على الفور بدون الحاجة إلى تثبيته.

يمكنك التفكير في لعبة تتضمّن المستويات القليلة الأولى من اللعبة في وحدة ميزات خفيفة الوزن. يمكنك تفعيل ميزة التطبيقات الفورية في هذه الوحدة حتى يتمكّن المستخدمون من تجربة اللعبة على الفور من خلال رابط عنوان URL أو زر "التجربة الآن" بدون تثبيت التطبيق. أنشئ وحدة ميزات واضبط إعدادات العرض الفوري. يمكن لتطبيقك بعد ذلك استخدام مكتبة عرض الميزات في Play لطلب تنزيل الوحدة عند الطلب.

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

إنشاء معرّف موارد منتظم (URI) لمورد

إذا أردت الوصول إلى مورد مخزَّن في وحدة ميزات باستخدام معرّف موارد منتظم (URI)، إليك كيفية إنشاء معرّف موارد منتظم (URI) لوحدة ميزات باستخدام Uri.Builder():

Kotlin

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build()

Java

String uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s",
                  resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
                  resources.getResourceEntryName(resId)
                  ))
                .build().toString();

يتم إنشاء كل جزء من مسار المورد في وقت التشغيل، ما يضمن إنشاء مساحة الاسم الصحيحة بعد تحميل حِزم APK المجزّأة.

كمثال على كيفية إنشاء معرّف URI، لنفترض أنّ لديك تطبيقًا ووحدات ميزات بالأسماء التالية:

  • اسم حزمة التطبيق: com.example.my_app_package
  • اسم حزمة موارد الميزة: com.example.my_app_package.my_dynamic_feature

إذا كان resId في مقتطف الرمز أعلاه يشير إلى مورد ملف أولي باسم my_video في وحدة الميزات، سيؤدي الرمز Uri.Builder() أعلاه إلى عرض ما يلي:

android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video

ويمكن أن يستخدم تطبيقك معرّف الموارد الموحّد هذا للوصول إلى مورد وحدة الميزات.

للتحقّق من صحة المسارات في معرّف الموارد المنتظم (URI)، يمكنك استخدام أداة تحليل حِزم APK لفحص حزمة APK الخاصة بوحدة الميزات وتحديد اسم الحزمة:

لقطة شاشة لأداة "محلّل حِزم APK" وهي تفحص محتويات ملف موارد تم تجميعه
الشكل 1. استخدِم "أداة تحليل حِزم APK" لفحص اسم الحزمة في ملف موارد تم تجميعه.

اعتبارات وحدات الميزات

باستخدام وحدات الميزات، يمكنك تحسين سرعة التصميم وسرعة التطوير وتخصيص طريقة عرض ميزات تطبيقك على نطاق واسع لتقليل حجم تطبيقك. ومع ذلك، هناك بعض القيود وحالات الاستخدام التي يجب أخذها في الاعتبار عند استخدام الوحدات المميزة:

  • قد يؤدي تثبيت 50 وحدة ميزات أو أكثر على جهاز واحد، من خلال العرض الشرطي أو عند الطلب، إلى حدوث مشاكل في الأداء. يتم تلقائيًا تضمين الوحدات التي يتم عرضها أثناء التثبيت، والتي لم يتم ضبطها على أنّها قابلة للإزالة، في الوحدة الأساسية، ويتم احتسابها كوحدة ميزات واحدة فقط على كل جهاز.
  • ضَع حدًا لعدد الوحدات التي يمكنك ضبطها على أنّها قابلة للإزالة من أجل التسليم أثناء التثبيت بحيث لا يزيد عن 10 وحدات. وفي حال عدم إجراء ذلك، قد يستغرق تنزيل تطبيقك وتثبيته وقتًا أطول.
  • لا تتوافق ميزة تنزيل الميزات وتثبيتها عند الطلب إلا مع الأجهزة التي تعمل بالإصدار 5.0 من نظام التشغيل Android (المستوى 21 من واجهة برمجة التطبيقات) والإصدارات الأحدث. لإتاحة الميزة لإصدارات Android السابقة، فعِّل خيار الدمج عند إنشاء وحدة ميزة.
  • فعِّل SplitCompat، ليتمكّن تطبيقك من الوصول إلى وحدات الميزات التي تم تنزيلها عند الطلب.
  • يجب ألا تحدِّد الوحدات المميزة أنشطة في ملف البيان الخاص بها مع ضبط android:exported على true. ويرجع ذلك إلى عدم وجود ضمان بأنّ الجهاز قد نزّل وحدة الميزات عندما يحاول تطبيق آخر تشغيل النشاط. بالإضافة إلى ذلك، يجب أن يؤكّد تطبيقك أنّه تم تنزيل إحدى الميزات قبل محاولة الوصول إلى الرمز البرمجي والموارد الخاصة بها. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة إدارة الوحدات المثبَّتة.
  • بما أنّ ميزة "عرض الميزات في Play" تتطلّب نشر تطبيقك باستخدام حِزمة تطبيق، تأكَّد من أنّك على دراية بالمشاكل المعروفة في حِزم التطبيقات.

مرجع بيان وحدة الميزات

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

السمة الوصف
<manifest هذه هي كتلة <manifest> النموذجية.
xmlns:dist="http://schemas.android.com/apk/distribution" تحدّد هذه السمة مساحة اسم XML جديدة dist: يتم توضيحها أكثر أدناه.
split="split_name" عندما ينشئ "استوديو Android" حزمة تطبيقك، سيضمّن هذه السمة تلقائيًا. لذلك، يجب عدم تضمين هذه السمة أو تعديلها بنفسك.

تحدّد هذه السمة اسم الوحدة الذي يحدّده تطبيقك عند طلب وحدة عند الطلب باستخدام "مكتبة عرض الميزات في Play".

طريقة تحديد Gradle لقيمة هذه السمة:

عند إنشاء وحدة ميزات باستخدام Android Studio، يستخدم بيئة التطوير المتكاملة ما تحدّده كاسم الوحدة للتعرّف على الوحدة كمشروع فرعي في Gradle ضمن ملف إعدادات Gradle.

عند إنشاء حِزمة تطبيقك، يستخدم Gradle العنصر الأخير من مسار المشروع الفرعي لإدراج سمة البيان هذه في بيان الوحدة. على سبيل المثال، إذا أنشأت وحدة ميزات جديدة في الدليل MyAppProject/features/ وحدّدت "dynamic_feature1" كـ اسم الوحدة، ستضيف بيئة التطوير المتكاملة ':features:dynamic_feature1' كمشروع فرعي في ملف settings.gradle. عند إنشاء حِزمة تطبيقك، يضيف Gradle بعد ذلك <manifest split="dynamic_feature1"> إلى بيان الوحدة.

android:isFeatureSplit="true | false"> عندما ينشئ "استوديو Android" حِزمة تطبيقك، سيضمّن هذه السمة نيابةً عنك. لذلك، يجب عدم تضمين هذه السمة أو تعديلها يدويًا.

تحدّد أنّ هذه الوحدة هي وحدة ميزات. يتم إما حذف هذه السمة من البيانات الوصفية في الوحدة الأساسية وحِزم APK الخاصة بالإعدادات أو ضبطها على false.

<dist:module تحدِّد هذه السمة السمات التي تحدّد طريقة تجميع الوحدة وتوزيعها كحِزم APK.
dist:instant="true | false" تحدِّد هذه السمة ما إذا كان يجب أن يكون الوحدة متاحًا من خلال تطبيقات Google Play الفورية كتجربة فورية.

إذا كان تطبيقك يتضمّن وحدة واحدة أو أكثر من وحدات الميزات التي يمكن تشغيلها كتطبيقات فورية، يجب أيضًا تفعيل الوحدة الأساسية كتطبيق فوري. عند استخدام الإصدار 3.5 من Android Studio أو إصدار أحدث، ستتولّى حزمة تطوير البرامج المتكاملة (IDE) تنفيذ ذلك نيابةً عنك عند إنشاء وحدة ميزات متوافقة مع التطبيقات الفورية.

لا يمكنك ضبط عنصر XML هذا على true مع ضبط <dist:on-demand/> أيضًا. ومع ذلك، سيظل بإمكانك طلب تنزيل وحدات الميزات المفعَّلة للتطبيقات الفورية عند الطلب كتجارب فورية باستخدام مكتبة "عرض الميزات في Play". عندما ينزّل المستخدم تطبيقك ويثبّته، ينزّل الجهاز وحدات ميزات تطبيقك التي تتيح تشغيل التطبيق الفوري ويثبّتها، بالإضافة إلى حزمة APK الأساسية، وذلك تلقائيًا.

dist:title="@string/feature_name"> تحدّد هذه السمة عنوانًا يظهر للمستخدمين للوحدة. على سبيل المثال، قد يعرض الجهاز هذا العنوان عند طلب تأكيد التنزيل.

يجب تضمين مورد السلسلة لهذا العنوان في ملف module_root/src/source_set/res/values/strings.xml الخاص بالوحدة الأساسية.

<dist:fusing dist:include="true | false" /> تحدّد هذه السمة ما إذا كان سيتم تضمين الوحدة في حِزم APK المتعددة التي تستهدف الأجهزة التي تعمل بالإصدار 4.4 من نظام التشغيل Android (المستوى 20 لواجهة برمجة التطبيقات) والإصدارات الأقدم.

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

<dist:delivery> تتضمّن هذه السمة خيارات تخصّص عملية تسليم الوحدة، كما هو موضّح أدناه. يُرجى العِلم أنّه يجب أن يضبط كل وحدة ميزات نوعًا واحدًا فقط من خيارات التسليم المخصّصة هذه.
<dist:install-time> تحدّد هذه السمة أنّه يجب أن تكون الوحدة متاحة أثناء التثبيت. هذا هو السلوك التلقائي لوحدات الميزات التي لا تحدّد نوعًا آخر من خيارات التسليم المخصّصة.

لمزيد من المعلومات حول عمليات التنزيل أثناء التثبيت، يمكنك الاطّلاع على ضبط ميزة "التسليم أثناء التثبيت".

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

<dist:removable dist:value="true | false" />

عند عدم ضبط هذه السمة أو ضبطها على false، سيجمع أداة Bundletool الوحدات التي يتم عرضها أثناء التثبيت في الوحدة الأساسية عند إنشاء حِزم APK مجزّأة من الحِزمة. وبما أنّ الدمج سيؤدي إلى تقليل عدد حِزم APK المقسّمة، قد يؤدي هذا الإعداد إلى تحسين أداء تطبيقك.

عند ضبط removable على true، لن يتم دمج الوحدات التي يتم عرضها أثناء التثبيت في الوحدة الأساسية. اضبط القيمة على true إذا أردت إلغاء تثبيت الوحدات في المستقبل. ومع ذلك، قد يؤدي ضبط عدد كبير جدًا من الوحدات لتكون قابلة للإزالة إلى زيادة وقت تثبيت تطبيقك.

القيمة التلقائية هي false. لا يلزم ضبط هذه القيمة في البيان إلا إذا كنت تريد إيقاف الدمج لوحدة ميزات.

ملاحظة: لا تتوفّر هذه الميزة إلا عند استخدام الإصدار 4.2 من إضافة Android Gradle أو عند استخدام الإصدار 1.0 من أداة bundletool من سطر الأوامر.

</dist:install-time>  
<dist:on-demand /> تحدّد هذه السمة أنّ الوحدة يجب أن تكون متاحة للتنزيل عند الطلب. أي أنّ الوحدة غير متاحة عند وقت التثبيت، ولكن قد يطلب تطبيقك تنزيلها لاحقًا.

لمزيد من المعلومات حول عمليات التنزيل عند الطلب، يُرجى قراءة مقالة ضبط التسليم عند الطلب.

</dist:delivery>
</dist:module>
<application
android:hasCode="true | false">
...
</application>
إذا لم تنشئ وحدة الميزات أي ملفات DEX، أي أنّها لا تحتوي على أي رموز برمجية يتم تجميعها لاحقًا في تنسيق ملف DEX، عليك تنفيذ ما يلي (وإلا قد تحدث أخطاء أثناء وقت التشغيل):
  1. اضبط قيمة android:hasCode على "false" في بيان وحدة الميزات.
  2. أضِف ما يلي إلى بيان وحدة التطبيق الأساسي:
    <application
      android:hasCode="true"
      tools:replace="android:hasCode">
      ...
    </application>
...
</manifest>

مراجع إضافية

لمزيد من المعلومات حول استخدام الوحدات النمطية للميزات، يمكنك تجربة المراجع التالية.

مشاركات المدونة

الفيديوهات

بنود الخدمة وأمان البيانات

يعني الوصول إلى "مكتبة تسليم الميزات في Play" أو استخدامها موافقتك على بنود خدمة حزمة تطوير البرامج Play Core. يُرجى قراءة جميع الأحكام والسياسات السارية وفهمها قبل الوصول إلى المكتبة.

أمان البيانات

مكتبات Play Core هي واجهة وقت التشغيل لتطبيقك مع "متجر Google Play". وبالتالي، عند استخدام Play Core في تطبيقك، ينفّذ &quot;متجر Play&quot; عملياته الخاصة، والتي تشمل معالجة البيانات وفقًا لبنود خدمة Google Play. توضّح المعلومات أدناه كيفية معالجة مكتبات Play Core للبيانات من أجل تنفيذ طلبات محدّدة من تطبيقك.

واجهة برمجة تطبيقات اللغات الإضافية

البيانات التي يتم جمعها عن الاستخدام قائمة اللغات المثبّتة
الغرض من جمع البيانات تُستخدَم البيانات التي يتم جمعها لتقديم نُسخ بلغات مختلفة من التطبيق والاحتفاظ باللغات المثبَّتة بعد تحديث التطبيق.
تشفير البيانات البيانات مشفّرة.
مشاركة البيانات لا يتم نقل البيانات إلى أي جهات خارجية.
حذف البيانات يتم حذف البيانات بعد فترة احتفاظ ثابتة.

عرض الميزات في Play

البيانات التي يتم جمعها عن الاستخدام البيانات الوصفية للجهاز
إصدار التطبيق
الغرض من جمع البيانات تُستخدَم البيانات التي يتم جمعها لعرض الوحدة المناسبة على الجهاز وللحفاظ على الوحدات المثبَّتة بعد التحديث والنسخ الاحتياطي والاستعادة.
تشفير البيانات البيانات مشفّرة.
مشاركة البيانات لا يتم نقل البيانات إلى أي جهات خارجية.
حذف البيانات يتم حذف البيانات بعد فترة احتفاظ ثابتة.

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