Cold Start — acesta este ciclul complet de pornire a aplicației Android care începe de la starea zero, când procesul aplicației nu există în memorie, iar Activity nu a fost creat. Sistemul creează un proces nou, încarcă clasele, inițializează Application, creează Activity și execută prima randare. Potrivit Google, 2024, pornirea la rece pe dispozitivele de gamă medie poate dura de la 1 la 5 secunde, iar fiecare 100 ms de întârziere reduce probabilitatea de retenție a utilizatorului cu 3%.
Puncte Cheie
Cold Start (pornire la rece) — este scenariul în care aplicația Android pornește din starea cea mai inițială: sistemul de operare creează un proces nou (fork din Zygote), alocă memorie, încarcă codul DEX în ART, inițializează clasele și creează o instanță Application, apoi prima Activity. Înainte de pornirea aplicației, nu există niciun date despre ea în memoria dispozitivului, cu excepția imaginilor cache ale claselor, dacă se utilizează Background Dexopt.
Pornirea la rece are loc în trei cazuri: la prima pornire după instalarea aplicației, la pornirea după repornirea dispozitivului și la pornirea după ce sistemul a descărcat procesul din cauza lipsei de memorie. Pe dispozitivele cu 2–4 GB RAM, sistemul descarcă procesele de fundal destul de agresiv, prin urmare Cold Start poate avea loc la fiecare revenire în aplicație după câteva ore de inactivitate. În Android 12+, sistemul poate păstra procesul înghețat (freeze / cached), dar în cazul economisirii active a memoriei (OOM-killer), procesul va fi distrus.
Potrivit Google (Find My Device report, 2023), 65% dintre utilizatori închid aplicația dacă aceasta nu se deschide în 3 secunde. Pentru rețelele sociale și mesagerii, unde utilizatorul revine de zeci de ori pe zi, Cold Start afectează direct retenția. În Google Play Console, metrica Cold Start se află în secțiunea Android Vitals și este afișată ca unul dintre indicatorii ANR și de performanță. Aplicația care depășește pragul de Cold Start „rău” (mai mult de 5 secunde pe 25% dintre dispozitive) primește un avertisment în consolă și poate fi retrogradată în căutare.
Android distinge trei tipuri de pornire a aplicației, fiecare având o durată diferită, impact asupra UX și abordări de optimizare. Înțelegerea diferenței este necesară pentru alegerea strategiei corecte de profilare.
| Tip pornire | Stare proces | Application.onCreate | Timp tipic |
|---|---|---|---|
| Cold | Fără proces | Se execută | 1–5 secunde |
| Warm | Proces există, fără Activity | Nu se execută | 200–600 ms |
| Hot | Proces + Activity în memorie | Nu se execută | < 200 ms |
Warm Start are loc atunci când procesul aplicației există deja în fundal, dar Activity a fost distrusă (de exemplu, utilizatorul s-a întors după o pauză lungă, iar sistemul a eliberat memoria Activity). Hot Start — când utilizatorul minimizează aplicația și o deschide imediat din nou: Activity este suspendată, iar restaurarea necesită un timp minim. Pentru utilizator, Cold Start este cel mai vizibil tip de pornire, iar optimizarea acestuia oferă cea mai mare creștere a UX.
Cold Start poate deveni Warm Start după ce aplicația a fost pornită cel puțin o dată — ART stochează în cache imaginile compilate ale claselor (Image in Boot Profile), iar reîncărcarea DEX are loc mai rapid. Prin urmare, a doua pornire după primul Cold Start este de obicei cu 20–40% mai rapidă. Dacă aplicația utilizează Baseline Profiles, profilurile se încarcă la prima pornire, iar al doilea start poate fi și mai rapid: Google Play, care a publicat Baseline Profiles, a accelerat Cold Start cu 30% pe dispozitivele cu Android 12+.
Cold Start constă în faze strict definite, fiecare putând fi măsurată și optimizată independent. Cunoașterea fazelor ajută la determinarea etapei în care aplicația pierde timp. Google identifică patru faze principale: crearea procesului, inițializarea Application, crearea Activity și primul cadru.
Sistemul Android (ActivityManagerService) creează un proces nou prin fork din procesul Zygote. Zygote este un proces preîncărcat cu clasele comune Android. Fork se execută în 30–80 ms — acesta este timpul pe care aplicația nu îl poate controla. După fork, este pornit ActivityThread — instanța buclei principale a aplicației. În această etapă are loc, de asemenea, încărcarea claselor prin ClassLoader, iar ART începe să interpreteze primul bytecod. Dacă aplicația utilizează mulți inițializatori statici, această fază se poate prelungi.
Imediat după pornirea ActivityThread, este apelat Application.onCreate. Aici dezvoltatorul face cea mai frecventă greșeală, inițializând totul deodată: Crashlytics, Firebase, clienți de rețea, baze de date, componente Dagger, containere DI. Fiecare astfel de inițializare este timp blocat pe firul principal. Dacă Application.onCreate durează 500 ms, în acea jumătate de secundă utilizatorul vede un ecran alb (sau negru). Durata optimă a acestei faze este mai mică de 200 ms pe un dispozitiv mediu.
După inițializarea Application, se creează o instanță Activity (MainActivity sau Launcher Activity). Este apelat Activity.onCreate, unde are loc setContentView, inițializarea fragmentelor, configurarea ViewModel, abonarea la LiveData/Flow. Dacă onCreate execută încărcarea datelor (SharedPreferences, SQLite, API) sincron pe firul principal, faza se extinde. Scopul este de a încadra onCreate în 200–400 ms pe un dispozitiv mediu.
După finalizarea onCreate, începe prima randare: măsurare, layout, draw. Acest moment se numește TTFD (Time To First Draw). Dacă aplicația utilizează un ecran splash (prin SplashScreen API pe Android 12+ sau prin theme), randarea poate avea loc mai rapid, dar utilizatorul va aștepta oricum până când splash dispare. TTFD ideal pentru Cold Start este mai puțin de 1.5 secunde.
Măsurarea Cold Start necesită instrumente speciale, deoarece înregistrarea obișnuită (Log.d) își începe activitatea doar după crearea Application, iar sincronizarea fork și încărcarea claselor rămân inaccesibile. Google recomandă trei metode: comenzi ADB, Android Vitals și macro-uri personalizate perf.
Cea mai simplă și reproductibilă metodă este comanda adb shell am start -S -W. Flag-ul -S oprește forțat aplicația înainte de pornire (garantează Cold Start). Comanda afișează trei metrici: ThisTime (timpul de pornire a Activity), TotalTime (timpul total cu includerea pornirii procesului) și WaitTime (timpul cu toate întârzierile Activity Manager). Pentru o măsurare curată, efectuați 5–7 măsurători și luați mediana — măsurătorile individuale sunt supuse zgomotului (CPU throttling, sarcină de fundal).
# Cold Start forțat cu măsurare
$ adb shell am start -S -W \
com.example.app/.MainActivity
# Rezultatul comenzii:
# ThisTime: 1842 ms
# TotalTime: 1842 ms
# WaitTime: 1855 ms
Google Play Console colectează metrici anonime de pe toate dispozitivele pe care este instalată aplicația. În secțiunea Android Vitals → Launch time este afișată distribuția mediană Cold Start în funcție de modelul dispozitivului și versiunea Android. Aceasta este singura modalitate de a vedea valorile reale pe dispozitivele utilizatorilor, nu pe dispozitivele de test. Dacă pe Redmi 9A (2 GB RAM) Cold Start depășește 5 secunde, iar pe Pixel 8 — 1.2 secunde, problema constă în cantitatea de memorie și numărul de clase. Google arată, de asemenea, întârzierea perceptibilă de utilizator (user-perceptible delay) pe baza percentilei 25.
Google Jetpack Macrobenchmark (biblioteca androidx.benchmark) permite scrierea de teste instrumentate de pornire a aplicației. Testul instalează aplicația, o pornește în stare rece și măsoară timpul până la primul cadru. Macrobenchmark execută automat 20 de rulări, elimină valorile aberante și arată percentile stabile. Pentru CI/CD, se poate compara baseline-ul cu pornirea curentă — dacă timpul a crescut, pipeline-ul CI poate eșua.
Optimizarea Cold Start este o muncă sistemică ce afectează mai multe niveluri ale aplicației: cod, resurse, configurația de compilare și arhitectura de inițializare. Google recomandă să începeți cu cel mai costisitor — Application.onCreate — și să treceți la detalii.
Transferați toată inițializarea care nu este necesară la pornire din Application.onCreate în primul punct de utilizare. Firebase, Crashlytics, analytics SDK, push-notifications, componente DI — toate pot fi inițializate după randarea primului ecran. Utilizați Lazy (by lazy) în Kotlin sau inițializarea ContentProvider cu apelul explicit initialize(context). Potrivit Google (Android Performance, 2023), inițializarea lentă reduce Cold Start cu 40–60% pentru aplicațiile care utilizează 5+ SDK.
Baseline Profiles — este compilarea AOT a claselor și metodelor critice utilizate la pornirea aplicației. Fără Baseline Profiles, ART interpretează codul DEX sau îl compilează cu JIT, ceea ce necesită timp. Cu profilurile, ART compilează metodele specificate în cod nativ (AOT) la instalarea aplicației. Google afirmă că Baseline Profiles accelerează Cold Start cu 15–40% pe Android 9+ și până la 60% cu optimizările ART din Android 12+. Pentru crearea profilurilor, utilizați pluginul androidx.benchmark:benchmark-baseline-profile-gradle-plugin.
Biblioteca androidx.startup permite organizarea inițializării componentelor și executarea acesteia într-un singur ContentProvider. În locul mai multor ContentProvider de la diferite biblioteci (fiecare adaugă 1–2 ms la pornirea la rece), App Startup le combină într-un graf de dependențe și inițializează strict la nevoie. La pornire, se execută doar componentele cu @Initializer marcate ca necesare pentru primul ecran. Pentru restul, se setează flag-ul needEarlyInit = false — acestea se lansează după prima randare.
// App Startup Initializer — inițializare după pornire
class AnalyticsInitializer : Initializer<Unit> {
override fun create(context: Context) {
Analytics.init(context)
}
override fun dependencies() = listOf<Class<out Initializer<*>>>()
}
// În AndroidManifest.xml marcam ca opțional
// <meta-data android:name="AnalyticsInitializer"
// android:value="false" />
Dimensiunea fișierului DEX afectează direct timpul de încărcare a acestuia de către ART. Utilizați R8/ProGuard pentru ofuscarea și eliminarea codului mort (MinifyEnabled = true). Activați android:extractNativeLibs="false" în manifest pentru ca APK să nu despacheteze fișierele .so la instalare. Pentru proiecte cu 10 Reference Tracking, adăugați startup-priority doar pentru primul ecran. Fiecare metodă suplimentară în DEX adaugă 0.5–2 ms la încărcare, iar pentru aplicațiile cu 50k+ metode (multidex cu primary dex) — până la 300 ms.
Android Vitals din Google Play Console (Launch time section) colectează date de pe toate dispozitivele pe care este instalată aplicația, cu condiția acordului utilizatorului pentru diagnosticare anonimă. Metricele se împart în trei categorii: „good” (bun), „moderate” (mediu), „bad” (rău), în funcție de timpul Cold Start.
Google definește Cold Start „rău” ca timp care depășește 5 secunde pe orice dispozitiv. Însă în practică, pentru dispozitivele flagship (Snapdragon 8 Gen) timpul bun este sub 1.5 secunde, pentru gama medie — sub 2.5 secunde, pentru gama buget — sub 4 secunde. Android Vitals arată mediana pentru fiecare device model, ceea ce permite înțelegerea pe care dispozitive aplicația pornește lent. Dacă Cold Start este rău pe dispozitivele Samsung A-series sau Xiaomi Redmi, cauza este cel mai frecvent memoria flash slabă și cantitatea mică de RAM (accelerarea prin Baseline Profiles oferă cel mai mare efect tocmai pe astfel de dispozitive).
Pe lângă afișarea în consolă, metrica Cold Start influențează evaluarea calității aplicației în Google Play Search. Aplicațiile cu un procent ridicat de porniri „rele” primesc eticheta „Performance warning” pe pagina de instalare, ceea ce reduce conversia. Potrivit Google (Android Performance Playbook, 2024), aplicațiile care au rezolvat problemele de Cold Start încrăsc în medie conversia instalării cu 5% și îmbunătățesc indicatorul de retenție (D1) cu 3–7%.
Pentru o monitorizare mai detaliată, utilizați Firebase Performance Monitoring. Acesta urmărește Cold Start la nivel de sesiuni, împarte pe versiuni ale aplicației și versiuni Android. Spre deosebire de Android Vitals, Firebase arată diagrama trace a timpului petrecut pe faze. De exemplu, se poate vedea că în versiunea 3.2.0 Application.onCreate dura 800 ms (din cauza unei noi biblioteci de notificări push), iar în versiunea 3.2.1 — 200 ms (după remediere).
Mai jos sunt două exemple practice care accelerează direct Cold Start: mutarea inițializării SDK după pornire și utilizarea SplashScreen API.
O greșeală tipică — inițializarea tuturor SDK-urilor în Application.onCreate. Mai jos este arătat cum să mutați inițializarea necritică într-o corutină care se lansează după randarea primului cadru. Important: Firebase, Crashlytics și Crash Reporting SDK trebuie inițializate la pornire — nu pot fi amânate, deoarece prind erorile la inițializarea altor componente. Pentru restul, utilizați lifecycleScope la prima Activity.
// ❌ Rău — toată inițializarea în Application.onCreate
class App : Application() {
override fun onCreate() {
super.onCreate()
Firebase.init(this) // critic
Analytics.init(this) // poate mai târziu
Database.init(this) // poate mai târziu
ImageLoader.init(this) // poate mai târziu
}
}
// ✅ Bine — Firebase la pornire, restul după inflate
class App : Application() {
override fun onCreate() {
super.onCreate()
Firebase.init(this)
}
}
// În MainActivity după primul cadru:
lifecycleScope.launchWhenResumed {
initializeNonCriticalSdks()
}
Pe Android 12+, utilizați SplashScreen API oficial, care arată splash-ul de sistem (icoana aplicației pe fundal întunecat/luminos) imediat la pornirea procesului. Aceasta ascunde timpul de inițializare de utilizator — acesta vede splash-ul, nu un ecran alb. Pentru dispozitivele vechi, utilizați theme-based splash (Theme.SplashScreen în stiluri). Important: splash-ul nu trebuie să dureze mai mult de 300 ms — dacă în acest timp aplicația nu este gata, desenați un schelet „permanent” (shimmer) și afișați progresul încărcării.
// 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)
// În themes.xml:
// <style name="Theme.App.Starting" parent="Theme.SplashScreen">
// <item name="windowSplashScreenBackground">@color/white</item>
// <item name="windowSplashScreenAnimatedIcon">@mipmap/ic_launcher</item>
// </style>
Întrebări frecvente
Emulatorul folosește un computer gazdă puternic și emulează procesorul cu accelerare hardware (HAXM / WHPX). Dispozitivele fizice, în special cele bugetare (memorie eMMC în loc de UFS), au I/O mult mai lent. Se recomandă măsurarea Cold Start pe un dispozitiv fizic de gamă medie pentru a obține date realiste.
Conform recomandărilor Google, Cold Start median trebuie să fie mai mic de 2 secunde pe dispozitivele de gamă medie. Pentru flagship-uri — mai puțin de 1.5 secunde. Pentru dispozitivele bugetare (2 GB RAM) este admisibil până la 4 secunde, dar se recomandă optimizarea până la 3 secunde. Valorile peste 5 secunde sunt considerate critice.
Indirect — da. Dacă în manifest este specificată o pictogramă vectorială (AdaptiveIcon), aceasta trebuie compilată în drawable la pornire. Dacă pictograma conține căi complexe (pathData cu zeci de curbe), compilarea durează 10–30 ms. Utilizați VectorDrawable cu pathData optimizat (prin SVGOMG sau Android Studio Vector Asset).
Da, dacă Feature Module (Android App Bundle) se încarcă la cerere (on-demand), Cold Start-ul său se calculează de la momentul clic pe caracteristică până la primul cadru. Modulele on-demand se încarcă prin Play Core Library, iar instalarea lor adaugă 500–3000 ms la timpul de pornire. Optimizați codul caracteristicii la fel ca modulul principal.
Aplicațiile cu peste 64k metode necesită Multidex. Aceasta înseamnă că ART trebuie să încarce mai multe fișiere DEX, ceea ce crește timpul Cold Start cu 200–800 ms în funcție de numărul de classes.dex. Utilizați minSdk 21+ (ART cu suport pentru multidex nativ) și configurați primary dex prin --main-dex-list pentru ca clasele critice să fie în primul fișier DEX.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și