سورس کد سایت سیستم هوشمند ارائه دهنده خدمات سلامت با php
سورس کد سایت سیستم ارائه دهنده خدمات سلامت با php
1398-04-14
تعریف متغیر در کاتلین - آموزش برنامه نویسی kotlin
تعریف متغیر در کاتلین – آموزش برنامه نویسی kotlin
1398-06-09

روش های کاهش حجم فایل APK ، وظیفه یک برنامه نویس اندروید صرفا پیاده سازی کدها و کتابخانه ها در سورس نیست فایل خروجی نمایان گر تمام تلاش برنامه نویس است پس علاوه بر عملکرد خوب اپلیکیشن و زیبایی ظاهری آن ، حجم فایل apk (Android Package) ست که عامل تعیین کننده ای برای دانلود کاربر خواهد بود

طبیعتا زمانی که کاربری ببیند یک اپلیکیشن 30 مگابایت است و اپلیکیشن دیگری مشابه آن 10 مگابایت ، تمایل بیشتری به دانلود اپلیکیشن 10 مگابایتی خواهد داشت چرا که همانطور که گفته شد حجم اپلیکیشن علاوه بر ظاهر و عملکرد خوب تعیین کننده افزایش کاربر اپ خواهد بود.

چند روش توصیه شده گوگل برای کم کردن حجم فایل APK

معمولا ما با اپ های زیادی روبرو هستیم که حجم بالایی دارند و این حجم بالا ناشی از موارد زیر خواهد بود

  • ریسورس استفاده شده
  • کتابخانه های تعبیه شده در اپ
  • کدهای بلااستفاده
  • و…

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

آپلود کردن اپلیکیشن بصورت App Bundle یا ( Upload your app with Android App Bundles )

آپلود کردن فایل در قالب App Bundles یکی از بهترین راه های کاهش حجم فایل APK است.اینکه کلا App Bundle چی هست و چه فلسفه ای داره ما در آموزش های گذشته در تجاری اپ بطور کامل توضیح دادیم پس در این پست تنها اشاره ای کوتاه به App Bundle خواهیم داشت.

اگر بخواهیم App Bundle را کوتاه توضیح دهیم میتونیم بگیم یکی از ساده ترین راه ها برای کاهش حجم فایل APK است بدین صورت که شما میتونید فایل apk خودتون رو در گوگل پلی به عنوان Android App Bundle آپلود کنید.در واقع App Bundle یک فرمت جدید آپلود گوگل پلی است که این امکان را می دهد که اپلیکیشن آپلود شده برای هرکاربر تبدیل به یک اپ کم حجم و کوچک مناسب با کانفیگ موبایل کاربر تبدیل شود تا کاربر بتواند اپ شما را با حجم کم دانلود و نصب کند که البته اپ مناسب کانفیگ گوشی کاربر هم خواهد بود.

استفاده از پلاگین Android size analyzer برای کاهش حجم فایل APK یا ( Use the Android Size Analyzer )

استفاده از پلاگین Android Size Analyzer این امکان را به شما میدهد که نقاطی از سورس که حجم زیادی دارند را شناسایی کنید و حتی پیشنهادی برای کم حجم کردن سایز آن قسمت دریافت کنید.برای نصب پلاگین Android Size Analyzer به مسیر زیر بروید:

File / Setting / plugins

در تب Marketplace عبارت Android Size Analyzer را جستجو کنید

روش های کاهش حجم فایل APK
روش های کاهش حجم فایل APK

سپس پلاگین رو نصب و اندروید استودیو رو ری استارت کنید.
برای اجرای پلاگین هم به مسیر زیر بروید

Analyze / Analyze App Size

سپس خواهید دید پنجره زیر باز خواهد شد

روش های کاهش حجم فایل APK
روش های کاهش حجم فایل APK

همچنین میتونید پلاگین Android Size Analyzer رو بصورت کامند هم ران کنید بدین صورت که نسخه آخر پلاگین رو از گیت هاب مربوطه ش دانلود کنید ، بصورت TAR یا ZIP پس از استخراج پلاگین رو در مک یا لینوکس و یاحتی .bat در ویندوز با دستورات زیر اجرا کنید

./size-analyzer check-bundle
./size-analyzer check-project

خواهید دید پلاگین Android Size Analyzer پرحجم ترین فایل ها به علاوه یک پیشنهاد به شما ارائه میدهد

دانستن و آشنایی با ساختار فایل apk یا ( Understand the APK structure )

