کاربران اغلب از دانلود برنامه هایی که خیلی بزرگ به نظر می رسند، اجتناب می کنند، به ویژه در بازارهای نوظهور که دستگاه ها به شبکه های ناپایدار 2G و 3G متصل می شوند یا روی برنامه هایی با محدودیت داده کار می کنند. این صفحه نحوه کاهش حجم دانلود برنامه را توضیح می دهد که به کاربران بیشتری امکان می دهد برنامه شما را دانلود کنند.
برنامه خود را با Android App Bundles آپلود کنید
برنامه خود را بهعنوان یک Android App Bundle بارگذاری کنید تا هنگام انتشار در Google Play فوراً اندازه برنامه را ذخیره کنید. Android App Bundle یک قالب آپلود است که شامل تمام کدها و منابع کامپایل شده برنامه شما می شود اما تولید APK و امضای آن را به Google Play به تعویق می اندازد.
سپس مدل سرویسدهی برنامه Google Play از بسته نرم افزاری شما برای تولید و ارائه فایلهای APK بهینهسازی شده برای پیکربندی دستگاه هر کاربر استفاده میکند تا آنها فقط کد و منابعی را که برای اجرای برنامه شما نیاز دارند دانلود کنند. برای پشتیبانی از دستگاههای مختلف، نیازی به ساخت، امضا و مدیریت چندین APK ندارید و کاربران بارگیریهای کوچکتر و بهینهتری دریافت میکنند.
Google Play یک محدودیت حجم دانلود فشرده 200 مگابایتی را برای برنامههای منتشر شده با بستههای برنامه اعمال میکند. اندازههای بزرگتر با استفاده از Play Feature Delivery و Play Asset Delivery امکانپذیر است، اما افزایش اندازه برنامه شما میتواند بر موفقیت نصب تأثیر منفی بگذارد و حذف نصب را افزایش دهد، بنابراین توصیه میکنیم دستورالعملهای توضیحدادهشده در این صفحه را اعمال کنید تا اندازه دانلود برنامهتان را تا حد امکان کاهش دهید.
ساختار APK را درک کنید
قبل از کاهش اندازه برنامه، درک ساختار APK یک برنامه مفید است. یک فایل APK از یک آرشیو ZIP تشکیل شده است که شامل تمام فایلهایی است که برنامه شما را تشکیل میدهند. این فایل ها شامل فایل های کلاس جاوا، فایل های منبع و فایلی حاوی منابع کامپایل شده است.
یک APK شامل دایرکتوری های زیر است:
-
META-INF/
: حاوی فایل های امضایCERT.SF
وCERT.RSA
و همچنین فایل مانیفستMANIFEST.MF
است. -
assets/
: حاوی دارایی های برنامه است که برنامه می تواند با استفاده از یک شیAssetManager
آنها را بازیابی کند. -
res/
: حاوی منابعی است که درresources.arsc
کامپایل نشده اند.arsc. -
lib/
: حاوی کد کامپایل شده ای است که مخصوص لایه نرم افزاری یک پردازنده است. این فهرست شامل یک زیرشاخه برای هر نوع پلتفرم است، مانندarmeabi
،armeabi-v7a
،arm64-v8a
،x86
،x86_64
، وmips
.
یک APK همچنین حاوی فایل های زیر است. فقط AndroidManifest.xml
اجباری است:
-
resources.arsc
: حاوی منابع کامپایل شده است. این فایل حاوی محتوای XML از تمام تنظیمات پوشهres/values/
است. ابزار بسته بندی این محتوای XML را استخراج می کند، آن را به شکل باینری کامپایل می کند و محتوا را بایگانی می کند. این محتوا شامل رشتهها و سبکهای زبان و همچنین مسیرهایی به محتوایی است که مستقیماً در فایلresources.arsc
گنجانده نشده است، مانند فایلهای طرحبندی و تصاویر. -
classes.dex
: شامل کلاس هایی است که در قالب فایل DEX که توسط ماشین مجازی Dalvik یا ART قابل درک است، کامپایل شده است. -
AndroidManifest.xml
: حاوی فایل مانیفست اصلی اندروید است. این فایل نام، نسخه، حقوق دسترسی و فایلهای کتابخانه مرجع برنامه را فهرست میکند. این فایل از فرمت باینری XML اندروید استفاده می کند.
تعداد و اندازه منابع را کاهش دهید
اندازه APK شما بر سرعت بارگیری برنامه، میزان حافظه مصرفی و میزان مصرف انرژی تأثیر دارد. میتوانید APK خود را با کاهش تعداد و اندازه منابع موجود در آن کوچکتر کنید. به طور خاص، میتوانید منابعی را که برنامهتان دیگر استفاده نمیکند حذف کنید، و میتوانید به جای فایلهای تصویری از اشیاء Drawable
مقیاسپذیر استفاده کنید. در این بخش این روشها و روشهای دیگری که میتوانید منابع برنامه خود را کاهش دهید تا اندازه کلی APK خود را کاهش دهید، مورد بحث قرار میدهد.
منابع بلااستفاده را حذف کنید
ابزار lint
- یک تحلیلگر کد ایستا موجود در Android Studio - منابعی را در پوشه res/
شما شناسایی می کند که کد شما به آنها اشاره نمی کند. هنگامی که ابزار lint
یک منبع بالقوه استفاده نشده را در پروژه شما کشف می کند، پیامی مانند مثال زیر را چاپ می کند:
res/layout/preferences.xml: Warning: The resource R.layout.preferences appears to be unused [UnusedResources]
کتابخانه هایی که به کد خود اضافه می کنید ممکن است شامل منابع استفاده نشده باشند. اگر shrinkResources
در فایل build.gradle.kts
برنامه خود فعال کنید، Gradle می تواند به طور خودکار منابع را از طرف شما حذف کند.
کاتلین
android { // Other settings. buildTypes { getByName("release") { minifyEnabled = true shrinkResources = true proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro") } } }
شیار
android { // Other settings. buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
برای استفاده از shrinkResources
، کوچک کردن کد را فعال کنید. در طول فرآیند ساخت، R8 ابتدا کدهای استفاده نشده را حذف می کند. سپس، افزونه Android Gradle منابع استفاده نشده را حذف می کند.
برای اطلاعات بیشتر در مورد کوچک کردن کد و منابع و سایر روشهایی که Android Studio اندازه APK را کاهش میدهد، به کوچک کردن، مبهم کردن، و بهینهسازی برنامه خود مراجعه کنید.
در Android Gradle Plugin 7.0 و بالاتر، میتوانید پیکربندیهایی را که برنامه شما پشتیبانی میکند، اعلام کنید. Gradle این اطلاعات را با استفاده از resourceConfigurations
flavor و گزینه defaultConfig
به سیستم ساخت منتقل می کند. سپس سیستم ساخت از نمایش منابع دیگر پیکربندی های پشتیبانی نشده در APK جلوگیری می کند و اندازه APK را کاهش می دهد. برای اطلاعات بیشتر درباره این ویژگی، به حذف منابع جایگزین استفاده نشده مراجعه کنید.
استفاده از منابع کتابخانه ها را به حداقل برسانید
هنگامی که یک برنامه اندروید را توسعه می دهید، معمولاً از کتابخانه های خارجی برای بهبود قابلیت استفاده و تطبیق پذیری برنامه خود استفاده می کنید. برای مثال، ممکن است برای بهبود تجربه کاربری در دستگاههای قبلی به AndroidX مراجعه کنید، یا میتوانید از خدمات Google Play برای بازیابی ترجمه خودکار متن در برنامه خود استفاده کنید.
اگر کتابخانه ای برای سرور یا دسکتاپ طراحی شده باشد، می تواند شامل بسیاری از اشیا و روش هایی باشد که برنامه شما به آن ها نیاز ندارد. برای گنجاندن تنها بخشهایی از کتابخانه که برنامه شما به آن نیاز دارد، اگر مجوز به شما اجازه میدهد کتابخانه را تغییر دهید، میتوانید فایلهای کتابخانه را ویرایش کنید. همچنین می توانید از یک کتابخانه جایگزین و سازگار با موبایل برای افزودن عملکردهای خاص به برنامه خود استفاده کنید.
رمزگشایی تصویر متحرک بومی
در Android 12 (سطح API 31)، API NDK ImageDecoder
برای رمزگشایی تمام فریمها و دادههای زمانبندی از تصاویری که از فرمتهای فایل GIF متحرک و WebP متحرک استفاده میکنند، گسترش مییابد.
از ImageDecoder
به جای کتابخانه های شخص ثالث برای کاهش بیشتر اندازه APK و بهره مندی از به روز رسانی های آینده مربوط به امنیت و عملکرد استفاده کنید.
برای جزئیات بیشتر در مورد ImageDecoder
API، به API reference
و نمونه در GitHub مراجعه کنید.
فقط از تراکم های خاص پشتیبانی کنید
اندروید از تراکم های مختلف صفحه نمایش مانند موارد زیر پشتیبانی می کند:
-
ldpi
-
mdpi
-
tvdpi
-
hdpi
-
xhdpi
-
xxhdpi
-
xxxhdpi
اگرچه اندروید از تراکم های قبلی پشتیبانی می کند، اما نیازی نیست که دارایی های شطرنجی شده خود را به هر تراکم صادر کنید.
اگر میدانید که تنها درصد کمی از کاربران شما دستگاههایی با تراکمهای خاص دارند، در نظر بگیرید که آیا باید این تراکمها را در برنامه خود قرار دهید یا خیر. اگر منابعی را برای تراکم صفحهنمایش خاصی درج نکنید، Android بهطور خودکار منابع موجود را که در اصل برای تراکمهای صفحهنمایش دیگر طراحی شدهاند، کاهش میدهد.
اگر برنامه شما فقط به تصاویر مقیاسبندی شده نیاز دارد، میتوانید با داشتن یک نوع تصویر در drawable-nodpi/
فضای بیشتری ذخیره کنید. توصیه می کنیم حداقل یک نوع تصویر xxhdpi
را در برنامه خود قرار دهید.
برای اطلاعات بیشتر در مورد تراکم صفحه نمایش، به اندازه و تراکم صفحه نمایش مراجعه کنید.
از اشیاء قابل کشیدن استفاده کنید
برخی از تصاویر به منبع تصویر ثابت نیاز ندارند. فریم ورک می تواند در عوض به صورت پویا تصویر را در زمان اجرا ترسیم کند. اشیاء Drawable
- یا <shape>
در XML - می توانند فضای کمی را در APK شما اشغال کنند. علاوه بر این، اشیاء XML Drawable
تصاویر تک رنگ مطابق با دستورالعملهای طراحی متریال تولید میکنند.
استفاده مجدد از منابع
میتوانید منبع جداگانهای برای تغییرات یک تصویر، مانند نسخههای رنگآمیزی، سایهدار یا چرخاندهشده همان تصویر اضافه کنید. با این حال، توصیه می کنیم از همان مجموعه منابع استفاده مجدد کنید و در زمان اجرا آن ها را سفارشی کنید.
اندروید چندین ابزار برای تغییر رنگ یک دارایی با استفاده از ویژگیهای android:tint
و tintMode
ارائه میکند.
همچنین می توانید منابعی را که فقط معادل چرخانده شده منبع دیگری هستند حذف کنید. قطعه کد زیر با چرخاندن در وسط تصویر و چرخش 180 درجه ای یک "شست رو به بالا" را به "شست رو به پایین" نشان می دهد:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_thumb_up" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="180" />
رندر از کد
همچنین می توانید با رندر کردن رویه ای تصاویر خود، اندازه APK خود را کاهش دهید. رندر رویه ای فضا را آزاد می کند زیرا دیگر فایل تصویری را در APK خود ذخیره نمی کنید.
فایل های PNG را کرنش کنید
ابزار aapt
میتواند منابع تصویری را که در res/drawable/
قرار گرفتهاند را با فشردهسازی بدون تلفات در طول فرآیند ساخت بهینهسازی کند. به عنوان مثال، ابزار aapt
می تواند یک PNG با رنگ واقعی که به بیش از 256 رنگ نیاز ندارد، به یک PNG 8 بیتی با یک پالت رنگ تبدیل کند. انجام این کار منجر به تصویری با کیفیت یکسان اما ردپای حافظه کوچکتر می شود.
aapt
دارای محدودیت های زیر است:
- ابزار
aapt
فایل های PNG موجود درasset/
پوشه را کوچک نمی کند. - فایل های تصویری باید از ۲۵۶ رنگ یا کمتر برای ابزار
aapt
استفاده کنند تا آنها را بهینه کند. - ابزار
aapt
ممکن است فایلهای PNG را که قبلاً فشرده شدهاند، افزایش دهد. برای جلوگیری از این امر، میتوانید از پرچمisCrunchPngs
برای غیرفعال کردن این فرآیند برای فایلهای PNG استفاده کنید:
کاتلین
buildTypes.all { isCrunchPngs = false }
شیار
buildTypes.all { isCrunchPngs = false }
فشرده سازی فایل های PNG و JPEG
با استفاده از ابزارهایی مانند pngcrush ، pngquant یا zopflipng میتوانید اندازه فایلهای PNG را بدون از دست دادن کیفیت تصویر کاهش دهید. همه این ابزارها می توانند اندازه فایل PNG را کاهش دهند و در عین حال کیفیت تصویر ادراکی را حفظ کنند.
ابزار pngcrush
بسیار موثر است. این ابزار روی فیلترهای PNG و پارامترهای zlib (Deflate) تکرار میشود و از هر ترکیبی از فیلترها و پارامترها برای فشردهسازی تصویر استفاده میکند. سپس پیکربندی را انتخاب می کند که کوچکترین خروجی فشرده را به دست می دهد.
برای فشرده سازی فایل های JPEG، می توانید از ابزارهایی مانند packJPG و guetzli استفاده کنید.
از فرمت فایل WebP استفاده کنید
به جای استفاده از فایل های PNG یا JPEG، می توانید از فرمت فایل WebP نیز برای تصاویر خود استفاده کنید. فرمت WebP فشرده سازی و شفافیت با اتلاف را فراهم می کند، مانند JPG و PNG، و می تواند فشرده سازی بهتری نسبت به JPEG یا PNG ارائه دهد.
با استفاده از Android Studio می توانید تصاویر BMP، JPG، PNG یا استاتیک GIF را به فرمت WebP تبدیل کنید. برای اطلاعات بیشتر، به ایجاد تصاویر WebP مراجعه کنید.
از گرافیک برداری استفاده کنید
می توانید از گرافیک برداری برای ایجاد آیکون های مستقل از وضوح و سایر رسانه های مقیاس پذیر استفاده کنید. شما می توانید از این گرافیک ها برای کاهش ردپای APK خود استفاده کنید. تصاویر برداری در اندروید به عنوان اشیاء VectorDrawable
نشان داده می شوند. با یک شی VectorDrawable
، یک فایل 100 بایتی می تواند تصویر واضحی به اندازه صفحه ایجاد کند.
با این حال، سیستم به طور قابل توجهی زمان بیشتری می برد تا هر شی VectorDrawable
ارائه دهد و تصاویر بزرگتر حتی بیشتر طول می کشد تا روی صفحه نمایش داده شوند. بنابراین، استفاده از این گرافیک های برداری را تنها در هنگام نمایش تصاویر کوچک در نظر بگیرید.
برای اطلاعات بیشتر در مورد کار با اشیاء VectorDrawable
، Drawables را ببینید.
از گرافیک برداری برای تصاویر متحرک استفاده کنید
از AnimationDrawable
برای ایجاد انیمیشنهای فریم به فریم استفاده نکنید، زیرا برای انجام این کار باید یک فایل بیت مپ جداگانه برای هر فریم انیمیشن قرار دهید، که اندازه APK شما را به شدت افزایش میدهد.
در عوض، از AnimatedVectorDrawableCompat
برای ایجاد ترسیمهای برداری متحرک استفاده کنید.
کد بومی و جاوا را کاهش دهید
میتوانید از روشهای زیر برای کاهش اندازه جاوا و پایگاه کد بومی در برنامه خود استفاده کنید.
کدهای تولید شده غیر ضروری را حذف کنید
مطمئن شوید که ردپای هر کدی که به طور خودکار تولید می شود را درک می کنید. به عنوان مثال، بسیاری از ابزارهای بافر پروتکل تعداد زیادی متد و کلاس تولید می کنند که می تواند اندازه برنامه شما را دو یا سه برابر کند.
از شمارش خودداری کنید
یک enum می تواند حدود 1.0 تا 1.4 KB به فایل classes.dex
برنامه شما اضافه کند. این اضافات می توانند به سرعت برای سیستم های پیچیده یا کتابخانه های مشترک جمع شوند. در صورت امکان، از حاشیه نویسی @IntDef
و کوچک کردن کد برای حذف شمارش ها و تبدیل آنها به اعداد صحیح استفاده کنید. این تبدیل نوع تمام مزایای ایمنی نوع enums را حفظ می کند.
اندازه باینری های بومی را کاهش دهید
اگر برنامه شما از کد بومی و Android NDK استفاده میکند، میتوانید با بهینهسازی کد خود، حجم نسخه انتشاری برنامه خود را کاهش دهید. دو تکنیک مفید حذف نمادهای اشکال زدایی و استخراج نکردن کتابخانه های بومی است.
نمادهای اشکال زدایی را حذف کنید
اگر برنامه شما در حال توسعه است و همچنان نیاز به اشکال زدایی دارد، استفاده از نمادهای اشکال زدایی منطقی است. از ابزار arm-eabi-strip
ارائه شده در Android NDK برای حذف نمادهای اشکال زدایی غیر ضروری از کتابخانه های بومی استفاده کنید. پس از آن، می توانید بیلد انتشار خود را کامپایل کنید.
از استخراج کتابخانه های بومی خودداری کنید
هنگام ساختن نسخه انتشاری برنامه خود، با تنظیم useLegacyPackaging
روی false
در فایل build.gradle.kts
برنامه، فایل های .so
فشرده نشده را در APK بسته بندی کنید. غیرفعال کردن این پرچم از کپی کردن فایلهای .so
از APK به سیستم فایل PackageManager
در حین نصب جلوگیری میکند. این روش بهروزرسانیهای برنامه شما را کوچکتر میکند.
چندین APK ناب را حفظ کنید
APK شما ممکن است حاوی محتوایی باشد که کاربران بارگیری میکنند اما هرگز از آن استفاده نمیکنند، مانند زبان اضافی یا منابع با تراکم صفحه نمایش. برای اطمینان از حداقل دانلود برای کاربران خود، برنامه خود را با استفاده از Android App Bundles در Google Play آپلود کنید. آپلود بستههای برنامه به Google Play اجازه میدهد فایلهای APK بهینهسازی شده را برای پیکربندی دستگاه هر کاربر تولید و ارائه کند، بنابراین آنها فقط کد و منابعی را که برای اجرای برنامه شما نیاز دارند دانلود کنند. برای پشتیبانی از دستگاههای مختلف، نیازی به ساخت، امضا و مدیریت چندین APK ندارید و کاربران بارگیریهای کوچکتر و بهینهتری دریافت میکنند.
اگر برنامه خود را در Google Play منتشر نمی کنید، می توانید برنامه خود را به چندین APK تقسیم کنید که با عواملی مانند اندازه صفحه یا پشتیبانی از بافت GPU متفاوت است.
وقتی کاربر برنامه شما را دانلود میکند، دستگاه او APK صحیح را بر اساس ویژگیها و تنظیمات دستگاه دریافت میکند. به این ترتیب، دستگاهها داراییهایی را برای ویژگیهایی که دستگاهها ندارند، دریافت نمیکنند. به عنوان مثال، اگر یک کاربر یک دستگاه hdpi
دارد، به منابع xxxhdpi
که ممکن است برای دستگاههایی با نمایشگرهای تراکم بالاتر اضافه کنید، نیازی ندارد.
برای اطلاعات بیشتر، به ساخت چندین APK و پشتیبانی از چند APK مراجعه کنید.