Warm Start: esensya, mainit na pagsisimula at optimisasyon sa Android

May-akda: IT Sectr Nai-publish: 2026-03-31 Oras ng pagbabasa: 8 min

Warm Start ay isang senaryo ng pagsisimula ng Android app kung saan ang proseso ng app ay nasa memorya na (halimbawa pagkatapos ng pag-minimize), ngunit ang Activity ay nawasak ng system upang makatipid ng resources. Ang Application.onCreate ay naisagawa na, ang mga klase ay na-load na, ngunit ang UI ay muling nilikha. Ayon sa Google, 2024, ang Warm Start ay tumatagal ng 200 hanggang 800 ms at bumubuo ng halos 40% ng lahat ng pagsisimula sa mga device na may 4 GB RAM.

Mga pangunahing punto

  • Warm Start — pagsisimula ng app na may umiiral na proseso ngunit walang Activity sa memorya
  • Pagkakaiba sa Cold Start: Hindi isinasagawa ang Application.onCreate, mga klase ay na-load na
  • Oras Warm Start ay 200–800 ms vs 1–5 segundo para sa Cold Start
  • Mga senaryo: pagbabalik sa app pagkatapos ng ilang oras, pagbaba ng Activity ng OOM-killer
  • Optimisasyon ay nakatuon sa pagpapanatili ng estado ng Activity at pag-cache ng data

Ano ang Warm Start

Warm Start (mainit na pagsisimula) ay isang estado sa pagitan ng Cold Start at Hot Start: ang proseso ng app ay nasa memorya (minsan sa Linux background cache), ngunit ang Activity ay hindi aktibo at muling lilikhain. Ang Android system kapag kulang sa RAM ay maaaring magbaba ng Activity mula sa stack, na iniiwan ang proseso na buhay. Kapag bumalik ang user sa app, magsisimula ang Warm Start: bagong instance ng Activity ay nilikha, ang lifecycle method na onCreate → onStart → onResume ay isinasagawa, ngunit ang Application.onCreate at pag-load ng klase ay nilalampasan.

Mga dahilan ng Warm Start

Ang Android system ay gumagawa ng desisyon tungkol sa pagbaba ng Activity batay sa priyoridad ng proseso (importance rank). Ang Activity sa background (antas PROCESS_STATE_IMPORTANT_FOREGROUND o PROCESS_STATE_TOP_SLEEPING) ay maaaring masira 5–30 minuto pagkatapos ng pag-minimize ng app, depende sa available na RAM. Sa mga device na may 3 GB RAM, ang Activity ay maaaring ibaba pagkatapos ng 10 minuto, sa mga device na may 8 GB — pagkatapos ng ilang oras. Mahalaga: sa Warm Start onSaveInstanceState ay tinatawag bago ang pagkasira ng Activity at ang developer ay maaaring mag-save ng estado ng UI.

Persepsyon ng user

Ang user ay hindi nakakakita ng pagkakaiba sa pagitan ng Warm at Cold Start — pinindot lang niya ang icon ng app at naghihintay. Ngunit sa Warm Start maaaring lumitaw ang puting screen (blank window) kung ang app ay hindi nag-set ng sarili nitong theme para sa start window. Inirerekomenda ng Google na mag-set ng custom na theme sa manifest (Theme.AppCompat.Light o Theme.Material3.DayNight) para sa start Activity upang maiwasan ang pagkutitap ng puting/itim na screen sa Warm Start. Sa Android 12+, ang SplashScreen API ay nagtatago rin ng epektong ito.

Warm Start vs Cold Start vs Hot Start

Ang pag-unawa sa pagkakaiba sa pagitan ng tatlong uri ng pagsisimula ay kinakailangan para sa pagpili ng tamang profiling at optimisasyon na estratehiya. Ang bawat uri ay may sariling tagal, sariling bottleneck, at sariling kasangkapan sa pagsukat.

KraytiryaCold StartWarm StartHot Start
ProsesoMuling nilikhaNasa memoryaNasa memorya
Application.onCreateIsinasagawaHindi isinasagawaHindi isinasagawa
ActivityGinawa mula sa simulaGinawa mula sa simulaNaibalik mula sa stack
Oras1–5 segundo200–800 ms< 200 ms
onCreate ActivityBuongBuong (may restore)Nilalampasan