بدون دانستن ساختار فایل APK شما عملا دارید به بیراهه میرید !
مسلما تا چیزی رو نشناسید نمیتونید روی اون کار کنید و بهینه ش کنید.پروسه کم کردن حجم فایل apk ها از این قائده مستثنا نیست. شما ابتدا باید با ساختار فایل apk آشنا باشید سپس راه های کم کردن حجم رو امتحان کنید.
فایل APK شامل دایرکتوری های زیر است :

META-INF

شامل فایل های امضا CERT.SF و CERT.RSA و همچنین MANIFEST.MF فایل منیفست

assests

شامل فایل های موجود در دایرکتوری assests است

res

شامل تمامی ریسورس هایی ست که در resourse.arsc کامپایل نشده

lib

شامل کدهای کامپایل شده ای ست که به لایه نرم افزاری یک پردازنده خاص مرتبط است. این دایرکتوری شامل تعدادی زیر دایرکتوری یا sub directory برای هر پردازنده مانند armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, and mips است.

resources.arsc

شامل ریسورس های کامپایل شده است برای مثال تمامی فایل های درون res/values/
این فایل ها به فرم باینری تبدیل میشوند و محتوی شان آرشیو میشود این محتوی شامل string ها و style هاست و همچنین دایرکتوری که مستقیما در resourse.arsc نیست مثلا layout ها و تصاویر

classes.dex

شامل تمامی کلاس های کامپایل شده به فرمت DEX است که توسط ماشین مجازی Dalvik/ART قابل فهم است

AndroidManifest.xml

شامل فایل منیفست اصلی ست که تمامی اطلاعات اصلی اپ از جمله نام ، ورژن ، دسترسی ها و رفرنس کتابخانه ها درون اپ را درون خود دارد.فایل manifest هم از فرمت باینری xml استفاده میکند.

حذف ریسورس های بلااستفاده و کم کردن حجم ریسورس ها ( Reduce resouce count and size )

کم کردن تعداد ریسورس (از جمله عکس و موزیک و …) و یا کم کردن حجم آنها میتواند خیلی به کم شدن سورس کمک کند.میتونید عکس هایی که دیگر استفاده ای در اپ ندارند را حذف کنید و یا حتی عکس هایی که مجبور به استفاده از آنها هستید را با سایز کمتری در سورس ذخیره کنید.

در ادامه دو مبحث کم کردن سایز ریسورس و حذف ریسورس های بلا استفاده را با جزییات بیشتری بررسی خواهیم کرد.

حذف ریسورس های بلااستفاده کاهش حجم فایل APK یا ( Remove unused resources )

ابزار lint یک ابزار استاتیک درون اندروید استودیو ست که ریسورس های درون دایرکتوری res/ را که درون سورس رفرنسی ندارند یا به عبارت دیگر در جایی از سورس استفاده نشدند را تشخیص میدهد و اگر موفق به تشخیص شد پیغامی مشابه پیغام زیر را به شما میدهد

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
to be unused [UnusedResources]

نکته :
ابزار lint دایرکتوری assests/ را اسکن نمیکند و همچنین ریسورس های بلااستفاده را حذف نمیکند بلکه فقط به شما هشدار میدهد!

کتابخانه هایی که به سورس اضافه میکند ممکن است که ریسورس هایی همراه خود اضافه کنند که هیچگاه استفاده نشوند و فقط به حجم اپ شما اضافه شود ! گردل Gradle میتواند به صورت اتوماتیک ریسورس های بلا استفاده را حذف کند اگر که پراپرتی shrinkResouces را در فایل build.gradle فعال کنید

