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

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

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

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

وقتی با استفاده از اندروید استودیو یک ماژول ویژگی جدید ایجاد می‌کنید، 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'
}

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

چه چیزهایی را نباید در پیکربندی ساخت ماژول ویژگی لحاظ کرد؟

از آنجا که هر ماژول feature به ماژول پایه وابسته است، پیکربندی‌های خاصی را نیز به ارث می‌برد. بنابراین، باید موارد زیر را در فایل build.gradle ماژول feature حذف کنید:

ایجاد ارتباط با ماژول پایه

وقتی اندروید استودیو ماژول feature شما را ایجاد می‌کند، با اضافه کردن ویژگی 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"]
}

علاوه بر این، اندروید استودیو ماژول پایه را به عنوان وابستگی به ماژول ویژگی، همانطور که در زیر نشان داده شده است، در نظر می‌گیرد:

// 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 در زمان ساخت با قوانین سایر ماژول‌ها (از جمله ماژول پایه) ادغام می‌شوند. بنابراین، اگرچه هر ماژول ویژگی ممکن است مجموعه‌ای جدید از قوانین را مشخص کند، اما آن قوانین برای همه ماژول‌های پروژه برنامه اعمال می‌شود.

برنامه خود را مستقر کنید

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

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

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

به طور پیش‌فرض، اندروید استودیو برنامه شما را با استفاده از بسته‌های برنامه برای استقرار آن مستقر نمی‌کند. در عوض، IDE فایل‌های APK را که برای سرعت استقرار بهینه شده‌اند، به جای اندازه APK، روی دستگاه شما می‌سازد و نصب می‌کند. برای پیکربندی اندروید استودیو به جای ساخت و استقرار APKها و تجربیات فوری از یک بسته برنامه، پیکربندی run/debug خود را تغییر دهید .

استفاده از ماژول‌های ویژگی برای تحویل سفارشی

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

به خاطر داشته باشید که ماژولار کردن ویژگی‌های برنامه شما با استفاده از ماژول‌های ویژگی تنها قدم اول است. برای پشتیبانی از Google Play Instant، حجم دانلود ماژول پایه برنامه شما و یک ویژگی فعال‌شده با Instant باید محدودیت‌های حجمی دقیقی را برآورده کند. برای کسب اطلاعات بیشتر، «فعال کردن تجربیات 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، فرض کنید یک app و ماژول‌های feature با این نام‌ها دارید:

  • نام بسته برنامه: com.example.my_app_package
  • نام بسته منابع ویژگی: com.example.my_app_package.my_dynamic_feature

اگر resId در قطعه کد بالا به یک منبع فایل خام با نام "my_video" در ماژول feature شما اشاره کند، کد Uri.Builder() بالا خروجی زیر را خواهد داشت:

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

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

برای اعتبارسنجی مسیرهای موجود در URI خود، می‌توانید از APK Analyzer برای بررسی APK ماژول feature خود و تعیین نام بسته استفاده کنید:

تصویری از تحلیلگر APK که در حال بررسی محتوای یک فایل منبع کامپایل شده است.
شکل ۱. استفاده از APK Analyzer برای بررسی نام بسته در یک فایل منبع کامپایل شده.

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

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

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

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

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

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

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

چگونه Gradle مقدار این ویژگی را تعیین می‌کند:

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

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

اندروید:isFeatureSplit="true | false"> وقتی اندروید استودیو بسته‌ی برنامه‌ی شما را می‌سازد، این ویژگی را برای شما لحاظ می‌کند. بنابراین، نباید این ویژگی را به صورت دستی لحاظ یا تغییر دهید .

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

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

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

شما نمی‌توانید این عنصر XML را در حین تنظیم <dist:on-demand/> روی true تنظیم کنید. با این حال، همچنان می‌توانید با استفاده از Play Feature Delivery Library، دانلودهای درخواستی ماژول‌های ویژگی فعال‌سازی فوری خود را به عنوان تجربیات فوری درخواست کنید. وقتی کاربری برنامه شما را دانلود و نصب می‌کند ، دستگاه به طور پیش‌فرض ماژول‌های ویژگی فعال‌سازی فوری برنامه شما را به همراه APK پایه دانلود و نصب می‌کند.

dist:title="@string/feature_name"> عنوانی را برای ماژول مشخص می‌کند که کاربر با آن مواجه می‌شود. برای مثال، دستگاه ممکن است هنگام درخواست تأیید دانلود، این عنوان را نمایش دهد.

شما باید منبع رشته‌ای این عنوان را در فایل module_root /src/ source_set /res/values/strings.xml ماژول پایه قرار دهید.

<dist:fusing dist:include="true | false" /> مشخص می‌کند که آیا ماژول در multi-APKهایی که دستگاه‌های دارای اندروید ۴.۴ (سطح API 20) و پایین‌تر را هدف قرار می‌دهند، گنجانده شود یا خیر.

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

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

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

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

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

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

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

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

توجه: این ویژگی فقط هنگام استفاده از افزونه Android Gradle نسخه ۴.۲ یا هنگام استفاده از bundletool نسخه ۱.۰ از خط فرمان در دسترس است.

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

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

</فاصله:تحویل>
</dist:module>
<برنامه
اندروید:hasCode ="true | false">
...
</برنامه>
اگر ماژول ویژگی هیچ فایل 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 Core برای پردازش درخواست‌های خاص از برنامه شما را شرح می‌دهد.

API زبان‌های اضافی

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

ارائه ویژگی پخش

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

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