Sa praktika, ang Warm Start ay bumubuo ng 30% hanggang 60% ng lahat ng pagsisimula ng app, depende sa gawi ng user at dami ng RAM ng device. Ang mga user na nagpapanatili ng maraming app na bukas (multitasker) ay mas madalas nakakaranas ng Warm Start. Para sa social network at messenger, ang Warm Start ang pinakakaraniwang senaryo dahil ang app ay palaging nasa background. Para sa mga banking app, sa kabaligtaran, ang Cold Start ang nangingibabaw (sapilitang paglilinis ng proseso para sa mga kadahilanang pangseguridad).

Mga yugto ng mainit na pagsisimula

Ang Warm Start ay binubuo ng tatlong yugto, bawat isa ay maaaring sukatin at i-optimize. Hindi tulad ng Cold Start, walang yugto ng fork at pag-load ng klase, ngunit may yugto ng pagpapanumbalik ng estado (restore) na maaaring magastos.

Yugto 1: Start window (window background)

Sinusuri ng system kung ang app ay may theme para sa start window. Kung walang nakatakdang theme, ipinapakita ang puting (o itim, depende sa system) na screen. Kung may nakatakdang theme, ipinapakita ang background mula sa theme. Ang yugtong ito ay tumatagal ng 10–30 ms, ngunit biswal na nararamdaman kung ang theme ay hindi tumutugma sa aktwal na UI ng app. Gamitin ang Theme.Material3.DayNight na may custom na windowBackground na ang kulay ay tumutugma sa background ng unang screen — ito ay lumilikha ng epekto ng instant na pag-load.

Yugto 2: Paglikha ng Activity (pagpapanumbalik)

Tinatawag ng system ang onCreate na may pagpapadala ng Bundle savedInstanceState na na-save sa onSaveInstanceState bago ang pagkasira ng Activity. Kung ang app ay nag-save ng estado nang tama (teksto ng field, posisyon ng scroll, data ng ViewModel), ang pagpapanumbalik ay mabilis na nangyayari. Kung hindi — ang Activity ay magsisimula mula sa blangkong pahina at makikita ng user ang loader habang naglo-load ang data. Pangunahing punto: ang mga ViewModel object ay nakakaligtas sa Warm Start lamang kung ang proseso ay hindi nawasak — sa Warm Start ang ViewModel ay nananatili sa memorya.

Yugto 3: Unang frame (TTFD)

Pagkatapos ng onCreate, isinasagawa ang onStart → onResume at tinatawag ng system ang unang pag-render. Ang TTFD (Time To First Draw) para sa Warm Start ay dapat na mas mababa sa 300 ms sa katamtamang device. Kung ang unang screen ay naglalaman ng kumplikadong RecyclerView na may mabibigat na View o naglo-load ng mga imahe sa pamamagitan ng network, ang TTFD ay maaaring lumampas sa hangganan. Gamitin ang Placeholder at Shimmer para sa maayos na pag-load ng nilalaman pagkatapos ng unang frame.

Paano sukatin ang Warm Start

Ang pagsukat ng Warm Start ay mas kumplikado kaysa sa Cold Start dahil kailangan mong i-simulate ang estado na «buhay ang proseso, nawasak ang Activity». Ang karaniwang ADB command na may bandila na -S ay hindi angkop — pinapatay nito ang proseso. Para sa Warm Start gumamit ng ibang approach.

ADB shell am start nang walang -S

Una, patakbuhin ang app sa pamamagitan ng adb shell monkey o tapikin ang icon, pagkatapos ay i-minimize ito (adb shell input keyevent 3 keyevent HOME). Maghintay ng 5–10 segundo upang maibaba ng system ang Activity at patakbuhin ang adb shell am start -W (walang -S). Ang command ay magbabalik ng oras ng pagsisimula na mas maikli kaysa sa Cold Start. Para sa reproducibility gumamit ng script: patakbuhin → maghintay → home → maghintay → patakbuhin.

bash
# Simulasyon ng Warm Start sa pamamagitan ng ADB
$ adb shell am start -W \
    com.example.app/.MainActivity

# Output (Warm Start):
# ThisTime: 412 ms
# TotalTime: 412 ms
# WaitTime: 423 ms

Macrobenchmark para sa Warm Start

Ang library na androidx.benchmark.macro ay sumusuporta sa pagsukat ng Warm Start. Para dito sa test itakda ang startupMode = StartupMode.WARM — ang library ay magpapatakbo ng app, i-minimize ito, maghihintay (configurable delay), at pagkatapos ay susukatin ang muling pagsisimula. Ang Macrobenchmark ay gumagawa ng 10–20 runs at kinakalkula ang mga percentile. Sa CI/CD maaari kang magtakda ng hangganan: kung ang P50 Warm Start ay lumampas sa 600 ms — ang test ay bumagsak. Ito ay nagpapahintulot sa pagsubaybay ng mga regression sa bawat commit.

