Android App Bundle فایلی است (با پسوند فایل .aab
) که در Google Play آپلود می کنید.
بستههای برنامه، باینریهای امضا شدهای هستند که کد و منابع برنامه شما را در ماژولها سازماندهی میکنند، همانطور که در شکل 1 نشان داده شده است. کدها و منابع برای هر ماژول مشابه آنچه در یک APK پیدا میکنید سازماندهی شدهاند—و این منطقی است زیرا هر یک از این ماژولها ممکن است به عنوان فایل های APK جداگانه تولید می شود. سپس Google Play از بسته برنامه برای تولید فایلهای APK مختلفی که به کاربران ارائه میشوند، مانند APK پایه، APKهای ویژگی، APKهای پیکربندی و (برای دستگاههایی که از APKهای تقسیمشده پشتیبانی نمیکنند) چند APK استفاده میکند. دایرکتوری هایی که به رنگ آبی رنگ شده اند - مانند فهرست های drawable/
، values/
و lib/
- معرف کد و منابعی هستند که Google Play برای ایجاد APK های پیکربندی برای هر ماژول استفاده می کند.
فهرست زیر برخی از فایلها و دایرکتوریهای بسته برنامه را با جزئیات بیشتری شرح میدهد:
- base/، feature1/ و feature2/: هر یک از این دایرکتوری های سطح بالا نشان دهنده یک ماژول متفاوت از برنامه شما هستند. ماژول پایه برنامه شما همیشه در دایرکتوری
base
بسته نرم افزاری موجود است. با این حال، دایرکتوری برای هر ماژول ویژگی با نام مشخص شده توسط ویژگیsplit
در مانیفست ماژول داده می شود. برای کسب اطلاعات بیشتر، درباره مانیفست ماژول ویژگی بخوانید. - asset_pack_1/ و asset_pack_2/: برای برنامهها یا بازیهای بزرگ و گرافیکی، میتوانید داراییها را به بستههای دارایی مدولار کنید. بستههای دارایی به دلیل محدودیتهای اندازه بزرگ برای بازیها ایدهآل هستند. میتوانید نحوه و زمان دانلود هر بسته دارایی بر روی دستگاه را مطابق با سه حالت تحویل سفارشی کنید: زمان نصب، دنبال کردن سریع و درخواستی. همه بستههای دارایی در Google Play میزبانی میشوند و از Google Play ارائه میشوند. برای اطلاعات بیشتر درباره نحوه افزودن بستههای دارایی به بسته برنامه خود، به نمای کلی تحویل دارایی Play مراجعه کنید.
- BUNDLE-METADATA/: این فهرست شامل فایل های ابرداده است که حاوی اطلاعات مفید برای ابزارها یا فروشگاه های برنامه است. چنین فایل های ابرداده ای ممکن است شامل نگاشت های ProGuard و لیست کامل فایل های DEX برنامه شما باشد. فایلهای این فهرست در فایلهای APK برنامه شما بستهبندی نمیشوند.
- فایلهای Module Protocol Buffer (
*.pb
): این فایلها ابردادههایی را ارائه میکنند که به توصیف محتوای هر ماژول برنامه برای فروشگاههای برنامه مانند Google Play کمک میکند. به عنوان مثال،BundleConfig.pb
اطلاعاتی در مورد خود بسته ارائه می دهد، از جمله اینکه کدام نسخه از ابزارهای ساخت برای ساختن بسته نرم افزاری استفاده شده است، وnative.pb
وresources.pb
کد و منابع را در هر ماژول توصیف می کنند، که زمانی مفید است. Google Play فایلهای APK را برای پیکربندیهای مختلف دستگاه بهینه میکند. - manifest/: برخلاف فایلهای APK، بستههای برنامه فایل
AndroidManifest.xml
هر ماژول را در این فهرست جداگانه ذخیره میکنند. - dex/: برخلاف فایلهای APK، بستههای برنامه فایلهای DEX را برای هر ماژول در این فهرست جداگانه ذخیره میکنند.
- res/، lib/، و assets/: این دایرکتوری ها با دایرکتوری های یک APK معمولی یکسان هستند. هنگامی که بسته برنامه خود را آپلود میکنید، Google Play این دایرکتوریها را بررسی میکند و تنها فایلهایی را بستهبندی میکند که پیکربندی دستگاه مورد نظر را برآورده میکند، در حالی که مسیرهای فایل را حفظ میکند.
root/: این فهرست فایلهایی را ذخیره میکند که بعداً به ریشه هر APK منتقل میشوند که شامل ماژولی است که این فهرست در آن قرار دارد. به عنوان مثال، دایرکتوری
base/root/
یک بسته برنامه ممکن است شامل منابع مبتنی بر جاوا باشد که برنامه شما در آن قرار دارد. با استفاده ازClass.getResource()
بارگیری می شود. این فایلها بعداً به دایرکتوری اصلی APK پایه برنامه شما و هر چند APKی که Google Play تولید میکند منتقل میشوند. مسیرهای داخل این فهرست نیز حفظ می شوند. یعنی دایرکتوری ها (و زیر شاخه های آنها) نیز به ریشه APK منتقل می شوند.
نمای کلی APKهای تقسیم شده
یکی از مؤلفههای اساسی ارائه برنامههای بهینه شده، مکانیسم تقسیم APK موجود در Android نسخه 5.0 (سطح API 21) و بالاتر است. APKهای تقسیم شده بسیار شبیه به APKهای معمولی هستند - شامل بایت کد DEX کامپایل شده، منابع و یک مانیفست اندروید هستند. با این حال، پلت فرم اندروید قادر است چندین APK تقسیم شده نصب شده را به عنوان یک برنامه واحد در نظر بگیرد. یعنی میتوانید چندین APK تقسیمشده را نصب کنید که به کدها و منابع مشترک دسترسی دارند و به عنوان یک برنامه نصبشده در دستگاه ظاهر میشوند.
مزیت تقسیمبندی APK، توانایی تجزیه یک APK یکپارچه - یعنی یک APK که شامل کد و منابع برای همه ویژگیها و پیکربندیهای دستگاهی است که برنامه شما پشتیبانی میکند - به بستههای کوچکتر و مجزا که در صورت نیاز روی دستگاه کاربر نصب میشوند.
به عنوان مثال، یک APK تقسیم شده ممکن است شامل کد و منابع یک ویژگی اضافی باشد که تنها تعداد کمی از کاربران شما به آن نیاز دارند، در حالی که APK تقسیمشده دیگر شامل منابعی برای یک زبان یا تراکم صفحه نمایش خاص است. هر یک از این فایلهای APK تقسیمشده زمانی دانلود و نصب میشوند که کاربر آن را درخواست کند یا دستگاه مورد نیاز باشد.
موارد زیر انواع مختلفی از APK را توضیح میدهد که ممکن است با هم روی دستگاه نصب شوند تا تجربه کامل برنامه شما را شکل دهند. نحوه پیکربندی پروژه برنامه خود را برای پشتیبانی از این APK ها در بخش های بعدی این صفحه خواهید آموخت.
- APK پایه: این APK حاوی کد و منابعی است که همه APK های تقسیم شده دیگر می توانند به آنها دسترسی داشته باشند و عملکرد اصلی را برای برنامه شما فراهم می کند. وقتی کاربر درخواست دانلود برنامه شما را میدهد، ابتدا این APK دانلود و نصب میشود. دلیل آن این است که فقط مانیفست APK پایه حاوی اعلامیه کاملی از خدمات، ارائهدهندگان محتوا، مجوزها، الزامات نسخه پلتفرم و وابستگیها به ویژگیهای سیستم است. Google Play APK پایه برنامه شما را از ماژول برنامه (یا پایه) پروژه شما تولید می کند. اگر نگران کاهش حجم دانلود اولیه برنامه خود هستید، مهم است که به خاطر داشته باشید که تمام کدها و منابع موجود در این ماژول در APK پایه برنامه شما گنجانده شده است.
- APKهای پیکربندی: هر یک از این APKها شامل کتابخانههای بومی و منابعی برای تراکم صفحه نمایش، معماری CPU یا زبان خاص هستند. وقتی کاربر برنامه شما را دانلود میکند، دستگاه او فقط فایلهای APK پیکربندی را دانلود و نصب میکند که دستگاه او را هدف قرار میدهد. هر APK پیکربندی به یک APK پایه یا APK ماژول ویژگی وابسته است. یعنی به همراه APK که کد و منابعی برای آن ارائه می کنند دانلود و نصب می شوند. برخلاف ماژول های پایه و ویژگی، ماژول جداگانه ای برای پیکربندی APK ایجاد نمی کنید. اگر از روشهای استاندارد برای سازماندهی منابع جایگزین و پیکربندی خاص برای ماژولهای پایه و ویژگی خود استفاده میکنید، Google Play بهطور خودکار فایلهای APK پیکربندی را برای شما تولید میکند .
- APKهای ماژول ویژگی: هر یک از این APKها حاوی کد و منابعی برای یکی از ویژگیهای برنامه شما هستند که با استفاده از ماژولهای ویژگی مدولار میکنید. سپس میتوانید نحوه و زمان دانلود آن ویژگی در دستگاه را سفارشی کنید. به عنوان مثال، با استفاده از کتابخانه هسته Play ، ممکن است ویژگیها در صورت تقاضا پس از نصب APK پایه روی دستگاه نصب شوند تا عملکردهای بیشتری را برای کاربر فراهم کنند. یک برنامه چت را در نظر بگیرید که فقط زمانی که کاربر درخواست استفاده از آن عملکرد را داشته باشد، قابلیت ضبط و ارسال عکسها را دانلود و نصب میکند. از آنجایی که ممکن است ماژولهای ویژگی در زمان نصب در دسترس نباشند، باید کد و منابع رایج را در APK پایه قرار دهید. یعنی ماژول ویژگی شما باید فرض کند که کد و منابع فقط APK پایه در زمان نصب در دسترس هستند. Google Play فایلهای APK ماژول ویژگی را برای برنامه شما از ماژولهای ویژگی پروژه شما ایجاد میکند.
برنامه ای را با سه ماژول ویژگی و پشتیبانی از پیکربندی های مختلف دستگاه در نظر بگیرید. شکل 1 زیر نشان می دهد که درخت وابستگی برای APK های مختلف برنامه چگونه ممکن است به نظر برسد. توجه داشته باشید که APK پایه سر درخت را تشکیل می دهد و همه APK های دیگر به APK پایه بستگی دارند. (اگر کنجکاو هستید که چگونه ماژولهای این فایلهای APK در یک Android App Bundle نشان داده میشوند، به قالب Android App Bundle مراجعه کنید.)
به خاطر داشته باشید که نیازی نیست خودتان این فایلهای APK را بسازید—Google Play این کار را با استفاده از بسته نرم افزاری امضا شدهای که با Android Studio میسازید، برای شما انجام میدهد. برای کسب اطلاعات بیشتر در مورد قالب برنامه و نحوه ساخت آن، به ساخت، استقرار و آپلود Android App Bundles بروید.
دستگاههایی که Android نسخه ۴.۴ (سطح API ۱۹) و پایینتر دارند
از آنجایی که دستگاههای دارای Android 4.4 (سطح API 19) و پایینتر از دانلود و نصب فایلهای APK تقسیمشده پشتیبانی نمیکنند، Google Play در عوض یک APK به آن دستگاهها ارائه میکند که چند APK نامیده میشود، که برای پیکربندی دستگاه بهینه شده است. به این معنی که چند APK تجربه کامل برنامه شما را نشان میدهد، اما شامل کد و منابع غیرضروری نمیشود - مانند موارد مربوط به تراکمهای صفحه نمایش دیگر و معماریهای CPU.
با این حال، آنها شامل منابعی برای همه زبان هایی هستند که برنامه شما از آنها پشتیبانی می کند. به عنوان مثال، این به کاربران امکان میدهد تنظیمات زبان مورد نظر برنامه شما را بدون نیاز به دانلود چند APK دیگر تغییر دهند.
چند APK توانایی دانلود بعدی ماژول های ویژگی در صورت درخواست را ندارند. برای گنجاندن یک ماژول ویژگی در این APK، باید هنگام ایجاد ماژول ویژگی ، درخواست را غیرفعال کنید یا Fusing را فعال کنید.
به خاطر داشته باشید که با بستههای برنامه، نیازی به ساخت، امضا، آپلود و مدیریت فایلهای APK برای پیکربندی دستگاهی که برنامهتان پشتیبانی میکند ندارید. شما همچنان تنها یک بسته برنامه را برای کل برنامه خود میسازید و آپلود میکنید و Google Play بقیه موارد را برای شما انجام میدهد. بنابراین، چه برنامهای برای پشتیبانی از دستگاههای دارای اندروید 4.4 یا پایینتر داشته باشید، Google Play مکانیزم خدمات انعطافپذیری را هم برای شما و هم برای کاربرانتان فراهم میکند.
زبان کاربر تغییر می کند
با بستههای برنامه، دستگاهها فقط کد و منابعی را که برای اجرای برنامه شما نیاز دارند دانلود میکنند. بنابراین، برای منابع زبان، دستگاه کاربر فقط منابع زبان برنامه شما را دانلود میکند که با یک یا چند زبان در حال حاضر انتخاب شده در تنظیمات دستگاه مطابقت دارد.
وقتی کاربر زبان خود را در تنظیمات دستگاه تغییر میدهد، ممکن است Google Play قبل از نمایش برنامه به زبان جدید، نیاز به دانلود و نصب چند APK تقسیمشده اضافی داشته باشد.
Google Play سعی میکند بلافاصله پس از تغییر، زبانهای اضافی را دانلود کند. اگر دستگاه کاربر آفلاین باشد، دانلود انجام نشود یا منابع خیلی زیاد باشد، وقتی شرایط دستگاه مساعدتر باشد، Google Play دوباره در پسزمینه بارگیری را انجام میدهد. هنگامی که روی دستگاهی با Android 9.0 (سطح API 28) یا پایینتر اجرا میشود، اگر برنامه شما در هنگام نصب APKهای تقسیم زبان جدید در پیشزمینه باشد، برنامه از بین میرود.
اگر برنامه شما نیاز دارد که همه زبانها در هر زمانی در دستگاه در دسترس باشند، میتوانید تقسیم زبان را در پیکربندی ساخت خود غیرفعال کنید .
اگر برنامه شما نیاز به دانلود زبانهای اضافی مستقل از زبانهای کاربر انتخابشده در تنظیمات دستگاه دارد - به عنوان مثال برای پیادهسازی انتخابگر زبان درونبرنامهای - میتوانید از کتابخانه Play Core برای دانلود آنها در صورت درخواست استفاده کنید.