اندازه برنامه خود را کاهش دهید

کاربران اغلب از دانلود برنامه هایی که خیلی بزرگ به نظر می رسند، اجتناب می کنند، به ویژه در بازارهای نوظهور که دستگاه ها به شبکه های ناپایدار 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 مراجعه کنید.