Firebase Performance Monitoring

Ang Firebase ay awtomatikong nag-iiba ng Cold at Warm Start batay sa oras mula noong huling pagsasara ng app. Kung ang app ay binuksan sa nakaraang 30 minuto, inuuri ng Firebase ang pagsisimula bilang Warm. Sa Firebase console makikita mo ang mga hiwalay na graph para sa bawat uri ng pagsisimula, na nagpapahintulot sa pagsusuri ng epektibidad ng mga optimisasyon. Halimbawa, pagkatapos i-implement ang pag-save ng estado sa ViewModel, makikita ang pagbaba ng Warm Start ng hanggang 30%.

I-optimize ang Warm Start

Ang optimisasyon ng Warm Start ay nakatuon sa dalawang direksyon: pagpapabilis ng Activity.onCreate at tamang pagpapanumbalik ng estado. Dahil ang Application.onCreate at pag-load ng klase ay naisagawa na, ang pangunahing bottleneck ay ang UI code ng unang screen.

Asynchronous na pagpapanumbalik ng estado

Kung ang na-save na estado (savedInstanceState) ay naglalaman ng data na kailangang i-deserialize (Bitmap, String, JSON), gawin ito sa background thread. Sa halip na direktang pagbabasa mula sa Bundle sa onCreate, magpatakbo ng coroutine at magpakita ng shimmer screen. Sa praktika, ang deserialization ng Bundle sa katamtamang device ay tumatagal ng 20–100 ms — mukhang kaunti, ngunit para sa Warm Start ito ay 10–50% ng kabuuang oras. Gamitin ang Saved State Module ng Jetpack library na awtomatikong nagse-save at nagpapanumbalik ng estado ng ViewModel sa Bundle o database.

Pag-optimize ng setContentView

Ang pagpapalawak ng XML layout (layout inflation) — isa sa pinakamahal na yugto ng Warm Start. Kung ang unang screen ay gumagamit ng kumplikadong CoordinatorLayout na may AppBar, CollapsingToolbar, NestedScrollView at tatlong RecyclerView, ang oras ng inflation ay maaaring umabot ng 300 ms. Mga solusyon: gamitin ang ConstraintLayout para sa patag na hierarchy, ilapat ang ViewStub para sa mga seksyong hindi nakikita sa simula (bottom sheet, dialog), paganahin ang asynchronous inflation para sa mabibigat na fragment sa pamamagitan ng AsyncLayoutInflater. Sa Jetpack Compose hindi kailangan ang inflation, ngunit ang pag-compile ng Compose tree sa Warm Start ay maaaring tumagal ng katulad na oras.

Pag-cache ng data

Sa Warm Start, ang data na na-load ng app sa nakaraang session ay maaaring nasa cache na: Room database, SharedPreferences, in-memory cache sa ViewModel. Kung ang unang screen mo ay nagpapakita ng listahan mula sa server, suriin ang cache sa pagsisimula at i-update ang data sa background. Gamitin ang estratehiya na cache-then-network: unang ipakita ang naka-cache na data (instant), pagkatapos ay i-update mula sa server (asynchronous). Ito ay nagbabawas ng perceived na oras ng Warm Start sa 100–200 ms.

kotlin
// ViewModel na may caching para sa Warm Start
class FeedViewModel : ViewModel() {
    private val cache = MutableStateFlow<List<Item>>(emptyList())

    init {
        // Cache muna, pagkatapos network
        viewModelScope.launch {
            cache.emit(db.getItems()) // Warm Start: data nasa database na
            cache.emit(api.fetchItems()) // Update sa background
        }
    }
}

Pagpapanatili ng estado sa Warm Start

Ang tamang pag-save ng estado ay ang pangunahing salik na nag-iiba ng mabuting Warm Start mula sa masama. Inaasahan ng user na bumalik sa app at makita ang parehong bagay na kanyang iniwan — kasama ang posisyon ng scroll, teksto sa mga field, mga napiling tab.

onSaveInstanceState

