نمای کلی «ویژگی تحویل Play»

مدل ارائه برنامه Google Play از Android App Bundles برای تولید و ارائه APKهای بهینه‌سازی‌شده برای پیکربندی دستگاه هر کاربر استفاده می‌کند، بنابراین کاربران فقط کد و منابعی را که برای اجرای برنامه‌تان نیاز دارند بارگیری می‌کنند.

«ویژگی تحویل Play» از قابلیت‌های پیشرفته دسته‌های برنامه استفاده می‌کند و اجازه می‌دهد ویژگی‌های خاصی از برنامه‌تان به‌صورت مشروط ارائه شود یا درصورت درخواست بارگیری شود. برای انجام این کار، ابتدا باید این ویژگی‌ها را از برنامه پایه خود به واحدهای ویژگی جدا کنید.

پیکربندی ساخت واحد ویژگی

وقتی بااستفاده از Android Studio واحد ویژگی جدیدی ایجاد می‌کنید، 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 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 Studio واحد پایه را به‌عنوان وابستگی واحد ویژگی دربرمی‌گیرد، همان‌طور که در زیر نشان داده شده است:

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

مشخص کردن قوانین ProGuard اضافی

اگرچه فقط پیکربندی ساخت واحد پایه می‌تواند کوچک کردن کد را برای پروژه برنامه شما فعال کند، می‌توانید بااستفاده از ویژگی proguardFiles، قوانین ProGuard سفارشی را برای هر واحد ویژگی ارائه دهید، همان‌طور که در زیر نشان داده شده است.

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

توجه داشته باشید که این قوانین ProGuard در زمان ساخت با قوانین ProGuard سایر واحدها (ازجمله واحد پایه) ادغام می‌شوند. بنابراین، اگرچه هر واحد ویژگی ممکن است مجموعه جدیدی از قوانین را مشخص کند، اما این قوانین برای همه واحدهای پروژه برنامه اعمال می‌شود.

استقرار برنامه

هنگام توسعه برنامه‌تان با پشتیبانی از واحدهای ویژگی، می‌توانید برنامه‌تان را در دستگاه متصل‌شده مستقر کنید، همان‌طور که معمولاً با انتخاب اجرا > اجرا از نوار منو (یا با کلیک کردن روی اجرا در نوارابزار) انجام می‌دهید.

اگر پروژه برنامه‌تان شامل یک یا چند واحد ویژگی است، می‌توانید با اصلاح پیکربندی اجرا/اشکال‌زدایی موجود خود به‌صورت زیر، انتخاب کنید که کدام ویژگی‌ها هنگام استقرار برنامه‌تان گنجانده شوند:

  1. اجرا > ویرایش پیکربندی‌ها را از نوار منو انتخاب کنید.
  2. از پانل سمت چپ کادر گفتگوی پیکربندی‌های اجرا/اشکال‌زدایی، پیکربندی برنامه Android موردنظرتان را انتخاب کنید.
  3. در بخش ویژگی‌های پویا برای استقرار در برگه عمومی، چارگوش کنار هر واحد ویژگی را که می‌خواهید هنگام استقرار برنامه‌تان اضافه شود علامت بزنید.
  4. روی تأیید کلیک کنید.

به‌طور پیش‌فرض، Android Studio برای استقرار برنامه‌تان از بسته‌های برنامه استفاده نمی‌کند. درعوض، IDE فایل‌های APK را برای دستگاهتان می‌سازد و نصب می‌کند که برای سرعت استقرار بهینه‌سازی شده‌اند، نه برای اندازه APK. برای پیکربندی Android Studio به‌منظور ساختن و استقرار فایل‌های APK و تجربه‌های فوری از بسته برنامه، پیکربندی اجرا/اشکال‌زدایی را اصلاح کنید.

استفاده از واحدهای ویژگی برای ارائه سفارشی

