App Size Optimization — съвкупност от техники, насочени към намаляване на размера на инсталационния файл (APK, AAB, IPA) без загуба на функционалност. Според Android Reduce APK Size Guide, всеки мегабайт намаление на размера може да увеличи конверсията на инсталации с 1–2% в региони с бавен интернет. App Thinning — ключова технология на Apple, доставяща само онези ресурси, които са необходими на конкретно устройство.
Основни точки
App Size Optimization — дисциплина в мобилното разработване, насочена към минимизиране на размера на инсталационния пакет на приложението. Включва премахване на мъртъв код и ресурси, компресиране на изображения, оптимизация на библиотеки, фрагментиране на компилация за различни архитектури и използване на технологии за доставка при поискване.
Размерът на приложението влияе неравномерно върху различни сегменти потребители. В региони с развита мобилна инфраструктура (САЩ, Европа, Япония) разликата между 50 и 100 MB може да бъде незабележима. В развиващите се региони (Индия, Индонезия, Бразилия) всеки допълнителен мегабайт намалява конверсията на инсталации поради лимити на тарифите и скоростта на мобилния интернет. Google Play ограничава размера на APK до 200 MB, но препоръчва размерът да се поддържа под 100 MB.
За iOS App Store максималният размер за изтегляне през мобилна мрежа е 200 MB (до 2023 г. беше 150 MB). Ако IPA надвишава този лимит, потребителят може да инсталира приложението само чрез Wi-Fi. Apple също поддържа App Thinning, който включва Slicing, Bitcode и On-Demand Resources — технологии, които автоматично намаляват размера на инсталацията на конкретно устройство без участието на разработчика.
Размерът на приложението влияе не само върху конверсията на инсталации, но и върху задържането на потребители, честотата на обновленията и скоростта на първото стартиране. Всеки допълнителен мегабайт е бариера между потребителя и използването на вашия продукт.
Според данни от Google I/O 2024, намаляването на APK с 10 MB увеличава конверсията на инсталации средно с 3,5%. За приложения с размер 150+ MB конверсията може да бъде с 20–30% по-ниска, отколкото за приложения от същия клас с размер 50 MB. Ефектът е особено изразен в Google Play, където потребителят вижда размера преди инсталация. В App Store размерът се показва на страницата на приложението и потребителите с ограничен тарифен план отлагат инсталацията до Wi-Fi, след което често забравят за приложението.
Голямо приложение се обновява по-рядко по въздуха — потребителите отлагат изтеглянето на кръпки до Wi-Fi, пропускайки критични корекции на сигурността. Google Play позволява използването на Incremental Updates (кръпки до 10 MB), но пълното преинсталиране все пак изтегля целия APK или AAB. Apple App Store използва Delta Updates, предавайки само променените файлове, но дори делтата може да бъде значителна при промяна на ресурси.
Размерът пряко влияе върху времето за първо стартиране: приложението трябва да разопакова ресурсите, да компилира кода (Android) или да подпише кеша (iOS). Приложение с размер 200 MB може да стартира 10–15 секунди по-бавно от приложение с размер 50 MB на средно устройство. Това влошава Onboarding Experience — потребителят може да затвори приложението, без да изчака зареждането.
| Размер | Време за изтегляне (3G) | Време за първо стартиране |
|---|---|---|
| 30 MB | –20 сек | 3–5 сек |
| 100 MB | –70 сек | 5–8 сек |
| 200 MB | –140 сек | 10–15 сек |
Ресурси — изображения, шрифтове, звуци, видео — съставляват 60–80% от размера на типично мобилно приложение. Оптимизацията на ресурси дава най-голяма печалба с минимални усилия. Основните направления: компресиране, премахване на дубликати и неизползвани активи, избор на правилни формати.
WebP — формат за изображения от Google, осигуряващ 25–35% по-добра компресия от PNG и 15–20% по-добра от JPEG при същото визуално качество. Android поддържа WebP родно от API 18. За iOS WebP се поддържа чрез библиотеката SDWebImage или Kingfisher, а от iOS 17 се появи родна поддръжка. AVIF — по-съвременен формат, даващ допълнителни 10–15% икономия спрямо WebP, но с по-бавно декодиране.
Премахване на неизползвани ресурси — най-простият начин за намаляване на размера. В Android използвайте рефакториране с Android Studio: Analyze → Run Inspection → Unused Resources. В iOS — Build Settings → Remove Unused Resources. Често в проектите остават спрайтове от по-ранни версии, стари икони, неизползвани изображения на началния екран, които надуват размера без никакво функционално натоварване.
| Формат | Компресия спрямо PNG | Поддръжка |
|---|---|---|
| PNG | — | Всички платформи |
| WebP | 25–35% | Android родно, iOS чрез библиотеки |
| AVIF | 35–45% | Android 12+, iOS 17+ |
| JPEG XR | 30–40% | Само Windows |
Персонализирани шрифтове могат да заемат 5–15 MB, особено ако е свързано цялото семейство (всички стилове: Regular, Bold, Italic, BoldItalic). Използвайте само необходимите стилове и подмножества от символи чрез subsetting — премахване на глифове за езици, които не се поддържат от приложението. Услуги като Google Fonts и Transfonter позволяват създаване на минимален набор от символи. За звуци използвайте AAC/HE-AAC вместо WAV и некомпресирани формати — икономия до 90% без загуба на качество.
Кодът съставлява 20–40% от размера на приложението, но неговата оптимизация е по-трудна от ресурсите, тъй като изисква анализ на зависимости, объркване и премахване на мъртъв код без риск от нарушаване на функционалността.
ProGuard — инструмент за Android, който извършва объркване, минификация и оптимизация на код. R8 — неговият наследник, вграден в Android Gradle Plugin, работи по-бързо и по-ефективно. R8 премахва неизползвани класове и методи, съкращава имена на променливи и пренаписва кода за намаляване на броя инструкции. Типичното намаление на размера на DEX файлове с R8 е 30–50%.
// build.gradle — конфигуриране на R8 за минификация
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt')
shrinkResources true
}
}
}
Библиотеки — честа причина за надут размер. Една библиотека може да довлече транзитивни зависимости, които увеличават размера с 5–20 MB без пряка полза за приложението. Използвайте Gradle Version Catalog за Android и Swift Package Manager за iOS с изрично посочване на зависимости. Анализирайте размера с Build Analyzer в Android Studio или Xcode Build Timeline. Заменяйте тежките библиотеки с по-леки алтернативи: например OkHttp (3 MB) вместо Apache HTTP (15 MB).
Dead Code Stripping — автоматично премахване на неизползвани методи и класове на етапа на свързване в Xcode. Включва се чрез Build Settings → Dead Code Stripping = YES. Bitcode — междинно представяне, което Apple може да прекомпилира за различни архитектури, премахвайки неизползвани функции. Въпреки това от Xcode 14 Bitcode стана опционален и приносът му за намаляване на размера е 5–15% за Objective-C проекти и по-малко за Swift.
App Thinning — технология на Apple, която автоматично намалява размера на инсталираното приложение чрез доставяне само на онези ресурси, които са необходими на конкретно устройство. Състои се от три компонента: Slicing, On-Demand Resources и Bitcode. В Android аналогът е Android App Bundle (AAB) с Dynamic Delivery.
AAB — формат за публикуване в Google Play, при който магазинът генерира APK за всяко устройство поотделно, включвайки само ресурси за неговата архитектура (armeabi-v7a, arm64-v8a), плътност на екрана (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi) и езици. Типичното намаляване на размера на инсталацията при преминаване от универсален APK към AAB е 20–40%. Play Feature Delivery позволява изтегляне на модули при поискване, докато модулите Install-time се включват в базовата инсталация.
// build.gradle — конфигуриране на AAB и Dynamic Features
android {
bundle {
language {
enableSplit = true
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
On-Demand Resources (ODR) — механизъм на iOS, при който ресурси (игрови нива, изображения с висока разделителна способност, видео) се изтеглят от сървърите на Apple само когато наистина са необходими на потребителя. Размерът на първоначалната инсталация може да бъде намален с 50–80%. Ресурсите се разделят на три категории: Initial Install Tags (изтеглят се при инсталация), Prefetched Tag Order (изтеглят се във фонов режим след инсталация) и On-Demand (изтеглят се само при поискване). Apple препоръчва използването на ODR за съдържание, което не е необходимо на първия екран: игрови нива, допълнително съдържание, видео инструкции.
SwiftUI поддържа ODR чрез атрибута Bundle.module, а UIKit чрез NSBundleResourceRequest. За игри на Unity и Unreal Engine ODR се интегрира на ниво родна обвивка. Основното ограничение — ODR ресурсите се изтриват от системата при липса на място, поради което критичните за работа данни трябва да бъдат включени в основната компилация.
Често задавани въпроси
По-малко от 50 MB — идеален размер за максимална конверсия на инсталации. 50–100 MB — приемлив за повечето приложения. Над 100 MB — изисква оправдание с размера (игри, офлайн карти, редактори на съдържание).
Ресурсите дават по-голяма печалба за по-кратко време. Започнете с премахване на неизползвани активи, конвертиране на PNG в WebP и компресиране на звуци. След това преминете към кодова оптимизация чрез R8 или Dead Code Stripping.
Google Play генерира APK само за конкретното устройство: arm64-v8a код, xhdpi ресурси, нужния език. Универсалният APK съдържа всички варианти наведнъж, което увеличава размера 1,5–2 пъти. AAB решава този проблем на ниво магазин.
Косвено. Големият размер означава повече код за JIT/AOT компилация, повече ресурси за зареждане в паметта и повече време за парсване на манифести. Въпреки това прякото влияние върху производителността по време на изпълнение е минимално — размерът влияе върху инсталацията и първото стартиране.
Install-time — част от базовата инсталация, достъпна веднага. On-Demand — изтегля се при първо поискване, не влиза в първоначалната инсталация. Използвайте On-Demand за функции, които са необходими на по-малко от 20% от потребителите: диагностика, уроци, AR филтри.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също