Знакомая ситуация: вы сделали простенькое приложение со списком задач, собираете релиз, а маркетплейс показывает размер - 80 МБ. Пользователь, стоя на улице с мобильным интернетом, видит эту цифру и думает: "Да ну его, скачаю потом (никогда)".
Почему приложения «толстеют»?
Новички обожают тащить огромные библиотеки ради одной функции. Подключили гигантский фреймворк ради красивой анимации кнопки? Добавили 15 шрифтов и картинки в формате PNG без сжатия? Поздравляю, у вас ожирение.
Взрослые проекты борются за каждый мегабайт. И главное оружие здесь - Minification & Shrinking (Минификация и удаление неиспользуемого).
🛠 Как худеют приложения:
🤖 Android (R8 / ProGuard):
В файле
build.gradle у сеньоров всегда написано:
buildTypes {
release {
minifyEnabled true // Включает обфускацию и удаление мертвого кода
shrinkResources true // Удаляет неиспользуемые картинки и XML
}
}
Что это делает?
1. Shrinking: R8 анализирует ваш код. Если вы импортировали огромную библиотеку, но используете из нее один метод - R8 просто вырежет остальные 99% библиотеки из финального APK.
2. Obfuscation (Обфускация): R8 переименовывает ваши красивые классы
NetworkUserRepository в a.b.c. Это не только уменьшает вес файла, но и усложняет жизнь хакерам (Reverse Engineering).💥 Обряд посвящения:
Каждый разработчик хоть раз в жизни ловил краш на Релизе, потому что R8 переименовал классы для работы с сетью (JSON модели), и парсер сошел с ума. Решение: аннотация
@Keep над data-классами.🍏 iOS (App Thinning & Dead Code Stripping):
Apple делает много магии под капотом:
1. Dead Code Stripping: Компилятор LLVM автоматически вырезает функции и классы, которые нигде не вызываются (включается в Build Settings).
2. App Slicing: Когда пользователь скачивает приложение, App Store отдает ему не весь ваш бинарник со всеми картинками мира, а только те ресурсы, которые нужны для его конкретного устройства (например, только картинки @3x для iPhone 15 Pro, вырезая старые @2x). Главное - хранить всё в
Assets.xcassets.💡 Золотое правило:
Прогоняйте все растровые картинки через сервисы сжатия (TinyPNG), а лучше - переходите на вектор (SVG / PDF / ImageVectors). Вектор весит килобайты и идеально скейлится на любые экраны.
#appsize #optimization #proguard #r8 #android #ios #middle #performance
👉 @developer_mobila