مزیت منحصربه‌فرد واحدهای ویژگی، توانایی سفارشی‌سازی نحوه و زمان بارگیری ویژگی‌های مختلف برنامه‌تان در دستگاه‌های دارای Android 5.0 (سطح میانای برنامه‌سازی کاربردی ۲۱) یا بالاتر است. برای مثال، برای کاهش اندازه بارگیری اولیه برنامه‌تان، می‌توانید ویژگی‌های خاصی را پیکربندی کنید تا درصورت نیاز به‌صورت درخواستی بارگیری شوند یا فقط توسط دستگاه‌هایی بارگیری شوند که از قابلیت‌های خاصی پشتیبانی می‌کنند، مثل توانایی عکس گرفتن یا پشتیبانی از ویژگی‌های واقعیت افزوده.

اگرچه وقتی برنامه‌تان را به‌صورت دسته برنامه بارگذاری می‌کنید، به‌طور پیش‌فرض بارگیری‌های بسیار بهینه‌شده‌ای دریافت می‌کنید، گزینه‌های پیشرفته‌تر و قابل‌سفارشی‌سازی‌تر برای ارائه ویژگی‌ها به پیکربندی بیشتر و مدولارسازی ویژگی‌های برنامه‌تان بااستفاده از واحدهای ویژگی نیاز دارد. یعنی واحدهای ویژگی، اجزای سازنده را برای ایجاد ویژگی‌های واحدی فراهم می‌کنند که می‌توانید آن‌ها را پیکربندی کنید تا هرکدام درصورت نیاز بارگیری شوند.

برنامه‌ای را درنظر بگیرید که به کاربران اجازه می‌دهد کالاها را در بازار آنلاین خرید و فروش کنند. می‌توانید هریک از عملکردهای زیر را در برنامه به‌طور منطقی به واحدهای ویژگی جداگانه تقسیم کنید:

  • ورود به سیستم و ایجاد حساب
  • درحال مرور بازارگاه
  • قرار دادن محصول برای فروش
  • درحال پردازش پرداخت‌ها

جدول زیر گزینه‌های مختلف تحویل را که واحدهای ویژگی پشتیبانی می‌کنند و نحوه استفاده از آن‌ها برای بهینه‌سازی اندازه بارگیری اولیه برنامه نمونه بازار را شرح می‌دهد.

گزینه ارسال رفتار مورد استفاده نمونه شروع کردن
تحویل در زمان نصب واحدهای ویژگی که هیچ‌کدام از گزینه‌های ارائه شرح‌داده‌شده در بالا را پیکربندی نمی‌کنند، به‌طور پیش‌فرض هنگام نصب برنامه بارگیری می‌شوند. این رفتار مهمی است زیرا به این معنی است که می‌توانید گزینه‌های پیشرفته ارسال را به‌تدریج اتخاذ کنید. برای مثال، می‌توانید از پیمانه‌ای کردن ویژگی‌های برنامه‌تان بهره‌مند شوید و تحویل درخواستی را فقط پس‌از پیاده‌سازی کامل بارگیری‌های درخواستی بااستفاده از «کتابخانه ویژگی تحویل Play» فعال کنید.

علاوه‌براین، برنامه‌تان می‌تواند درخواست کند که ویژگی‌ها در زمان دیگری حذف نصب شوند. بنابراین، اگر به ویژگی‌های خاصی در زمان نصب برنامه نیاز دارید، اما پس‌از آن به آن‌ها نیاز ندارید، می‌توانید با درخواست برداشتن آن ویژگی از دستگاه، اندازه نصب را کاهش دهید.

اگر برنامه فعالیت‌های آموزشی خاصی دارد، مثل راهنمای تعاملی درباره نحوه خرید و فروش اقلام در بازار، می‌توانید آن ویژگی را به‌طور پیش‌فرض در نصب برنامه بگنجانید.

بااین‌حال، برای کاهش اندازه نصب‌شده برنامه، برنامه می‌تواند درخواست کند ویژگی را پس‌از تکمیل آموزش توسط کاربر حذف کند.

برنامه‌تان را بااستفاده از واحدهای ویژگی که هیچ گزینه توزیع پیشرفته‌ای را پیکربندی نمی‌کنند، مدولار کنید.

برای آشنایی با نحوه کاهش اندازه نصب‌شده برنامه‌تان با برداشتن برخی‌از واحدهای ویژگی که ممکن است کاربر دیگر به آن‌ها نیاز نداشته باشد، مدیریت واحدهای نصب‌شده را بخوانید.

