کم کردن حجم فایل apk اپلیکیشن فلاتر

خروجی اپلیکیشن

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

شاید اگه یک خروجی معمولی release از اپلیکیشن Hello World فلاتر بگیریم، حجم apk حدودا ۱۵ مگابایت باشه، ولی ما برای انتشار اپلیکیشن فلاتر خروجی معمولی نمی‌گیریم.

در ادامه با خروجی های مختلف اپلیکیشن فلاتر و روش‌های کم کردن حجم apk آشنا می‌شیم.

خروجی Debug

این نوع خروجی هنگام توسعه اپلیکیشن استفاده میشه و قابلیت هایی مثل hot reload و hot restart و dart dev tools در اون قابل استفاده هستن. سرعت اپلیکیشن توی این خروجی تا حدودی پایینه و حجم apk بسیار زیاد (حدود ۶۰ مگابایت برای اپلیکیشن Hello World)!

برای اجرای اپلیکیشن از این نوع خروجی کافیه دستور زیر رو تو پوشه پروژه که دارای فایل pubspec.yaml هست اجرا کنیم.

flutter run

خروجی Profile

این نوع خروجی برای تست سرعت و میزان استفاده اپلیکیشن از حافظه موقت استفاده میشه و hot reload و hot restart در اون قابل استفاده نیستن، ولی dart dev tools قابل استفاده هست. سرعت اپلیکیشن توی این خروجی بالا هست و حجم apk برای اپلیکیشن Hello World حدودا ۹ مگابایته.

برای اجرای اپلیکیشن به صورت Profile باید دستور زیر رو در پوشه پروژه که دارای فایل pubspec.yaml هست اجرا کنیم.

flutter run --profile

خروجی release

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

با اجرای دستور زیر تو پوشه‌ی پروژه می‌تونید خروجی release اپلیکیشن رو بگیرید.

flutter build apk

ولی این خروجی حجمش حداقل ۱۵ مگابایته و چیزی نیست که ما بخواییم منتشر کنیم!

دلیل حجم زیاد خروجی release اپلیکیشن فلاتر چیه؟

توی موبایل‌های اندروید سه نوع معماری cpu وجود داره

  • armeabi-v7a
  • arm64-v8a
  • x86_64

که روی هرکدوم باید apk مخصوص خودش نصب شه. وقتی شما دستور خروجی release فلاتر رو اجرا می‌کنید، به طور پیشفرض یک apk بزرگ ساخته میشه که apkهای هر سه معماری داخلش ادغام شده و این apk روی هر گوشی اندرویدی نصب میشه. ولی اندروید فقط از اون قسمت apk که مخصوص معماری cpu خودش هست استفاده میکنه و بقیه apk بیهوده هست.

حالا برای اینکه این apk بزرگ رو به سه قسمت کوچیک‌تر واسه معماری‌های مختلف تقسیم کنیم، باید دستور زیر رو توی پوشه پروژه اجرا کنیم.

flutter build apk --split-per-abi

و الان سه تا apk ساخته میشه که حجم هرکدوم توی اپلیکیشن Hello World حدود 5 مگابایت هست که حجم کمی محسوب میشه.

بین این سه خروجی، apk با معماری armeabi-v7a روی اکثر موبایل‌های اندروید نصب میشه و می‌تونیم برای انتشار اپلیکیشن از اون استفاده کنیم.

ولی هنوز هم می‌تونیم حجم apk رو از این هم کمتر کنیم! چطوری؟ با مبهم کردن (obfuscate) کد!



مبهم کردن کد (Obfuscating code)

مبهم کردن کد یک روش برای تغییر دادن کد های باینری هست، طوری که برای آدم‌ها خوندن کد با مهندسی معکوس سخت شه. توی این روش اسم کلاس ها و متغیرهای کد به کلی تغییر می‌کنه و به یک کد عجیب و غریب تبدیل میشه. ولی تاثیرش توی کاهش حجم apk چقدر می‌تونه باشه؟

وقتی که شما کد دارت رو مبهم می‌کنید برای هر apk، یک فایل از نوع symbols ساخته میشه که بعدا برای خوانا کردن stack traceهای گزارش شده‌ از کد مبهم استفاده میشن.

