نظرة عامة على عرض الميزات في 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. اختَر تشغيل > تعديل الإعدادات من شريط القوائم.
  2. من اللوحة اليمنى في مربّع الحوار Run/Debug Configurations (ضبط التشغيل/تصحيح الأخطاء)، اختَر إعدادات تطبيق Android التي تريدها.
  3. ضمن الميزات الديناميكية المطلوب نشرها في علامة التبويب الإعدادات العامة، ضَع علامة في المربّع بجانب كل وحدة ميزة تريد تضمينها عند نشر تطبيقك.
  4. انقر على موافق.

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

استخدام وحدات الميزات لتخصيص عرض الإعلانات

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

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

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

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

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

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

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

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

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

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

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

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

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

أنشِئ وحدة ميزات وضبط العرض عند الطلب. يمكن لتطبيقك بعد ذلك استخدام مكتبة "عرض الميزات في Play" لطلب تنزيل الوحدة عند الطلب.
التسليم المشروط يتيح لك تحديد متطلبات معيّنة لأجهزة المستخدمين، مثل ميزات الأجهزة واللغة والحد الأدنى لمستوى واجهة برمجة التطبيقات لتحديد ما إذا كان سيتم تنزيل ميزة مصغّرة عند تثبيت التطبيق. إذا كان تطبيق Marketplace يحظى بمدى وصول عالمي، قد تحتاج إلى إتاحة طرق الدفع الرائجة في مناطق معيّنة فقط أو في السكان المحليين. لتقليل حجم التنزيل الأولي للتطبيق، يمكنك إنشاء وحدات ميزات منفصلة لمعالجة أنواع معيّنة من طرق الدفع وتثبيتها بشكل مشروط على جهاز المستخدم استنادًا إلى اللغة المسجّلة. أنشئ وحدة ميزة و اضبط العرض المشروط.
التسليم الفوري تتيح تطبيقات 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

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

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

لقطة شاشة لأداة APK Analyzer وهي تتحقّق من محتوى ملف موارد مجمَّع

الشكل 2: يمكنك استخدام "أداة تحليل حِزم APK" لفحص اسم الحزمة في ملف موارد مجمّع.

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

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

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

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

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

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

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

كيفية تحديد Gradle لقيمة هذه السمة:

عندما تنشئ وحدة ميزات تلقائيًا باستخدام "استوديو Android"، يستخدم IDE ما تحدّده كاسم الوحدة لتحديد الوحدة باعتبارها مشروعًا فرعيًا من Gradle في ملف إعدادات Gradle.

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

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

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

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

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

لا يمكنك ضبط عنصر 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" />
</dist:module>
لتحديد ما إذا كان سيتم تضمين الوحدة في حِزم APK متعددة تستهدف الأجهزة التي تعمل بنظام التشغيل Android 4.4 (المستوى 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 من المكوّن الإضافي لنظام Gradle المتوافق مع Android أو عند استخدام الإصدار 1.0 من أداة bundletool من سطر الأوامر.

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

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

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

مصادر إضافية

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

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

الفيديوهات

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

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

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

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

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

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

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

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

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