تحویل درصورت درخواست به برنامه شما اجازه می‌دهد درصورت نیاز، واحدهای ویژگی را درخواست و بارگیری کند. اگر فقط ۲۰٪ از افرادی که از برنامه بازار استفاده می‌کنند مواردی را برای فروش پست می‌کنند، یک استراتژی خوب برای کاهش اندازه بارگیری اولیه برای اکثر کاربران این است که عملکرد گرفتن عکس، ازجمله شرح مورد، و قرار دادن مورد برای فروش را به‌عنوان بارگیری درخواستی دردسترس قرار دهید. یعنی می‌توانید پیمانه ویژگی را برای عملکرد فروش برنامه پیکربندی کنید تا فقط زمانی بارگیری شود که کاربر به قرار دادن اقلام برای فروش در بازار علاقه نشان دهد.

علاوه‌براین، اگر کاربر پس‌از مدت زمان مشخصی دیگر کالایی نفروشد، برنامه می‌تواند با درخواست حذف نصب ویژگی، اندازه نصب‌شده خود را کاهش دهد.

یک پیمانه ویژگی ایجاد کنید و ارسال درخواستی را پیکربندی کنید. سپس برنامه‌تان می‌تواند از کتابخانه Play Feature Delivery برای درخواست بارگیری ماژول درصورت درخواست استفاده کند.
ارائه آگهی شرطی به شما امکان می‌دهد الزامات خاصی را برای دستگاه کاربر مشخص کنید، مانند ویژگی‌های سخت‌افزاری، زبان و منطقه، و حداقل سطح API، تا تعیین کنید آیا یک ویژگی مدولارشده در زمان نصب برنامه بارگیری شود یا نه. اگر برنامه بازار دسترسی جهانی دارد، ممکن است لازم باشد از روش‌های پرداختی پشتیبانی کنید که فقط در مناطق یا مکان‌های خاصی محبوب هستند. برای کاهش اندازه بارگیری اولیه برنامه، می‌توانید واحدهای ویژگی جداگانه‌ای برای پردازش انواع خاصی از روش‌های پرداخت ایجاد کنید و آن‌ها را به‌صورت مشروط براساس منطقه ثبت‌شده کاربر در دستگاه او نصب کنید. یک پیمانه ویژگی ایجاد کنید و ارسال مشروط را پیکربندی کنید.
تحویل فوری Google Play فوری به کاربران اجازه می‌دهد بدون نیاز به نصب برنامه در دستگاهشان، با برنامه شما تعامل داشته باشند. درعوض، می‌توانند ازطریق دکمه «اکنون امتحان کنید» در «فروشگاه Google Play» یا نشانی وبی که ایجاد می‌کنید، برنامه‌تان را تجربه کنند. این شکل از ارائه محتوا افزایش تعامل با برنامه‌تان را برای شما آسان‌تر می‌کند.

با ارائه فوری، می‌توانید از «Google Play فوری» استفاده کنید تا به کاربران اجازه دهید فوراً برخی‌از ویژگی‌های برنامه‌تان را بدون نصب تجربه کنند.

بازی‌ای را درنظر بگیرید که چند سطح اول بازی را در واحد ویژگی کم‌حجم قرار می‌دهد. می‌توانید آن واحد را به‌صورت فوری فعال کنید تا کاربران بتوانند فوراً بازی را ازطریق پیوند نشانی وب یا دکمه «اکنون امتحان کنید» بدون نصب برنامه تجربه کنند. یک واحد ویژگی ایجاد کنید و ارسال فوری را پیکربندی کنید. سپس برنامه‌تان می‌تواند از کتابخانه Play Feature Delivery برای درخواست بارگیری ماژول درصورت درخواست استفاده کند.

به‌یاد داشته باشید که مدولار کردن ویژگی‌های برنامه بااستفاده از واحدهای ویژگی فقط اولین قدم است. برای پشتیبانی از Google Play Instant، اندازه بارگیری ماژول پایه برنامه‌تان و ویژگی فعال‌شده فوری باید از محدودیت‌های اندازه سخت‌گیرانه پیروی کند. برای کسب اطلاعات بیشتر، فعال کردن تجربه‌های فوری با کاهش اندازه برنامه یا بازی را بخوانید.

ساختن URI برای منبع

