Cold Start — bu Android-ilovasining nol holatdan to'liq ishga tushirish sikli bo'lib, ilova jarayoni xotirada mavjud emas va Activity yaratilmagan. Tizim yangi jarayon yaratadi, klasslarni yuklaydi, Application-ni ishga tushiradi, Activity-ni yaratadi va birinchi chizmani bajaradi. Google, 2024 ma'lumotlariga ko'ra, o'rta segment qurilmalarida sovuq ishga tushirish 1 dan 5 soniyagacha davom etishi mumkin va har 100 ms kechikish foydalanuvchini ushlab qolish ehtimolini 3% ga kamaytiradi.
Asosiy
Cold Start (sovuq ishga tushirish) — bu Android-ilovasi eng boshlang'ich holatdan ishga tushiriladigan stsenariy: operatsion tizim yangi jarayon yaratadi (Zygote dan fork), xotira ajratadi, DEX-kodni ART ga yuklaydi, klasslarni ishga tushiradi va Application, so'ngra birinchi Activity ni yaratadi. Ilova ishga tushgunga qadar, Background Dexopt ishlatilsa, klasslarning keshlangan tasvirlaridan tashqari, qurilma xotirasida u haqida hech qanday ma'lumot yo'q.
Sovuq ishga tushirish uchta holatda sodir bo'ladi: ilova o'rnatilgandan keyin birinchi marta ishga tushirilganda, qurilma qayta ishga tushirilgandan keyin va tizim xotira yetishmasligi tufayli jarayonni o'chirib yuborgandan keyin. 2–4 GB RAM li qurilmalarda tizim fon jarayonlarini agressiv ravishda o'chiradi, shuning uchun Cold Start bir necha soatlik bo'sh vaqtdan keyin ilovaga har qaytishda sodir bo'lishi mumkin. Android 12+ da tizim muzlatilgan jarayonni saqlab qolishi mumkin (freeze / cached), ammo faol xotira tejashda (OOM-killer) jarayon yo'q qilinadi.
Google ma'lumotlariga ko'ra (Find My Device report, 2023), foydalanuvchilarning 65% i ilova 3 soniya ichida ochilmasa, uni yopadi. Ijtimoiy tarmoqlar va messengerlar uchun, foydalanuvchi kuniga o'nlab marta qaytadigan, Cold Start retention ga bevosita ta'sir qiladi. Google Play Console da Cold Start metrikasi Android Vitals bo'limiga kiradi va ANR hamda unumdorlik ko'rsatkichlaridan biri sifatida ko'rsatiladi. "Yomon" Cold Start chegarasidan oshgan ilova (qurilmalarning 25% ida 5 soniyadan ko'p) konsolda ogohlantirish oladi va qidiruvda pasaytirilishi mumkin.
Android ilovani ishga tushirishning uch turini farqlaydi, ularning har biri turli davomiylik, UX ga ta'sir va optimallashtirish yondashuvlariga ega. Farqni tushunish profil uchun to'g'ri strategiyani tanlash uchun zarur.
| Ishga tushirish turi | Jarayon holati | Application.onCreate | Odatdagi vaqt |
|---|---|---|---|
| Cold | Jarayon yo'q | Bajariladi | 1–5 soniya |
| Warm | Jarayon bor, Activity yo'q | Bajarilmaydi | 200–600 ms |
| Hot | Jarayon + Activity xotirada | Bajarilmaydi | < 200 ms |
Warm Start ilova jarayoni fonda mavjud bo'lganda, lekin Activity yo'q qilinganda sodir bo'ladi (masalan, foydalanuvchi uzoq tanaffusdan keyin qaytdi va tizim Activity xotirasini bo'shatdi). Hot Start — foydalanuvchi ilovani yig'ib, darhol qayta ochganda: Activity to'xtatilgan va tiklanish minimal vaqt oladi. Foydalanuvchi uchun Cold Start eng sezilarli ishga tushirish turidir, aynan uni optimallashtirish UX ga eng katta o'sishni beradi.
Cold Start Warm Start ga aylanishi mumkin, agar ilova kamida bir marta ishga tushirilgan bo'lsa — ART kompilyatsiya qilingan klass tasvirlarini keshlaydi (Image in Boot Profile) va DEX ni qayta yuklash tezroq bo'ladi. Shuning uchun birinchi Cold Start dan keyingi ikkinchi ishga tushirish odatda 20–40% tezroq. Agar ilova Baseline Profiles ishlatsa, profillar birinchi ishga tushirishda yuklanadi va ikkinchi start yanada tezroq bo'lishi mumkin: Baseline Profiles nashr etgan Google Play, Android 12+ qurilmalarida Cold Start ni 30% ga tezlashtirdi.
Cold Start qat'iy belgilangan fazalardan iborat bo'lib, ularning har biri mustaqil ravishda o'lchanishi va optimallashtirilishi mumkin. Fazalarni bilish ilova vaqtni qaysi bosqichda yo'qotayotganini aniqlashga yordam beradi. Google to'rtta asosiy fazani ajratadi: jarayon yaratish, Application ishga tushirish, Activity yaratish va birinchi kadr.
Android tizimi (ActivityManagerService) Zygote jarayonidan fork orqali yangi jarayon yaratadi. Zygote — bu Android umumiy klasslari bilan oldindan yuklangan jarayon. Fork 30–80 ms da bajariladi — bu ilova nazorat qila olmaydigan vaqt. Fork dan so'ng ActivityThread ishga tushadi — ilovaning asosiy sikl namunasi. Bu bosqichda ham klasslarni yuklash ClassLoader orqali sodir bo'ladi va ART birinchi bayt-kodni interpretatsiya qilishni boshlaydi. Agar ilova ko'p statik ishga tushirgichlardan foydalansa, bu faza cho'zilishi mumkin.
ActivityThread ishga tushgandan so'ng darhol Application.onCreate chaqiriladi. Bu yerda dasturchi ko'pincha xato qiladi, hamma narsani birdaniga ishga tushirib: Crashlytics, Firebase, tarmoq mijozlari, ma'lumotlar bazalari, Dagger-komponentlar, DI-konteynerlar. Har bir bunday ishga tushirish — bu asosiy oqimda bloklangan vaqt. Agar Application.onCreate 500 ms davom etsa, bu yarim soniya davomida foydalanuvchi oq (yoki qora) ekranni ko'radi. Bu fazaning optimal davomiyligi o'rtacha qurilmada 200 ms dan kam.
Application ishga tushirilgandan so'ng Activity (MainActivity yoki Launcher Activity) namunasi yaratiladi. Activity.onCreate chaqiriladi, bu yerda setContentView, fragmentlarni ishga tushirish, ViewModel sozlash, LiveData/Flow ga obuna bo'lish sodir bo'ladi. Agar onCreate ma'lumotlarni (SharedPreferences, SQLite, API) sinxron tarzda asosiy oqimda yuklasa, faza cho'ziladi. Maqsad — onCreate ni o'rtacha qurilmada 200–400 ms ga sig'dirish.
OnCreate tugagandan so'ng birinchi chizma boshlanadi: measure, layout, draw. Bu moment TTFD (Time To First Draw) deb ataladi. Agar ilova splash-ekrandan foydalansa (Android 12+ da SplashScreen API orqali yoki tema orqali), chizma tezroq sodir bo'lishi mumkin, lekin foydalanuvchi baribir splash yashiringuncha kutadi. Cold Start uchun ideal TTFD — 1.5 soniyadan kam.
Cold Start ni o'lchash maxsus vositalarni talab qiladi, chunki oddiy loglash (Log.d) faqat Application yaratilgandan keyin ishlay boshlaydi va fork hamda klasslarni yuklash vaqti tashqarida qoladi. Google uchta usulni tavsiya qiladi: ADB-buyruqlar, Android Vitals va maxsus perf makroslari.
Eng oddiy va takrorlanadigan usul — adb shell am start -S -W buyrug'i. -S flag'i ishga tushirishdan oldin ilovani majburan to'xtatadi (Cold Start ni kafolatlaydi). Buyruq uchta metrikni chiqaradi: ThisTime (Activity ishga tushirish vaqti), TotalTime (jarayon ishga tushishni hisobga olgan umumiy vaqt) va WaitTime (Activity Manager barcha kechikishlarni hisobga olgan vaqt). O'lchov tozaligi uchun 5–7 marta o'lchab, medianani oling — yagona o'lchovlar shovqinga uchraydi (CPU throttling, fon yuklamasi).
# Majburiy Cold Start o'lchash bilan
$ adb shell am start -S -W \
com.example.app/.MainActivity
# Buyruq chiqishi:
# ThisTime: 1842 ms
# TotalTime: 1842 ms
# WaitTime: 1855 ms
Google Play Console ilova o'rnatilgan barcha qurilmalardan anonim metrikalarni to'playdi. Android Vitals → Launch time bo'limida Cold Start ning median taqsimoti qurilma modeli va Android versiyasi bo'yicha ko'rsatiladi. Bu foydalanuvchi qurilmalaridagi real ko'rsatkichlarni ko'rishning yagona usuli, sinov qurilmalarida emas. Agar Redmi 9A (2 GB RAM) da Cold Start 5 soniyadan oshsa, Pixel 8 da 1.2 soniya bo'lsa, muammo xotira hajmi va klasslar sonidadir. Google shuningdek, 25-percentil asosida foydalanuvchi sezadigan kechikishni (user-perceptible delay) ko'rsatadi.
Google Jetpack Macrobenchmark (androidx.benchmark kutubxonasi) ilova ishga tushirish uchun instrumentlangan testlarni yozish imkonini beradi. Test ilovani o'rnatadi, uni sovuq holatda ishga tushiradi va birinchi kadrgacha bo'lgan vaqtni o'lchaydi. Macrobenchmark avtomatik ravishda 20 ta yugurishni amalga oshiradi, chetga chiqishlarni tashlaydi va barqaror persentillarni ko'rsatadi. CI/CD uchun baseline va joriy ishga tushirishni solishtirish mumkin — agar vaqt oshgan bo'lsa, CI-payplayn muvaffaqiyatsiz bo'lishi mumkin.
Cold Start ni optimallashtirish — bu ilovaning bir necha darajalariga ta'sir qiluvchi tizimli ish: kod, resurslar, yig'ish konfiguratsiyasi va ishga tushirish arxitekturasi. Google eng qimmatidan — Application.onCreate dan boshlashni va mayda narsalarga o'tishni tavsiya qiladi.
Ishga tushirishda talab qilinmaydigan barcha ishga tushirishlarni Application.onCreate dan birinchi foydalanish nuqtasiga ko'chiring. Firebase, Crashlytics, analytics SDK, push-bildirishnomalar, DI-komponentlar — bularning barchasini birinchi ekran chizilganidan keyin ishga tushirish mumkin. Kotlin da Lazy (by lazy) yoki initialize(context) aniq chaqiruvi bilan ContentProvider-ishga tushirishdan foydalaning. Google ma'lumotlariga ko'ra (Android Performance, 2023), kechiktirilgan ishga tushirish 5+ SDK ishlatadigan ilovalar uchun Cold Start ni 40–60% ga qisqartiradi.
Baseline Profiles — bu ilova ishga tushirilganda ishlatiladigan muhim klass va metodlarning AOT-kompilyatsiyasi. Baseline Profiles bo'lmasa, ART DEX-kodni interpretatsiya qiladi yoki JIT orqali kompilyatsiya qiladi, bu vaqt oladi. Profillar bilan ART ko'rsatilgan metodlarni ilova o'rnatilganda mahalliy kodga (AOT) kompilyatsiya qiladi. Google Baseline Profiles Android 9+ da Cold Start ni 15–40% gacha va Android 12+ ART optimallashtirishlari bilan 60% gacha tezlashtirishini ta'kidlaydi. Profillarni yaratish uchun androidx.benchmark:benchmark-baseline-profile-gradle-plugin plaginidan foydalaning.
androidx.startup kutubxonasi komponentlarni ishga tushirishni tartibga solish va bitta ContentProvider da bajarish imkonini beradi. Turli kutubxonalarning bir nechta ContentProvider'larining o'rniga (har biri sovuq ishga tushirishga 1–2 ms qo'shadi) App Startup ularni bog'liqlik grafigiga birlashtiradi va faqat kerak bo'lganda ishga tushiradi. Ishga tushirishda faqat @Initializer bilan belgilangan va birinchi ekran uchun zarur bo'lgan komponentlar bajariladi. Qolganlari uchun needEarlyInit = false flag'i o'rnatiladi — ular birinchi chizmadan keyin ishga tushadi.
// App Startup Initializer — startdan keyin ishga tushirish
class AnalyticsInitializer : Initializer<Unit> {
override fun create(context: Context) {
Analytics.init(context)
}
override fun dependencies() = listOf<Class<out Initializer<*>>>()
}
// AndroidManifest.xml da ixtiyoriy deb belgilaymiz
// <meta-data android:name="AnalyticsInitializer"
// android:value="false" />
DEX-fayl hajmi to'g'ridan-to'g'ri ART tomonidan yuklanish vaqtiga ta'sir qiladi. Obfuskatsiya va o'lik kodni olib tashlash uchun R8/ProGuard dan foydalaning (MinifyEnabled = true). Manifestda android:extractNativeLibs="false" ni yoqing, shunda APK o'rnatish vaqtida .so fayllarni ochmaydi. 10 Reference Tracking dan ko'p klassli loyihalar uchun startup-priority ni faqat birinchi ekran uchun qo'shing. DEX dagi har bir ortiqcha metod yuklashga 0.5–2 ms qo'shadi va 50k+ metodli ilovalar uchun (multidex bilan primary dex) — 300 ms gacha.
Android Vitals Google Play Console da (Launch time bo'limi) ilova o'rnatilgan barcha qurilmalardan ma'lumotlarni to'playdi, agar foydalanuvchi anonim diagnostikaga rozilik bergan bo'lsa. Metrikalar uch toifaga bo'linadi: "good" (yaxshi), "moderate" (o'rtacha), "bad" (yomon), Cold Start vaqtiga qarab.
Google "bad" Cold Start ni har qanday qurilmada 5 soniyadan ortiq vaqt deb belgilaydi. Biroq amalda flagman qurilmalari uchun (Snapdragon 8 Gen) yaxshi vaqt 1.5 soniyadan kam, o'rta segment uchun — 2.5 soniyadan kam, byudjetli uchun — 4 soniyadan kam hisoblanadi. Android Vitals har bir device model bo'yicha medianani ko'rsatadi, bu qaysi qurilmalarda ilova sekin ishga tushishini tushunish imkonini beradi. Agar Cold Start Samsung A-series yoki Xiaomi Redmi qurilmalarida yomon bo'lsa, sabab ko'pincha kuchsiz flesh-xotira va kam RAM (Baseline Profiles orqali tezlashtirish aynan bunday qurilmalarda eng katta samara beradi).
Konsolda ko'rsatishdan tashqari, Cold Start metrikasi Google Play Search da ilova sifatini baholashga ta'sir qiladi. "Yomon" ishga tushirishlarning yuqori foiziga ega ilovalar o'rnatish sahifasida "Performance warning" belgisini oladi, bu konversiyani pasaytiradi. Google ma'lumotlariga ko'ra (Android Performance Playbook, 2024), Cold Start muammolarini bartaraf etgan ilovalar o'rnatish konversiyasini o'rtacha 5% ga oshiradi va retention (D1) ni 3–7% ga yaxshilaydi.
Batafsil monitoring uchun Firebase Performance Monitoring dan foydalaning. U Cold Start ni sessiyalar darajasida kuzatadi, ilova versiyalari va Android versiyalari bo'yicha ajratadi. Android Vitals dan farqli o'laroq, Firebase fazalar bo'yicha sarflangan vaqtning trace-diagrammasini ko'rsatadi. Masalan, 3.2.0 versiyasida Application.onCreate 800 ms (yangi push-bildirishnoma kutubxonasi tufayli), 3.2.1 versiyasida esa 200 ms (tuzatishdan keyin) ekanligini ko'rish mumkin.
Quyida Cold Start ni bevosita tezlashtiradigan ikkita amaliy misol keltirilgan: SDK ishga tushirishni startdan keyin ko'chirish va SplashScreen API dan foydalanish.
Odatdagi xato — barcha SDK larni Application.onCreate da ishga tushirish. Quyida kritik bo'lmagan ishga tushirishni birinchi kadr chizilganidan keyin ishga tushadigan korutinga qanday ko'chirish ko'rsatilgan. Muhim: Firebase, Crashlytics va Crash Reporting SDK startda ishga tushirilishi kerak — ularni kechiktirib bo'lmaydi, chunki ular boshqa komponentlarni ishga tushirishdagi krashlarni ushlaydi. Qolganlari uchun birinchi Activity da lifecycleScope dan foydalaning.
// ❌ Yomon — barcha ishga tushirish Application.onCreate da
class App : Application() {
override fun onCreate() {
super.onCreate()
Firebase.init(this) // kritik
Analytics.init(this) // keyinroq mumkin
Database.init(this) // keyinroq mumkin
ImageLoader.init(this) // keyinroq mumkin
}
}
// ✅ Yaxshi — Firebase startda, qolganlari after inflate
class App : Application() {
override fun onCreate() {
super.onCreate()
Firebase.init(this)
}
}
// MainActivity da birinchi kadrdan keyin:
lifecycleScope.launchWhenResumed {
initializeNonCriticalSdks()
}
Android 12+ da rasmiy SplashScreen API dan foydalaning, u jarayon ishga tushganda darhol system-splashi (qorong'u/yorug' fonda ilova belgisi) ko'rsatadi. Bu foydalanuvchidan ishga tushirish vaqtini yashiradi — u oq ekran emas, balki splashni ko'radi. Eski qurilmalar uchun theme-based splash (stil larda Theme.SplashScreen) dan foydalaning. Muhim: splash 300 ms dan uzoq davom etmasligi kerak — agar bu vaqtda ilova tayyor bo'lmasa, "doimiy" skelet (shimmer) chizing va yuklanish jarayonini ko'rsating.
// SplashScreen API — Android 12+
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition {
isReady.value == false
}
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
// Theme-based splash (Android 5-11)
// themes.xml da:
// <style name="Theme.App.Starting" parent="Theme.SplashScreen">
// <item name="windowSplashScreenBackground">@color/white</item>
// <item name="windowSplashScreenAnimatedIcon">@mipmap/ic_launcher</item>
// </style>
Tez-tez so'raladigan savollar
Emulyator kuchli xost-kompyuterdan foydalanadi va protsessorni apparat tezlashtirish bilan emulyatsiya qiladi (HAXM / WHPX). Jismoniy qurilmalar, ayniqsa byudjetlilari (UFS o'rniga eMMC-xotira), ancha sekin I/O ga ega. Realistik ma'lumotlarni olish uchun Cold Start ni o'rta segmentdagi jismoniy qurilmada o'lchash tavsiya etiladi.
Google tavsiyalariga ko'ra, o'rta segment qurilmalarida median Cold Start 2 soniyadan kam bo'lishi kerak. Flagmanlar uchun — 1.5 soniyadan kam. Byudjetli qurilmalar uchun (2 GB RAM) 4 soniyagacha ruxsat etiladi, lekin 3 soniyagacha optimallashtirish tavsiya etiladi. 5 soniyadan yuqori qiymatlar kritik hisoblanadi.
Bilvosita — ha. Agar manifestda vector-belgi (AdaptiveIcon) ko'rsatilgan bo'lsa, u startda drawable ga kompilyatsiya qilinishi kerak. Agar belgi murakkab yo'llarni o'z ichiga olsa (o'nlab egri chiziqli pathData), kompilyatsiya 10–30 ms oladi. Optimallashtirilgan pathData bilan VectorDrawable dan foydalaning (SVGOMG yoki Android Studio Vector Asset orqali).
Ha, agar Feature Module (Android App Bundle) talab bo'yicha (on-demand) yuklansa, uning Cold Start i xususiyatni bosish momentidan birinchi kadrgacha hisoblanadi. On-demand modullari Play Core Library orqali yuklanadi va ularni o'rnatish start vaqtiga 500–3000 ms qo'shadi. Feature kodini asosiy modul kabi optimallashtiring.
64k dan ortiq metodli ilovalar Multidex ni talab qiladi. Bu ART bir nechta DEX-fayllarni yuklashi kerak degani, bu Cold Start vaqtini classes.dex soniga qarab 200–800 ms ga oshiradi. minSdk 21+ dan foydalaning (ART native multidex bilan) va muhim klasslar birinchi DEX-faylda bo'lishi uchun primary dex ni --main-dex-list orqali sozlang.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.