این اطلاعات از apk جدا میشن و توی یه مسیر روی سیستم شما ذخیره میشن. پس حجم apk کمتر میشه. برای یک اپلیکیشن Hello World حجم apk با این روش حدود ۲۰۰کیلوبایت کمتر میشه. ولی توی پروژه‌های خیلی بزرگ این عدد به ۱مگابایت هم میرسه.

برای مبهم کردن کد دارت و تقسیم apk برای معماری‌های مختلف cpu، دستور زیر رو توی پوشه پروژه که دارای فایل pubspec.yaml هست اجرا می‌کنیم.

flutter build apk --split-per-api --obfuscate --split-debug-info=<directory>

که به جای <directory> باید آدرس پوشه‌ای که می‌خواهید فایل‌های symbols توش ذخیره شن رو وارد کنید.

برای اطلاعات بیشتر درباره مبهم کردن کد دارت، این مقاله رو بخونید.



کم کردن حجم apk با کم کردن حجم منابع باینری

یکی از مهم‌ترین عواملی که باعث زیاد شدن حجم apk میشه منابع باینری مثل فونت‌ها، عکس‌ها و آیکون‌ها هستن.

فونت‌ها

اگر در اپلیکیشن از فونت‌های خودتون استفاده می‌کنید، برای کم کردن حجم apk بهتره که فایل‌های فونتی که در کد دارت استفاده نمی‌کنید رو پاک کنید. مثلا اگه از فونت با وزن Black در هیچ‌جای اپلیکیشن استفاده نمیکنید، فایل فونت با وزن Black رو از پروژه حذف کنید.

آیکون‌ها

برای استفاده از آیکون توی اپلیکیشن بهتره که فایل‌های svg رو با fluttericon.com به فونت تبدیل کنیم و داخل پروژه از فونت استفاده کنیم. اینطوری حجم آیکون ها چندین برابر کمتر میشه. اما به این نکته توجه کنید که فقط آیکونهایی که تماما یکرنگ هستن رو میتونید به فونت تبدیل کنید. علاوه بر یکرنگ بودن آیکون، چند نکته دیگه هم هست که باید رعایت کنید تا فونت خروجی دقیقا مثل SVG شه. برای اطلاعات بیشتر درباره تبدیل svg به فونت، این مقاله رو بخونید.

برای آیکون‌های چند رنگ، بهتره از png استفاده کنید. و بسته به سایز آیکون روی صفحه نمایش رزولوشن عکس رو درست انتخاب کنید. استفاده از svg توی اپلیکیشن توصیه نمیشه چون رندر svg توی فلاتر حدودا بار سنگینی داره و اگه تعداد svg های روی صفحه نمایش زیاد باشه سرعت اپلیکیشن پایین میاد و لگ میزنه.

عکس‌ها

اول از همه، رزولوشن هر عکسی که می‌خوایین تو اپلیکیشن فلاتر خودتون استفاده کنید رو با توجه به سایز اون عکس روی صفحه نمایش تا حد ممکن کم کنید. فرمت عکس رو بر اساس محتویات داخل عکس png یا jpg انتخاب کنید که حجم عکس کمتر باشه. بعد میتونید با سایت tinypng.com عکسو فشرده کنید. توجه کنید که فشرده کردن عکس‌های png کیفیت عکس رو کاهش نمیده و فقط حجمشو کم می‌کنه.

علاوه بر فشرده کردن عکس های png و jpg می‌تونین با تبدیل فرمت عکس به WebP حجم اونو تا حد زیادی کاهش بدید. برای اینکار، توی یکی از IDEهای Intellij یا اندروید استودیو روی عکس موردنظر راست‌کلیک کنید و گزینه Convert to WebP رو انتخاب کنید. توجه کنید که با اینکار باید پسوند عکس‌ها که توی کد دارت استفاده کردید هم از jpg یا png به webp تغییر بدید. البته توی تبدیل عکس به WebP حواستون باشه که کیفیت عکس رو خیلی کم نکنید که به چشم بیاد.


اگه تمام نکات بالا رو به درستی رعایت کنید، می‌تونید اپلیکیشن‌های خیلی بزرگ فلاتر با حجم زیر ۱۵ مگابایت بسازید!