اگر می‌خواهید بااستفاده از URI به منبعی که در واحد ویژگی ذخیره شده است دسترسی پیدا کنید، در اینجا نحوه تولید URI منبع واحد ویژگی بااستفاده از Uri.Builder() آورده شده است:

کاتلین

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()

جاوا

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» که درحال بررسی محتوای فایل منبع کامپایل‌شده است.
شکل ۱. از «تحلیل‌کننده APK» برای بررسی نام بسته در فایل منبع کامپایل‌شده استفاده کنید.

ملاحظات مربوط به واحدهای ویژگی

با واحدهای ویژگی، می‌توانید سرعت ساخت و سرعت مهندسی را بهبود ببخشید و توزیع ویژگی‌های برنامه‌تان را به‌طور گسترده سفارشی‌سازی کنید تا اندازه برنامه‌تان کاهش یابد. بااین‌حال، هنگام استفاده از واحدهای ویژگی، برخی محدودیت‌ها و موارد لبه‌ای وجود دارد که باید درنظر داشته باشید:

  • نصب ۵۰ پیمانه ویژگی یا بیشتر در یک دستگاه، ازطریق ارسال مشروط یا ارسال درخواستی، ممکن است به مشکلات عملکرد منجر شود. پیمانه‌های زمان نصب که به‌عنوان قابل‌برداشتن پیکربندی نشده‌اند، به‌طور خودکار در پیمانه پایه گنجانده می‌شوند و فقط به‌عنوان یک پیمانه ویژگی در هر دستگاه به‌حساب می‌آیند.
  • تعداد پیمانه‌هایی را که به‌عنوان قابل‌حذف برای ارسال در زمان نصب پیکربندی می‌کنید به ۱۰ یا کمتر محدود کنید. درغیراین‌صورت، ممکن است زمان بارگیری و نصب برنامه‌تان افزایش یابد.
  • فقط دستگاه‌های دارای Android 5.0 (سطح میانای برنامه‌سازی کاربردی ۲۱) و بالاتر از بارگیری و نصب ویژگی‌ها به‌صورت درخواستی پشتیبانی می‌کنند. برای دردسترس قرار دادن ویژگی‌تان برای نسخه‌های قبلی Android، ادغام را هنگام ایجاد واحد ویژگی فعال کنید.
  • SplitCompat را فعال کنید تا برنامه‌تان به واحدهای ویژگی بارگیری‌شده که به‌صورت درخواستی ارائه می‌شوند دسترسی داشته باشد.
  • واحدهای ویژگی نباید فعالیت‌ها را در مانیفست خود با android:exported تنظیم‌شده روی true مشخص کنند. دلیلش این است که وقتی برنامه دیگری سعی می‌کند فعالیت را راه‌اندازی کند، هیچ تضمینی وجود ندارد که دستگاه واحد ویژگی را بارگیری کرده باشد. علاوه‌براین، برنامه‌تان باید قبل‌از تلاش برای دسترسی به کد و منابع ویژگی، تأیید کند که ویژگی بارگیری شده است. برای کسب اطلاعات بیشتر، مدیریت کردن ماژول‌های نصب‌شده را بخوانید.
  • چون «ویژگی تحویل Play» از شما می‌خواهد برنامه‌تان را بااستفاده از دسته برنامه منتشر کنید، مطمئن شوید که از مشکلات شناخته‌شده دسته برنامه مطلع هستید.

مرجع مانیفست واحد ویژگی

هنگام ایجاد واحد ویژگی جدید بااستفاده از Android Studio، محیط توسعه یکپارچه بیشتر مشخصه‌های مانیفست را که واحد برای رفتار کردن مانند واحد ویژگی نیاز دارد دربرمی‌گیرد. به‌علاوه، برخی‌از مشخصه‌ها توسط سیستم ساخت در زمان ترجمه تزریق می‌شوند، بنابراین نیازی نیست خودتان آن‌ها را مشخص یا اصلاح کنید. جدول زیر مشخصه‌های مانیفست را که برای واحدهای ویژگی مهم هستند شرح می‌دهد.

