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

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

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

إعدادات إنشاء وحدة الميزات

عند إنشاء وحدة ميزات جديدة باستخدام "استوديو Android"، يُطبّق بيئة التطوير المتكاملة (IDE) المكوّن الإضافي التالي من 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" وحدة الميزات الخاصة بك، يصبح مرئيًا في الوحدة الأساسية من خلال إضافة السمة 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" لإنشاء ونشر حِزم APK وتجارب فورية من حزمة تطبيق، يجب تعديل إعدادات التشغيل وتصحيح الأخطاء.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

السمة الوصف
<manifest
...
هذه هي كتلتك <manifest> المعتادة.
xmlns:dist="http://schemas.android.com/apk/distribution" تحدّد هذه السمة مساحة اسم dist: جديدة بتنسيق XML، وهو موضّح أدناه.
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" حِزمة تطبيقك، سيتم تضمين هذه السمة لك. لذلك يجب عدم تضمين هذه السمة أو تعديلها يدويًا.

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

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

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

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

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

لمعرفة مزيد من المعلومات عن عمليات التنزيل أثناء التثبيت، يُرجى الاطّلاع على ضبط ميزة "التسليم في وقت التثبيت".

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

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

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

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

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

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

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

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

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

مصادر إضافية

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

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

الفيديوهات الطويلة

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

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

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

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

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

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

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

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

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