Tinatawag ng system ang onSaveInstanceState sa pagkasira ng Activity, ngunit BAGO ang proseso ay maaaring patayin. Sa Bundle lamang ang mga simpleng data ang nai-save (String, Int, Parcelable, Serializable). Para sa kumplikadong data gamitin ang SavedStateHandle sa ViewModel — awtomatiko itong nagse-save at nagpapanumbalik ng mga field sa Warm Start. Hindi tulad ng onSaveInstanceState, ang SavedStateHandle ay gumagana kahit na ang proseso ay nakaligtas sa Warm Start (ViewModel ay hindi nawasak). Halimbawa: para sa teksto sa EditText gamitin ang SavedStateHandle.getLiveData(“text”) — ang teksto ay awtomatikong mai-save at mapapanumbalik.

ViewModel at Warm Start

Kung sa Warm Start ang proseso ay hindi pinatay, ang ViewModel ay nananatili sa memorya at ang onCleared ay hindi tinatawag. Nangangahulugan ito na ang lahat ng data na na-load sa nakaraang session ay agad na magagamit. Ngunit kung ang proseso ay pinatay (device sa deep sleep ng higit sa 30 minuto), ang ViewModel ay nawasak at muling nilikha gamit ang SavedStateHandle. Para sa tamang paggana ng ViewModel sa Warm Start gamitin ang SavedStateHandle na may mga field na kailangang maibalik sa anumang senaryo. Pagkakaiba: ang ViewModel na may @HiltViewModel ay awtomatikong sumusuporta sa SavedStateHandle.

MekanismoBuhay ang prosesoPinatay ang proseso
ViewModelData sa memoryaNawasak, muling nilikha
SavedStateHandleData sa memoryaNaibalik mula sa Bundle
onSaveInstanceStateTinatawag sa pagbaba ng ActivityHindi tinatawag
Room DBCache availableCache available (disk)

Pagpapanatili ng scroll ng RecyclerView

Isa sa mga pinakakaraniwang problema ng Warm Start — pagkawala ng posisyon ng scroll. Ang user ay nag-scroll ng feed hanggang sa ika-50 elemento, ni-minimize ang app, bumalik — at nakikita ang simula ng listahan. Solusyon: i-save ang layoutManager.onSaveInstanceState (nagse-save ng posisyon at offset ng unang nakikitang elemento) at ibalik ito sa onRestoreInstanceState. Maaari ring i-save ang huling nakikitang posisyon sa SharedPreferences na may key na petsa/oras upang mabilis na maibalik ang posisyon sa Warm Start.

kotlin
// Pagpapanatili ng scroll position ng RecyclerView
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putParcelable(
        "rv_state", binding.recyclerView
            .layoutManager?.onSaveInstanceState()
    )
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    savedInstanceState?.getParcelable<Parcelable>("rv_state")
        ?.let { binding.recyclerView.layoutManager?.onRestoreInstanceState(it) }
}

Mga halimbawa ng code para sa Warm Start

Dalawang praktikal na halimbawa ng optimisasyon ng Warm Start: paggamit ng SavedStateHandle sa ViewModel at asynchronous na pagpapanumbalik ng kumplikadong data pagkatapos ng pagsisimula.

ViewModel na may SavedStateHandle

Awtomatikong nagse-save ang SavedStateHandle ng mga field sa Bundle at pinapanumbalik ang mga ito sa Warm Start. Ang field ng profile ng user (String, JSON) ay maibabalik nang walang karagdagang mga kahilingan sa server. Kung ang proseso ay pinatay, ang SavedStateHandle ay maglo-load ng huling na-save na estado mula sa Bundle.

kotlin
class ProfileViewModel(
    private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    val profile: StateFlow<Profile?>
        get() = savedStateHandle
            .getStateFlow("profile", null)

    fun loadProfile(id: String) {
        viewModelScope.launch {
            savedStateHandle["profile"] =
                api.getProfile(id)
        }
    }
}

// Warm Start: profile ay hindi null, UI walang loader
// Pagkatapos mag-load: nag-a-update ang profile sa SavedStateHandle

AsyncLayoutInflater para sa mabigat na screen

Kung ang unang screen ay naglalaman ng kumplikadong layout (mapa, gradient, maraming listahan), gamitin ang AsyncLayoutInflater para palawakin ang mabibigat na elemento sa background. Habang ang layout ay pinalalawak, magpakita ng placeholder na may shimmer effect. Ito ay lalong mahalaga para sa Warm Start, kung saan ang bawat millisecond ay mahalaga. Ang AsyncLayoutInflater ay gumagana sa background thread at naghahatid ng handa na View sa pamamagitan ng callback sa pangunahing thread.

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Placeholder layout para sa instant rendering
        setContentView(R.layout.placeholder_shimmer)

        // Asynchronous na pag-load ng mabigat na layout
        AsyncLayoutInflater(this).inflate(
            R.layout.activity_main_complex,
            findViewById(R.id.container)
        ) { view, resId, parent ->
            parent?.removeAllViews()
            parent?.addView(view)
        }
    }
}

Mga madalas itanong

Maaari bang maging Cold Start ang Warm Start?

Oo, kung sa sandali ng Warm Start ang system ay nagpasyang patayin ang proseso ng app (halimbawa upang magbakante ng memorya para sa ibang app), ang pagsisimula ay magiging Cold Start mula sa simula. Ito ay nangyayari sa mga device na may 2–3 GB RAM kapag maraming app ang sabay na gumagana. Sa praktika, ang Warm Start ay garantisado lamang sa loob ng 10–20 minuto pagkatapos ng pag-minimize sa mga mid-range na device.

Nananatili ba ang ViewModel sa Warm Start?

Oo, kung ang proseso ay hindi pinatay, ang ViewModel ay nananatili sa memorya at ang onCleared ay hindi tinatawag. Ito ang pangunahing bentahe ng Warm Start: lahat ng na-load na data, mga kahilingan sa network, cache sa ViewModel — agad na magagamit. Kung ang proseso ay pinatay, ang ViewModel ay muling nilikha sa pamamagitan ng ViewModelProvider.Factory o @HiltViewModel at ang SavedStateHandle ay nagpapanumbalik ng mga nai-save na field.

Bakit maaaring mas mabagal ang Warm Start kaysa sa Cold Start?

Sa teorya, ang Warm Start ay palaging mas mabilis kaysa sa Cold Start, ngunit sa praktika may mga senaryo kung saan minimal ang pagkakaiba: kung ang Application.onCreate ay magaan (50 ms) at ang Activity.onCreate ay mabigat (800 ms), ang Warm Start (800 ms) ay halos katumbas ng Cold Start (850 ms). Sa kasong ito, hindi ang Application ang dapat i-optimize, kundi ang Activity.onCreate — iyon ang nagiging bottleneck para sa Warm Start.

Paano naaapektuhan ng SplashScreen API ang Warm Start?

Ang SplashScreen API sa Android 12+ ay nagpapakita ng system splash (icon sa may kulay na background) kaagad sa pagsisimula — para sa parehong Cold at Warm Start. Para sa Warm Start, ang splash ay ipinapakita lamang ng 100–300 ms, pagkatapos nito ay pinapalitan ng UI ng app. Ang SplashScreen mismo ay hindi nagpapabilis ng pagsisimula, ngunit tinatakpan ang oras ng paglikha ng Activity, pinapabuti ang persepsyon.

Kailangan bang i-optimize ang Warm Start kung mabilis na ang Cold Start?

Oo, dahil ang Warm Start ay nangyayari 2–3 beses na mas madalas kaysa sa Cold Start. Kung ang Cold Start ay tumatagal ng 1.2 segundo at ang Warm Start ay 600 ms, ang 40% ng mga pagsisimula (Warm) ay tumatagal pa rin ng 0.6 segundo, na nararamdaman. Ang pag-optimize ng Warm Start hanggang 200–300 ms ay nagbibigay sa user ng pakiramdam ng instant na pagbabalik. Sa mga device na may 6+ GB RAM, ang Warm Start ay maaaring bumubuo ng hanggang 80% ng lahat ng pagsisimula at ang pag-optimize nito ay nagiging priyoridad.

Buod

  • Warm Start — pagsisimula na may umiiral na proseso, walang Activity sa memorya, oras 200–800 ms
  • Pangunahing pagkakaiba sa Cold Start: Application.onCreate ay hindi isinasagawa, mga klase ay na-load
  • Tatlong yugto ng Warm Start: start window → paglikha ng Activity → unang frame
  • Sinusukat sa pamamagitan ng ADB nang walang bandila -S o Macrobenchmark na may StartupMode.WARM
  • Optimisasyon: SavedStateHandle, AsyncLayoutInflater, cache-then-network, ConstraintLayout
  • ViewModel ay nananatili sa Warm Start (buhay na proseso) — data agad na magagamit
  • Warm Start ay bumubuo ng 40–80% ng lahat ng pagsisimula ng app

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din