مشخصه شرح
<manifest این یک سازه <manifest> معمولی است.
xmlns:dist="http://schemas.android.com/apk/distribution" فضای نام XML جدید dist: را مشخص می‌کند که در زیر بیشتر توضیح داده شده است.
split="split_name" وقتی Android Studio دسته برنامه‌تان را می‌سازد، این مشخصه را برای شما اضافه می‌کند. بنابراین، نباید خودتان این مشخصه را اضافه یا اصلاح کنید.

نام واحد را تعریف می‌کند، که برنامه‌تان هنگام درخواست واحد درخواستی بااستفاده از «کتابخانه ویژگی تحویل Play» مشخص می‌کند.

نحوه تعیین مقدار این مشخصه توسط Gradle:

به‌طور پیش‌فرض، وقتی بااستفاده از Android Studio واحد ویژگی ایجاد می‌کنید، IDE از آنچه به‌عنوان نام واحد آن مشخص می‌کنید استفاده می‌کند تا واحد را به‌عنوان زیرپروژه Gradle در فایل تنظیمات Gradle شما شناسایی کند.

وقتی دسته برنامه‌تان را می‌سازید، Gradle از آخرین عنصر مسیر زیرپروژه برای تزریق این مشخصه مانیفست در مانیفست واحد استفاده می‌کند. برای مثال، اگر واحد ویژگی جدیدی در دایرکتوری MyAppProject/features/ ایجاد کنید و «dynamic_feature1» را به‌عنوان نام واحد آن مشخص کنید، IDE ':features:dynamic_feature1' را به‌عنوان زیرپروژه در فایل settings.gradle شما اضافه می‌کند. هنگام ساختن دسته برنامه، Gradle سپس <manifest split="dynamic_feature1"> را در مانیفست واحد تزریق می‌کند.

android:isFeatureSplit="true | false"> وقتی Android Studio دسته برنامه‌تان را می‌سازد، این مشخصه را برای شما لحاظ می‌کند. بنابراین، نباید این مشخصه را به‌صورت دستی اضافه یا اصلاح کنید.

مشخص می‌کند که این واحد یک واحد ویژگی است. مانیفست‌ها در ماژول پایه و APKهای پیکربندی یا این مشخصه را حذف می‌کنند یا آن را روی false تنظیم می‌کنند.

<dist:module مشخصه‌هایی را تعریف می‌کند که نحوه بسته‌بندی و توزیع ماژول را به‌عنوان APK تعیین می‌کنند.
dist:instant="true | false" مشخص می‌کند که آیا ماژول باید ازطریق Google Play Instant به‌عنوان تجربه فوری دردسترس باشد یا نه.

اگر برنامه‌تان شامل یک یا چند واحد ویژگی با قابلیت فعال‌سازی آنی است، باید واحد پایه را نیز با قابلیت فعال‌سازی آنی ارائه دهید. هنگام استفاده از 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 که دستگاه‌های هدف با Android نسخه ۴.۴ (سطح میانای برنامه‌سازی کاربردی ۲۰) و پایین‌تر را هدف قرار می‌دهند گنجانده شود یا نه.

علاوه‌براین، وقتی از bundletool برای تولید فایل‌های APK از دسته برنامه استفاده می‌کنید، فقط واحدهای ویژگی که این ویژگی را روی true تنظیم می‌کنند در APK جهانی گنجانده می‌شوند—که یک APK یکپارچه است که شامل کد و منابع برای همه پیکربندی‌های دستگاهی است که برنامه‌تان پشتیبانی می‌کند.

<dist:delivery> گزینه‌هایی را که تحویل ماژول را سفارشی‌سازی می‌کنند، همان‌طور که در زیر نشان داده شده است، کپسوله می‌کند. به‌خاطر داشته باشید که هر پیمانه ویژگی باید فقط یک نوع از این گزینه‌های ارسال سفارشی را پیکربندی کند.
<dist:install-time> مشخص می‌کند که واحد باید در زمان نصب دردسترس باشد. این رفتار پیش‌فرض برای واحدهای ویژگی است که نوع دیگری از گزینه ارسال سفارشی را مشخص نمی‌کنند.

برای کسب اطلاعات بیشتر درباره بارگیری‌های زمان نصب، پیکربندی ارسال زمان نصب را بخوانید.

