Оптимізація часу запуску мобільного додатку (Cold Start)

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Оптимізація часу запуску мобільного додатку (Cold Start)
Складний
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Оптимізація часу запуску мобільної програми (Cold Start)

Cold start — запуск програми з нуля: процес не існує в пам'яті, ОС створює процес, завантажує бінарник, ініціалізує runtime, запускає Application/AppDelegate, рендерить перший екран. На Android це шлях від натискання іконки до Activity.onResume(). На iOS — від tap до першого відрисованого кадру.

Сповільнення cold start майже ніколи не має одну причину. Це накопичений борг: ініціалізації SDK у Application.onCreate(), важкі операції на main thread, раздутий splash экран, синхронні запити до бази даних при старті.

Де втрачається час: Android

Android Vitals у Play Console показує метрику «Startup time» — відсоток сесій з cold start > 5 секунд. Але це агрегат. Для діагностики потрібен Android Studio Profiler → App Startup або Perfetto.

Типова картина при аудиті: Application.onCreate() займає 800-1200 мс на mid-range пристрої, і більша частина цього — синхронна ініціалізація Firebase, Amplitude, AppsFlyer, OneSignal та ще трьох SDK. Кожен з них всередину робить SharedPreferences.read, створює HandlerThread, реєструє BroadcastReceiver.

Рішення: App Startup Library (androidx.startup) з явним графом залежностей ініціалізацій. SDK, які потрібні негайно (Crashlytics) — синхронно. Аналітика, push — через ContentProvider-ленивої ініціалізації або фоновому потоці з затримкою в 2-3 секунди після першого рендера.

Другий джерело втрат — Dagger/Hilt граф залежностей при старті. Якщо @Singleton-компоненти важкі (Room database, Retrofit інстанси) та створюються всі відразу — видно як падіння в Profiler одразу після onCreate. Рішення: @Lazy<T> для компонентів, які не потрібні на першому екрані, та backgroundScope.launch для ініціалізації репозиторіїв.

Baseline Profiles (Jetpack) — попередня компіляція гарячих шляхів коду в AOT до того, як їх побачить JIT. ProfileInstaller + BaselineProfileRule у тестах дозволяють скоротити cold start на 30-40% на перших запусках після установки/оновлення. Це не магія — це явна розмітка «ці класи потрібно скомпілювати заздалегідь».

Де втрачається час: iOS

os_signpost + Instruments Time Profiler — єдиний правильний спосіб побачити реальну картину. Xcode показує час від tap до applicationDidFinishLaunching, та окремо — час до першого значимого рендера.

Головні винуватці на iOS: +load методи в Objective-C класах та C++ статичні конструктори. Вони виконуються до main(), та їхній час не видно в звичайному Profiler без спеціальної розмітки. DYLD_PRINT_STATISTICS у змінних середовища покаже реальний час pre-main фази.

Swift ініціалізація швидша за Obj-C, але й тут є ловушки: @UIApplicationMain клас з важким init, синглтони через static let shared = ... які створюються в application(_:didFinishLaunchingWithOptions:) ланцюжком.

URLSession, CoreData stack, Keychain — все це повинно ініціалізуватися лінивао або в фоні. CoreData NSPersistentContainer.loadPersistentStores — асинхронний за замовчуванням, але розробники часто обгортають його в семафор, перетворюючи в синхронний виклик на main thread.

Метрики та цільові значення

Тип пристрою Добре Прийнятно Погано
Android high-end < 1.0 с 1.0–2.0 с > 2.0 с
Android mid-range < 2.0 с 2.0–4.0 с > 4.0 с
iPhone (останні 3 покоління) < 0.8 с 0.8–1.5 с > 1.5 с
iPhone (5+ років) < 1.5 с 1.5–3.0 с > 3.0 с

Вимірюємо метрики на реальних пристроях, не емуляторі. Емулятор не відображає реальну продуктивність I/O та JIT.

Flutter та React Native

У Flutter cold start упирається в ініціалізацію Dart VM та рухавика. FlutterActivity vs FlutterFragmentActivity — різниця в 50-100 мс. Попередня ініціалізація рухавика через FlutterEngineCache + FlutterEngineGroup дозволяє переіспользовувати рухавик між запусками. Splash screen через flutter_native_splash правильно синхронізований з нативним launch screen.

У React Native проблема — час завантаження JS bundle. Hermes engine (збірка в байткод) скорочує parse-time в 2-3x порівняно з JSC. RAM Bundles та inline requires дозволяють завантажувати лише код, потрібний для першого екрану.

Процес оптимізації

Спочатку вимірюємо — без базових метрик незрозуміло, що саме оптимізувати. Profiler сесія на 3-5 типах реальних пристроїв. Далі — аналіз гарячих шляхів, розстановка пріоритетів за внеском в загальний час. Реалізація змін ітеративно з вимірюванням після кожної зміни. Фінальне порівняння до/після на тому ж наборі пристроїв.

Термін роботи: одна-три тижні залежно від складності архітектури та кількості платформ.