روش های کاهش حجم فایل APK ، وظیفه یک برنامه نویس اندروید صرفا پیاده سازی کدها و کتابخانه ها در سورس نیست فایل خروجی نمایان گر تمام تلاش برنامه نویس است پس علاوه بر عملکرد خوب اپلیکیشن و زیبایی ظاهری آن ، حجم فایل apk (Android Package) ست که عامل تعیین کننده ای برای دانلود کاربر خواهد بود
طبیعتا زمانی که کاربری ببیند یک اپلیکیشن 30 مگابایت است و اپلیکیشن دیگری مشابه آن 10 مگابایت ، تمایل بیشتری به دانلود اپلیکیشن 10 مگابایتی خواهد داشت چرا که همانطور که گفته شد حجم اپلیکیشن علاوه بر ظاهر و عملکرد خوب تعیین کننده افزایش کاربر اپ خواهد بود.
معمولا ما با اپ های زیادی روبرو هستیم که حجم بالایی دارند و این حجم بالا ناشی از موارد زیر خواهد بود
در این مقاله ما بطور مفصل به تمامی راه های معتبری که پیشنهاد شده خود گوگل برای کاهش حجم فایل APK است می پردازیم تا بتوانید با روش هایم معتبر بدون صدمه زدن به سورس ، حجم اپلیکیشن رو کم کنید.
آپلود کردن فایل در قالب App Bundles یکی از بهترین راه های کاهش حجم فایل APK است.اینکه کلا App Bundle چی هست و چه فلسفه ای داره ما در آموزش های گذشته در تجاری اپ بطور کامل توضیح دادیم پس در این پست تنها اشاره ای کوتاه به App Bundle خواهیم داشت.
همچنین بخوانید: همه چیز درباره اندروید استودیو 3.3
اگر بخواهیم App Bundle را کوتاه توضیح دهیم میتونیم بگیم یکی از ساده ترین راه ها برای کاهش حجم فایل APK است بدین صورت که شما میتونید فایل apk خودتون رو در گوگل پلی به عنوان Android App Bundle آپلود کنید.در واقع App Bundle یک فرمت جدید آپلود گوگل پلی است که این امکان را می دهد که اپلیکیشن آپلود شده برای هرکاربر تبدیل به یک اپ کم حجم و کوچک مناسب با کانفیگ موبایل کاربر تبدیل شود تا کاربر بتواند اپ شما را با حجم کم دانلود و نصب کند که البته اپ مناسب کانفیگ گوشی کاربر هم خواهد بود.
استفاده از پلاگین Android Size Analyzer این امکان را به شما میدهد که نقاطی از سورس که حجم زیادی دارند را شناسایی کنید و حتی پیشنهادی برای کم حجم کردن سایز آن قسمت دریافت کنید.برای نصب پلاگین Android Size Analyzer به مسیر زیر بروید:
File / Setting / plugins
در تب Marketplace عبارت Android Size Analyzer را جستجو کنید
سپس پلاگین رو نصب و اندروید استودیو رو ری استارت کنید.
برای اجرای پلاگین هم به مسیر زیر بروید
Analyze / Analyze App Size
سپس خواهید دید پنجره زیر باز خواهد شد
همچنین بخوانید: ایمپورت کردن ماژول در اندروید استودیو
همچنین میتونید پلاگین Android Size Analyzer رو بصورت کامند هم ران کنید بدین صورت که نسخه آخر پلاگین رو از گیت هاب مربوطه ش دانلود کنید ، بصورت TAR یا ZIP پس از استخراج پلاگین رو در مک یا لینوکس و یاحتی .bat در ویندوز با دستورات زیر اجرا کنید
./size-analyzer check-bundle
./size-analyzer check-project
خواهید دید پلاگین Android Size Analyzer پرحجم ترین فایل ها به علاوه یک پیشنهاد به شما ارائه میدهد
بدون دانستن ساختار فایل 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 استفاده میکند.
کم کردن تعداد ریسورس (از جمله عکس و موزیک و …) و یا کم کردن حجم آنها میتواند خیلی به کم شدن سورس کمک کند.میتونید عکس هایی که دیگر استفاده ای در اپ ندارند را حذف کنید و یا حتی عکس هایی که مجبور به استفاده از آنها هستید را با سایز کمتری در سورس ذخیره کنید.
در ادامه دو مبحث کم کردن سایز ریسورس و حذف ریسورس های بلا استفاده را با جزییات بیشتری بررسی خواهیم کرد.
ابزار 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 برای بررسی و حذف شدن میسپارد.
برای توسعه اپ از کتابخانه های زیادی استفاده میشود که اجتناب ناپذیر است اما میتوانیم از کتابخانه ها بصورت ماژول استفاده کنیم (البته آنهایی که لایسنس ندارند و اجازه استفاده بصورت ماژول را به مامیدهند) و ریسورس های بلااستفاده را از آنها حذف کنیم.
مسلما اندروید در گوشی و دستگاه ها با انواع سایز ها از کوچک تا خیلی بزرگ اجرا میشود و این بدین معنی ست که تصاویر استفاده شده درون اپلیکیشن نباید در سایزهای مختلف بی کیفیت شود.اندروید از اندروید 4.4 به بعد این امکان را به ما داد که با استفاده از رزولوشن های ldpi, mdpi, tvdpi, hdpi, xhdpi, xxhdpi and xxxhdpi بتوانیم عکس را در هر سایز دیوایس با کیفیت نمایش دهیم و این بدین معنی ست که ما از عکس چندین نسخه در تمام این دایرکتوری ها باید ایجاد کنیم!
خب طبیعتا این روش به سایز اپلیکیشن حجم زیادی اضافه میکند اما برای برخی تصاویر که مطمئن هستیم در دیوایس سایز بزرگ به مشکل میخورد راهی جز این روش نیست (شاید وکتور جایگزین مناسبی باشد ! ) اما میتوانیم بقیه تصاویر را که پیشبینی می شود نیازی به ساخت چند نسخه ندارد را فقط در یک دایرکتوری (مربوطه) بسازیم.پس الزاما نباید تمامی تصاویر مورد استفاده را در تمام رزولوشن ها پیاده کرد!
بعضی از تصاویر نیازی نیست که حتما به صورت استاتیک درون ریسورس ها اضافه شود بلکه میتوان بصورت داینامیک حین اجرا ساخته شود ! آبجکت های Drawable و یا در XML حجم بسیاری کمی دارند که اصلا تاثیری در حجم کلی اپ نخواهند داشت.
بجای ساخت یک ریسورس جدید مثلا عکس میتوان از ریسورس های موجود بصورت مجدد استفاده کرد (با کمی تغییر بصورت کد) !
برای مثال میتوان با اعمال چرخش , تغییر رنگ و … از یک تصویر در بخش های مختلفی استفاده کرد.به عنوان مثال اندروید برای نسخه 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" />
ابزار aapt میتواند تصاویری که در مسیر res/drawable قرار دارند را بهینه کند بدون کم شدن کیفیت !
برای مثال ابزار aapt یک عکس PNG با کیفیت اصلی را که تشخیص می دهد نیازی به بیش از 256 رنگ ندارد را به یک عکس PNG با 8 بیت تبدیل میکند بدین ترتیب ما عکس مشابه بدون هیچ تغییر در کیفیت اما با سایز بسیار کمتر خواهیم داشت ! اما نکات زیر را درباره ابزار aapt در نظر بگیرید:
ابزا aapt عکس های PNG درون دایرکتوری asset/ را بهینه نمیکند.
تنها عکس هایی که از 256 رنگ یا کمتر استفاده میکنند با aapt بهینه میشوند
ابزار aapt ممکنه تصاویری که پیش از این بهینه هستند را هم مجدد فشرده میکند که برای جلوگیری از این اتفاق باید از crunchEnable در گردل استفاده کنیم
aaptOptions {
cruncherEnabled = false
}
ما میتوانیم بدون کم شدن حتی ذره ای از کیفیت عکس حجم عکس را بطور محسوس کاهش دهیم با ابزارهایی مثل pngcrush , pngquant , zopflipng برای عکس های PNG و برای عکس های JPEG از ابزار های packJPG , guetzli
بجای استفاده از PNG , JPEG میتوانید از WebP استفاده کنید.فایل ها با فرمت WebP از فشرده سازی کمی مثل JPEG و از شفافیت (transparency) خوبی مثل PNG پشتیبانی میکنند.شما میتوانید فایل های BMP , JPG , PNG و حتی GIF های استاتیک را به WebP تبدیل کنید
نکته:
توجه کنید که فایل launcher برنامه حتما باید PNG باشد.
شما میتوانید از وکتور (VectorDrawable) بجای عکس های سنگین استفاده کنید که حجم اپلیکیشن را بطور محسوسی کاهش میدهد و در سایز های مختلف دیوایس هم کیفیت خود را حفظ میکند.
میتوان بجای استفاده از AnimatedDrawable که از چندین bitmap برای فریم به فریم انیمیشن استفاده میکنند از AnimatedVectorDrawableCompat برای ساخت وکتور های انیمیشنی (animated vector drawables) استفاده کرد.
همچنین بخوانید: رتروفیت | آموزش Retrofit همراه با مثال
امیدوارم این آموزش برای شما مفید بوده باشد…