این گره همچنین می‌تواند شرایطی را مشخص کند که ماژول را به دستگاه‌هایی محدود می‌کند که الزامات خاصی را برآورده می‌کنند، مانند ویژگی‌های دستگاه، کشور کاربر، یا حداقل سطح API. برای کسب اطلاعات بیشتر، پیکربندی ارسال مشروط را بخوانید.

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

وقتی تنظیم نشده باشد یا روی false تنظیم شده باشد، bundletool هنگام تولید APK جداشده از بسته، مدول‌های زمان نصب را در مدول پایه ادغام می‌کند. چون درنتیجه ادغام، APK جداشده کمتری وجود خواهد داشت، این تنظیم ممکن است عملکرد برنامه‌تان را بهبود بخشد.

وقتی removable روی true تنظیم شده باشد: پیمانه‌های زمان نصب با پیمانه پایه ادغام نخواهند شد. اگر می‌خواهید در آینده ماژول‌ها را حذف نصب کنید، روی true تنظیم کنید. بااین‌حال، پیکربندی تعداد زیادی پیمانه برای قابل‌حذف بودن ممکن است زمان نصب برنامه‌تان را افزایش دهد.

پیش‌فرض‌ها به false. تنها درصورتی لازم است این مقدار را در مانیفست تنظیم کنید که بخواهید ادغام را برای واحد ویژگی غیرفعال کنید.

توجه: این ویژگی فقط هنگام استفاده از افزونه Android Gradle نسخه ۴.۲ یا هنگام استفاده از 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 Feature Delivery» یا استفاده از آن، با شرایط خدمات کیت توسعه نرم‌افزار Play Core موافقت می‌کنید. لطفاً قبل‌از دسترسی به کتابخانه، همه شرایط و خط‌مشی‌های ذی‌ربط را بخوانید و درک کنید.

ایمنی داده

کتابخانه‌های «هسته Play» میانای زمان اجرای برنامه شما با «فروشگاه Google Play» هستند. بنابراین، وقتی از «هسته Play» در برنامه‌تان استفاده می‌کنید، «فروشگاه Play» فرایندهای خودش را اجرا می‌کند که شامل مدیریت داده‌ها طبق شرایط خدمات Google Play می‌شود. اطلاعات زیر نحوه مدیریت داده‌ها توسط کتابخانه‌های «هسته Play» را برای پردازش درخواست‌های خاص از برنامه‌تان شرح می‌دهد.

میانای برنامه‌سازی کاربردی زبان‌های دیگر

داده‌های جمع‌آوری‌شده درباره استفاده فهرست زبان‌های نصب‌شده
هدف جمع‌آوری داده‌ها از داده‌های جمع‌آوری‌شده برای ارائه نسخه‌های زبانی مختلف برنامه و حفظ زبان‌های نصب‌شده پس‌از به‌روزرسانی برنامه استفاده می‌شود.
رمزگذاری داده‌ها داده‌ها رمزگذاری می‌شود.
هم‌رسانی کردن داده داده‌ها به هیچ طرف سومی منتقل نمی‌شود.
حذف داده داده‌ها پس‌از یک دوره نگهداری ثابت حذف می‌شوند.

ارسال ویژگی Play

داده‌های جمع‌آوری‌شده درباره استفاده فراداده دستگاه
نسخه برنامه
هدف جمع‌آوری داده‌ها از داده‌های جمع‌آوری‌شده برای ارائه واحد صحیح به دستگاه و حفظ واحدهای نصب‌شده پس‌از به‌روزرسانی و پشتیبان‌گیری و بازیابی استفاده می‌شود.
رمزگذاری داده‌ها داده‌ها رمزگذاری می‌شود.
هم‌رسانی کردن داده داده‌ها به هیچ طرف سومی منتقل نمی‌شود.
حذف داده داده‌ها پس‌از یک دوره نگهداری ثابت حذف می‌شوند.

درحالی‌که هدف ما این است که تا حد امکان شفاف باشیم، شما به‌تنهایی مسئول تصمیم‌گیری درباره نحوه پاسخ دادن به فرم بخش ایمنی داده Google Play درخصوص جمع‌آوری، هم‌رسانی، و شیوه‌های امنیتی داده‌های کاربر برنامه‌تان هستید.