بسته نرم افزاری با APK متفاوت است، زیرا نمی توانید آن را در دستگاهی نصب کنید. در عوض، این یک قالب انتشار است که شامل تمام کدها و منابع کامپایل شده برنامه شما در یک آرتیفکت بیلد است. بنابراین، پس از اینکه بسته برنامه امضا شده خود را آپلود کردید، Google Play همه چیزهایی را که برای ساخت و امضای فایلهای APK برنامهتان نیاز دارد، و ارائه آنها به کاربران را دارد.
اکثر پروژه های برنامه برای پشتیبانی از Android App Bundles به تلاش زیادی نیاز ندارند. دلیل آن این است که ماژول شامل کد و منابع برای APK پایه برنامه شما، ماژول استاندارد برنامه است که به طور پیشفرض هنگام ایجاد یک پروژه برنامه جدید در Android Studio دریافت میکنید. یعنی ماژولی که افزونه application
زیر را در فایل build.gradle
خود اعمال می کند، کد و منابع را برای عملکرد پایه برنامه شما ارائه می دهد.
// The standard application plugin creates your app's base module. plugins { id 'com.android.application' }
plugins { // The standard application plugin creates your app's base module. id("com.android.application") }
علاوه بر ارائه عملکرد اصلی برای برنامه شما، ماژول پایه همچنین بسیاری از پیکربندی های ساخت و ورودی های مانیفست را ارائه می دهد که بر کل پروژه برنامه شما تأثیر می گذارد.
برای اکثر پروژه های برنامه موجود، نیازی به تغییر چیزی در پیکربندی ساخت ماژول پایه خود ندارید. با این حال، اگر در نظر دارید ماژولهای ویژگی را به پروژه برنامه خود اضافه کنید یا اگر قبلاً برنامه خود را با استفاده از چندین APK منتشر کردهاید، برخی جنبهها در پیکربندی ساخت ماژول پایه وجود دارد که باید در نظر داشته باشید.
با Android App Bundles، دیگر لازم نیست کدهای نسخه چندین APK را که در Google Play آپلود میکنید، مدیریت کنید. در عوض، همانطور که در زیر نشان داده شده است، فقط یک کد نسخه را در ماژول پایه برنامه خود مدیریت می کنید:
// In your base module build.gradle file
android {
defaultConfig {
…
// You specify your app’s version code only in the base module.
versionCode 5
versionName "1.0"
}
}
پس از آپلود بسته برنامه خود، Google Play از کد نسخه در ماژول پایه شما استفاده میکند تا کد نسخه یکسانی را به همه APKهایی که از آن بسته تولید میکند اختصاص دهد. یعنی وقتی دستگاهی برنامه شما را دانلود و نصب میکند، همه فایلهای APK تقسیمشده برای آن برنامه یک کد نسخه را به اشتراک میگذارند.
هنگامی که می خواهید برنامه خود را با کد یا منابع جدید به روز کنید، باید کد نسخه را در ماژول پایه برنامه خود به روز کنید و یک بسته نرم افزاری جدید و کامل بسازید. وقتی آن بسته برنامه را در Google Play آپلود میکنید، مجموعه جدیدی از APK بر اساس کد نسخهای که ماژول پایه مشخص میکند تولید میکند. متعاقباً، وقتی کاربران برنامه شما را بهروزرسانی میکنند، Google Play نسخههای بهروزرسانیشده همه فایلهای APK را که در حال حاضر در دستگاه نصب شدهاند، به آنها ارائه میکند. یعنی تمام APK های نصب شده به کد نسخه جدید به روز می شوند.
- امضای برنامه: اگر اطلاعات امضا را در فایل های ساخت خود قرار دهید، فقط باید آن را در فایل پیکربندی ساخت ماژول پایه قرار دهید. برای اطلاعات بیشتر، به پیکربندی Gradle برای امضای برنامه خود مراجعه کنید.
- کوچک کردن کد: اگر می خواهید کوچک کردن کد را برای کل پروژه برنامه خود (از جمله ماژول های ویژگی آن) فعال کنید ، باید این کار را از فایل build.gradle ماژول پایه انجام دهید. یعنی میتوانید قوانین سفارشی ProGuard را در یک ماژول ویژگی قرار دهید، اما ویژگی
minifyEnabled
در پیکربندیهای ساخت ماژول ویژگی نادیده گرفته میشود. - بلوک
splits
نادیده گرفته می شود: هنگام ساختن یک بسته برنامه، Gradle ویژگی های بلوکandroid.splits
را نادیده می گیرد. اگر میخواهید نوع APK پیکربندی را کنترل کنید که بسته برنامه شما از کدام نوع پیکربندی پشتیبانی میکند، در عوض ازandroid.bundle
برای غیرفعال کردن انواع APK پیکربندی استفاده کنید. - نسخهسازی برنامه: ماژول پایه کد نسخه و نام نسخه را برای کل پروژه برنامه شما تعیین میکند. برای اطلاعات بیشتر، به بخش نحوه مدیریت بهروزرسانیهای برنامه بروید.
بهطور پیشفرض، وقتی یک بسته برنامه میسازید، از ایجاد APK پیکربندی برای هر مجموعه از منابع زبان، منابع تراکم صفحه و کتابخانههای ABI پشتیبانی میکند. با استفاده از بلوک android.bundle
در فایل build.gradle
ماژول پایه خود، همانطور که در زیر نشان داده شده است، می توانید پشتیبانی از یک یا چند نوع APK پیکربندی را غیرفعال کنید:
android { // When building Android App Bundles, the splits block is ignored. // You can remove it, unless you're going to continue to build multiple // APKs in parallel with the app bundle splits {...} // Instead, use the bundle block to control which types of configuration APKs // you want your app bundle to support. bundle { language { // This property is set to true by default. // You can specify `false` to turn off // generating configuration APKs for language resources. // These resources are instead packaged with each base and // feature APK. // Continue reading below to learn about situations when an app // might change setting to `false`, otherwise consider leaving // the default on for more optimized downloads. enableSplit = false } density { // This property is set to true by default. enableSplit = true } abi { // This property is set to true by default. enableSplit = true } } }
android { // When building Android App Bundles, the splits block is ignored. // You can remove it, unless you're going to continue to build multiple // APKs in parallel with the app bundle splits {...} // Instead, use the bundle block to control which types of configuration APKs // you want your app bundle to support. bundle { language { // This property is set to true by default. // You can specify `false` to turn off // generating configuration APKs for language resources. // These resources are instead packaged with each base and // feature APK. // Continue reading below to learn about situations when an app // might change setting to `false`, otherwise consider leaving // the default on for more optimized downloads. enableSplit = false } density { // This property is set to true by default. enableSplit = true } abi { // This property is set to true by default. enableSplit = true } } }
Google Play بر اساس انتخاب زبان در تنظیمات دستگاه کاربر، تعیین میکند که کدام منابع زبان را با برنامه نصب کند. کاربری را در نظر بگیرید که پس از دانلود برنامه شما، زبان سیستم پیش فرض خود را تغییر می دهد. اگر برنامه شما از آن زبان پشتیبانی میکند، دستگاه فایلهای APK پیکربندی اضافی را برای آن منابع زبان از Google Play درخواست و دانلود میکند.
برای برنامههایی که انتخابگر زبان را در داخل برنامه ارائه میکنند و به صورت پویا زبان برنامه را تغییر میدهند، مستقل از تنظیمات زبان سطح سیستم، باید تغییراتی را برای جلوگیری از خرابیها به دلیل کمبود منابع ایجاد کنید. یا ویژگی android.bundle.language.enableSplit
را روی false
تنظیم کنید، یا دانلودهای زبان درخواستی را با استفاده از کتابخانه Play Core اجرا کنید، همانطور که در دانلود منابع زبان اضافی توضیح داده شده است.