android {
    // Other settings

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

همانطور که میبیند ما progaurd رو هم فعال کردیم .درواقع حین پروسه build شدن ProGuard کدهای بلا استفاده را حذف میکند اما ریسورس های بلااستفاده را به shrinkResouce برای بررسی و حذف شدن میسپارد.

کم کردن ریسورس های استفاده شده کتابخانه ها ( Minimize resource use rom libraries )

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

استفاده از عکس با رزولوشن مورد نیاز ( Support only specific densities )

مسلما اندروید در گوشی و دستگاه ها با انواع سایز ها از کوچک تا خیلی بزرگ اجرا میشود و این بدین معنی ست که تصاویر استفاده شده درون اپلیکیشن نباید در سایزهای مختلف بی کیفیت شود.اندروید از اندروید 4.4 به بعد این امکان را به ما داد که با استفاده از رزولوشن های ldpi, mdpi, tvdpi, hdpi, xhdpi, xxhdpi and xxxhdpi بتوانیم عکس را در هر سایز دیوایس با کیفیت نمایش دهیم و این بدین معنی ست که ما از عکس چندین نسخه در تمام این دایرکتوری ها باید ایجاد کنیم!
خب طبیعتا این روش به سایز اپلیکیشن حجم زیادی اضافه میکند اما برای برخی تصاویر که مطمئن هستیم در دیوایس سایز بزرگ به مشکل میخورد راهی جز این روش نیست (شاید وکتور جایگزین مناسبی باشد ! ) اما میتوانیم بقیه تصاویر را که پیشبینی می شود نیازی به ساخت چند نسخه ندارد را فقط در یک دایرکتوری (مربوطه) بسازیم.پس الزاما نباید تمامی تصاویر مورد استفاده را در تمام رزولوشن ها پیاده کرد!

استفاده از آبجکت های drawable یا ( Use drawable objects )

بعضی از تصاویر نیازی نیست که حتما به صورت استاتیک درون ریسورس ها اضافه شود بلکه میتوان بصورت داینامیک حین اجرا ساخته شود ! آبجکت های Drawable و یا در XML حجم بسیاری کمی دارند که اصلا تاثیری در حجم کلی اپ نخواهند داشت.

استفاده مجدد از ریسورس ها ( Reuse resources )

بجای ساخت یک ریسورس جدید مثلا عکس میتوان از ریسورس های موجود بصورت مجدد استفاده کرد (با کمی تغییر بصورت کد) !
برای مثال میتوان با اعمال چرخش , تغییر رنگ و … از یک تصویر در بخش های مختلفی استفاده کرد.به عنوان مثال اندروید برای نسخه Anroid 5.0 به بالا آپشن android:tint و tintMode رو به شما داده و برای نسخه های پیشین کلاس ColorFilter را میتوان استفاده کرد.برای چرخش تصاویر هم میتوان از کد زیر استفاده کرد:

<?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" />

فایل های PNG را Crunch کنید ( Crunch PNG files )

ابزار aapt میتواند تصاویری که در مسیر res/drawable قرار دارند را بهینه کند بدون کم شدن کیفیت !
برای مثال ابزار aapt یک عکس PNG با کیفیت اصلی را که تشخیص می دهد نیازی به بیش از 256 رنگ ندارد را به یک عکس PNG با 8 بیت تبدیل میکند بدین ترتیب ما عکس مشابه بدون هیچ تغییر در کیفیت اما با سایز بسیار کمتر خواهیم داشت ! اما نکات زیر را درباره ابزار aapt در نظر بگیرید:
ابزا aapt عکس های PNG درون دایرکتوری asset/ را بهینه نمیکند.
تنها عکس هایی که از 256 رنگ یا کمتر استفاده میکنند با aapt بهینه میشوند
ابزار aapt ممکنه تصاویری که پیش از این بهینه هستند را هم مجدد فشرده میکند که برای جلوگیری از این اتفاق باید از crunchEnable در گردل استفاده کنیم

 aaptOptions {
    cruncherEnabled = false
}

فشرده سازی فایل های PNG , JPEG یا ( ompress PNG and JPEG files )

ما میتوانیم بدون کم شدن حتی ذره ای از کیفیت عکس حجم عکس را بطور محسوس کاهش دهیم با ابزارهایی مثل pngcrush , pngquant , zopflipng برای عکس های PNG و برای عکس های JPEG از ابزار های packJPG , guetzli

استفاده از فایل با فرمت WebP یا ( Use WebP file format )

بجای استفاده از PNG , JPEG میتوانید از WebP استفاده کنید.فایل ها با فرمت WebP از فشرده سازی کمی مثل JPEG و از شفافیت (transparency) خوبی مثل PNG پشتیبانی میکنند.شما میتوانید فایل های BMP , JPG , PNG و حتی GIF های استاتیک را به WebP تبدیل کنید

نکته:‌
توجه کنید که فایل launcher برنامه حتما باید PNG باشد.

استفاده از وکتور ( Use vector graphics )

شما میتوانید از وکتور (VectorDrawable) بجای عکس های سنگین استفاده کنید که حجم اپلیکیشن را بطور محسوسی کاهش میدهد و در سایز های مختلف دیوایس هم کیفیت خود را حفظ میکند.

استفاده از وکتور برای تصاویر انیمیشنی ( Use vector graphics for animated images )

میتوان بجای استفاده از AnimatedDrawable که از چندین bitmap برای فریم به فریم انیمیشن استفاده میکنند از AnimatedVectorDrawableCompat برای ساخت وکتور های انیمیشنی (animated vector drawables) استفاده کرد.

امیدوارم این آموزش برای شما مفید بوده باشد…

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *