appOpenedTime always uses mainActivityStartTime: The difference between appStartedTimestamp (process creation) and mainActivityStartTime (MainActivity creation) is negligible (20-40ms). Using mainActivityStartTime consistently simplifies the code and fixes edge cases where the conditional logic couldn't distinguish between different launch scenarios (9c, 9f).
Description: User taps app icon โ Fresh process starts โ MainActivity instantiates
Result: COLD START โ
Visual Diagram:
Process (alive 1hr) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐ฎ๐ฝ๐ฝ ๐ถ๐ฐ๐ผ๐ป
| | |
T+0ms โฟโโโ Process starts | |
| ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+10ms โโ instantiateApplication() | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+50ms โโ initialize() (bg thread) | |
| โโ Load RN, init modules | |
| | |
T+120ms ๐ข โโ instantiateActivity() | |
โ | | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐ณ๐ฎ๐น๐๐ฒ (init still running) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ staticMainActivityCreationTime = 120 |
โ | | |
T+120ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+160ms โ | onCreate() |
โ | โโ API < 28 fallback not triggered
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+3500ms โ โโ initialize() complete | |
โ โโ Content renders |
โ | |
โ | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 120ms โ
โ TTI = [view visible time] - 120ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: App backgrounded โ MainActivity destroyed & timestamp cleared โ User returns โ New MainActivity created.
Result: WARM START โ
Visual Diagram:
Process (alive 1hr) MainActivity User
| | |
T-3600000ms | โ |
| | (created 1hr ago) |
| | |
[App backgrounded - MainActivity destroyed by Android]
| | |
T-3599950ms | onDestroy() |
| โโ isChangingConfigurations = false
| โโ staticMainActivityCreationTime = null
| | |
| โ (destroyed) |
| | |
[User taps app icon]
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐ฎ๐ฝ๐ฝ ๐ถ๐ฐ๐ผ๐ป
| | |
T+0ms | | |
T+10ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ (init already done) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ญ๐ฌ |
โ | | |
T+10ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+60ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+3500ms โ | โโ Content renders |
โ | | |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 10ms โ
โ TTI = [view visible time] - 10ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: User shares from another app โ ShareActivity (excluded) opens โ User navigates to main app โ MainActivity instantiates.
Result: WARM START โ
Visual Diagram:
Process (alive 1hr) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ "๐ฆ๐ต๐ฎ๐ฟ๐ฒ"
| | ๐ถ๐ป ๐ฎ๐ป๐ผ๐๐ต๐ฒ๐ฟ ๐ฎ๐ฝ๐ฝ
T+0ms | | |
| ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+50ms โโ initialize() (bg thread) | |
| โโ Load RN, init modules | |
| | |
T+120ms โโ instantiateActivity() | |
| โโ endsWith(".MainActivity") = FALSE |
| โโ SKIPPED - No timestamp set | |
| | |
T+160ms | | ๐ฅ๏ธ Share sheet
| | visible
| | |
[User completes share, taps to open main app]
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐๐ผ ๐ผ๐ฝ๐ฒ๐ป
| | ๐บ๐ฎ๐ถ๐ป ๐ฎ๐ฝ๐ฝ
| | |
T+5000ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ (init done during share) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ฑ๐ฌ๐ฌ๐ฌ |
โ | | |
T+5000ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+5050ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+8500ms โ | โโ Content renders |
โ | | |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 5000ms โ
โ TTI = [view visible time] - 5000ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: Notification arrives โ Service processes headlessly โ User taps 1 minute later โ MainActivity instantiates .
Result: WARM START โ
Visual Diagram:
Process (alive 1hr) MainActivity User
| | |
T+0ms | | |
| ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+50ms โโ instantiateService() | |
| โโ markServiceInstantiation() | |
| โโ serviceInstantiationBeforeActivity = true |
| | |
T+80ms โโ MessagingService.onMessageReceived() |
| (headless, no UI) | |
| | |
[Process stays alive in background - no Activity]
| | |
| | |
| | |
[LATER: User taps notification]
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐
| | ๐ป๐ผ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป
| | |
T+60000ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ (init done in background) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ฒ๐ฌ๐ฌ๐ฌ๐ฌ |
โ | | |
T+60000ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+60050msโ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+63500msโ | โโ Content renders |
โ | | |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 60000ms โ
โ TTI = [view visible time] - 60000ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: Notification arrives โ Service instantiates โ User taps notification immediately (before initialize() finishes) โ MainActivity opens โ User waits for initialize() to complete.
Result: COLD START โ
Visual Diagram:
Process (alive 1hr) MainActivity User
| | |
| | ๐ฑ ๐ก๐ผ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฎ๐ฟ๐ฟ๐ถ๐๐ฒ๐
| | |
T+0ms | | |
| ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+50ms โโ initialize() (bg thread) | |
| โโ Load RN, init modules | |
| | |
T+80ms โโ instantiateService() | |
| โโ serviceInstantiationBeforeActivity = true |
| | |
T+100ms โโ MessagingService.onMessageReceived() |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐ป๐ผ๐๐ถ๐ณ
| | ๐ถ๐บ๐บ๐ฒ๐ฑ๐ถ๐ฎ๐๐ฒ๐น๐
| | |
T+120ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐ณ๐ฎ๐น๐๐ฒ (init still running!) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ญ๐ฎ๐ฌ |
โ | | |
T+120ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+160ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+3500ms โ โโ initialize() complete | |
โ โโ Content renders |
โ | |
โ | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 120ms โ
โ appStartType = COLD (initialize not complete when MA opened) โ
โ TTI = [view visible time] - 120ms = ~3380ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: App already running โ User taps notification โ onNewIntent() called (not instantiateActivity) โ Duplicate detection prevents TTI measurement (no new activity creation).
Result: NO TTI CALCULATED (duplicate detection)
Visual Diagram:
Process (alive) MainActivity User
| โ |
T-10000ms | staticMainActivityCreationTime |
| set previously |
| | |
| | |
| | ๐ฑ ๐ก๐ผ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฎ๐ฟ๐ฟ๐ถ๐๐ฒ๐
| | |
T+0ms | | |
โโ Notification arrives | |
| | |
T+10ms โโ MessagingService.onMessageReceived() |
| โโ serviceInstantiationBeforeActivity = false |
| | |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐
| | ๐ป๐ผ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป
T+5000ms | | |
| | |
T+5010ms | onNewIntent() |
| | |
| โโ instantiateActivity() NOT called
| โโ staticMainActivityCreationTime unchanged
| | |
T+5020ms | ๐ด๐ฒ๐๐๐ฝ๐ฝ๐จ๐๐ฉ๐ถ๐ฒ๐๐ฒ๐ฑ=๐๐ฟ๐๐ฒ |
| | |
| โโ ๐ก๐ผ ๐ฎ๐ป๐ฎ๐น๐๐๐ถ๐ฐ๐ ๐๐ฒ๐ป๐ |
| | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ NO TTI MEASUREMENT (duplicate detection blocks it) โ
โ appViewedByMainActivityTimes[OLD TIME] = true โ returns TRUE โ
โ No analytics sent โ Correct behavior โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: App running โ User rotates device โ onConfigurationChanged() called (activity not destroyed/recreated due to android:configChanges) โ No TTI measurement (no lifecycle change).
Result: NO TTI CALCULATED (no activity recreation)
Visual Diagram:
Process (alive) MainActivity User
| โ |
| staticMainActivityCreationTime |
| unchanged |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐ฟ๐ผ๐๐ฎ๐๐ฒ๐
| | ๐ฑ๐ฒ๐๐ถ๐ฐ๐ฒ
T+0ms | | |
| | |
T+10ms | onConfigurationChanged() |
| | |
| โโ instantiateActivity() NOT called
| โโ onDestroy() NOT called
| โโ staticMainActivityCreationTime unchanged
| | |
T+50ms | Redraws view ๐ฅ๏ธ New orientation
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ NO TTI MEASUREMENT (no activity lifecycle change) โ
โ android:configChanges prevents activity recreation โ
โ No impact on TTI tracking โ Correct behavior โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: Incoming call โ MainActivity opens first โ IncomingCallActivity may appear as overlay/system UI (excluded) โ User answers โ MainActivity continues.
Result: COLD or WARM START โ (depends on whether initialize() finished during call)
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐๐ป๐ฐ๐ผ๐บ๐ถ๐ป๐ด ๐ฐ๐ฎ๐น๐น
| | |
T+0ms | | |
๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+120ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ/๐ณ๐ฎ๐น๐๐ฒ (COLD/WARM) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ญ๐ฎ๐ฌ |
โ | | |
T+120ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+160ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
| | |
| (IncomingCallActivity may | |
| appear as overlay/system | |
| UI, not tracked in TTI) | |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐ฎ๐ป๐๐๐ฒ๐ฟ๐ ๐ฐ๐ฎ๐น๐น
| | |
T+3500ms โ โโ initialize() complete | |
โ โโ Content renders |
โ | |
โ | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appStartType = COLD/WARM (depends on initialize() completion) โ
โ appOpenedTime = 120ms โ
โ TTI = [view visible time] - 120ms โ
โ IncomingCallActivity (overlay/system UI) correctly EXCLUDED โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Description: User long-presses app icon โ Process starts (on some phones, e.g., Samsung) or doesn't start (on others, e.g., Google Pixel) โ Shortcuts menu appears โ Various user actions follow.
9a: Long-press โ Tap Shortcut (COLD)
Description: User long-presses โ Process starts โ Shortcuts menu appears โ User taps a shortcut option โ MainActivity created with discord_shortcut Intent extra.
Result: COLD START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: triggers process start;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung: starts here; | |
| Pixel: starts later when | |
| user taps shortcut) | |
| ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐๐ต๐ผ๐ฟ๐๐ฐ๐๐
| | |
T+120ms ๐ข โโ instantiateActivity() | |
โ | โโ Intent has discord_shortcut extra |
โ | โโ wasLaunchedViaShortcut = true |
โ | โโ wasInitializeComplete = false (COLD) |
โ | โโ staticMainActivityCreationTime = 120 |
โ | | |
T+120ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+160ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+3500ms โ โโ initialize() complete | |
โ โโ Content renders |
โ | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 120ms โ
โ TTI = [view visible time] - 120ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9b: Long-press โ Tap Shortcut (WARM)
Description: User long-presses โ Process starts โ User waits/browses shortcuts โ User taps shortcut after initialize() completes.
Result: WARM START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: process starts here;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung only; Pixel: | |
| starts later when | |
| user taps shortcut) | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | โฑ๏ธ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ถ๐๐
| | |
T+3500ms โโ initialize() complete | |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐๐ต๐ผ๐ฟ๐๐ฐ๐๐
| | |
T+4000ms ๐ข โโ instantiateActivity() | |
โ | โโ wasLaunchedViaShortcut = true |
โ | โโ wasInitializeComplete = true (WARM) |
โ | โโ staticMainActivityCreationTime = 4000 |
โ | | |
T+4000ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+4100msโ | โโ Content renders |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 4000ms โ
โ TTI = [view visible time] - 4000ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9c: Long-press โ Tap Regular Icon (COLD) - RARE
Description: User long-presses โ Process starts โ Shortcuts menu appears โ User dismisses menu or taps regular icon within 100ms after the shortcuts show up, instead of tapping one of the shortcuts โ MainActivity created by tapping app icon (no discord_shortcut extra).
Result: COLD START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: triggers process start;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung: starts here; | |
| Pixel: starts later when | |
| user taps icon) | |
| ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป๐ฆ๐๐ฎ๐ฟ๐๐ฒ๐ฑ=๐ฌ | |
| | |
T+15ms โโ MainApplication.onCreate() | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐ฟ๐ฒ๐ด๐๐น๐ฎ๐ฟ ๐ถ๐ฐ๐ผ๐ป
| | (no discord_shortcut extra)
| | |
T+120ms ๐ข โโ instantiateActivity() | |
โ | โโ Intent has NO discord_shortcut extra |
โ | โโ wasLaunchedViaShortcut = false |
โ | โโ wasInitializeComplete = false (COLD) |
โ | โโ staticMainActivityCreationTime = 120 |
โ | | |
T+120ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+160ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+3500ms โ โโ initialize() complete | |
โ โโ Content renders |
โ | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 120ms โ
โ TTI = [view visible time] - 120ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9d: Long-press โ Tap Regular Icon (WARM)
Description: User long-presses โ Process starts โ User waits โ User taps app icon icon after initialize() completes.
Result: WARM START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: process starts here;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung only; Pixel: | |
| starts later when | |
| user taps icon) | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | โฑ๏ธ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ถ๐๐
| | |
T+3500ms โโ initialize() complete | |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐ฟ๐ฒ๐ด๐๐น๐ฎ๐ฟ ๐ถ๐ฐ๐ผ๐ป
| | |
T+4000ms ๐ข โโ instantiateActivity() | |
โ | โโ Intent has NO discord_shortcut extra |
โ | โโ wasLaunchedViaShortcut = false |
โ | โโ wasInitializeComplete = true (WARM) |
โ | โโ staticMainActivityCreationTime = 4000 |
โ | | |
T+4000ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+4100msโ | โโ Content renders |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 4000ms โ
โ TTI = [view visible time] - 4000ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9e: Long-press โ Notification Tap
Description: User long-presses โ Process starts โ User taps notification โ Service/receiver created before MainActivity.
Result: COLD or WARM START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: process starts here;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung only; Pixel: | |
| starts later when | |
| user taps notification) | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | ๐ฑ ๐ก๐ผ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป ๐ฎ๐ฟ๐ฟ๐ถ๐๐ฒ๐
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ฝ๐ ๐ป๐ผ๐๐ถ๐ณ๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป
| | |
T+5000ms โโ instantiateService() | |
| โโ serviceInstantiationBeforeActivity = true |
| | |
T+5010ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ/๐ณ๐ฎ๐น๐๐ฒ (COLD/WARM) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ฑ๐ฌ๐ญ๐ฌ |
โ | | |
T+5010ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+5060msโ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+8510msโ | โโ Content renders |
โ | | |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 5010ms โ
โ TTI = [view visible time] - 5010ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9f: Long-press โ Share Activity
Description: User long-presses โ Process starts โ User shares from another app โ ShareActivity created before MainActivity.
Result: WARM START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: process starts here;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung only; Pixel: | |
| starts later when | |
| user shares from app) | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐๐ต๐ฎ๐ฟ๐ฒ๐ ๐ณ๐ฟ๐ผ๐บ ๐ฎ๐ป๐ผ๐๐ต๐ฒ๐ฟ ๐ฎ๐ฝ๐ฝ
| | |
T+5000ms โโ instantiateActivity("ShareActivity") |
| โโ endsWith(".MainActivity") = FALSE |
| โโ SKIPPED - No timestamp set | |
| | |
T+5050ms โโ ShareActivity.onCreate() | ๐ฅ๏ธ Share sheet
| | visible
| | |
| ... user interacts with share screen ... |
| | |
| | ๐ ๐จ๐๐๐ฒ๐ฟ ๐ฐ๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ๐ ๐๐ต๐ฎ๐ฟ๐ฒ,
| | ๐ป๐ฎ๐๐ถ๐ด๐ฎ๐๐ฒ๐ ๐๐ผ ๐บ๐ฎ๐ถ๐ป ๐ฎ๐ฝ๐ฝ
| | |
T+10000ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ (init done during share) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ญ๐ฌ๐ฌ๐ฌ๐ฌ |
โ | | |
T+10000msโ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+10050msโ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
โ | | |
T+13500msโ | โโ Content renders |
โ | | |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 10000ms โ
โ TTI = [view visible time] - 10000ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9g: Long-press โ Incoming Call - RARE
9g (COLD): Long-press โ Incoming Call (COLD)
Description: User long-presses โ Process starts โ Incoming call arrives โ MainActivity opens first โ User answers call.
Result: COLD START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: process starts here;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung only; Pixel: | |
| starts later when | |
| call arrives) | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
| | ๐ ๐๐ป๐ฐ๐ผ๐บ๐ถ๐ป๐ด ๐ฐ๐ฎ๐น๐น
| | |
T+120ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐ณ๐ฎ๐น๐๐ฒ (init still running!) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ญ๐ฎ๐ฌ |
โ | | |
T+120ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+160ms โ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
| | |
| (IncomingCallActivity may | |
| appear as overlay/system | |
| UI, not tracked in TTI) | |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐ฎ๐ป๐๐๐ฒ๐ฟ๐ ๐ฐ๐ฎ๐น๐น
| | |
T+3500ms โ โโ initialize() complete | |
โ โโ Content renders |
โ | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appOpenedTime = 120ms โ
โ appStartType = COLD (initialize not complete when MA opened) โ
โ TTI = [view visible time] - 120ms โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
9h (WARM): Long-press โ Incoming Call (WARM)
Description: User long-presses โ Process starts โ User waits โ Incoming call arrives after initialize() completes โ MainActivity opens first.
Result: WARM START โ
Visual Diagram:
Process (NEW) MainActivity User
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐น๐ผ๐ป๐ด ๐ฝ๐ฟ๐ฒ๐๐๐ฒ๐ ๐ถ๐ฐ๐ผ๐ป
| | (Samsung: process starts here;
| | Pixel: process doesn't start)
| | |
T+0ms โฟโโโ Process starts | |
| (Samsung only; Pixel: | |
| starts later when | |
| call arrives) | |
| | |
T+50ms โโ initialize() (bg thread) | |
| | |
T+100ms | | ๐ฅ๏ธ Shortcuts menu appears
| | |
| | โฑ๏ธ ๐จ๐๐ฒ๐ฟ ๐๐ฎ๐ถ๐๐
| | |
T+3500ms โโ initialize() complete | |
| | |
| | ๐ ๐๐ป๐ฐ๐ผ๐บ๐ถ๐ป๐ด ๐ฐ๐ฎ๐น๐น
| | |
T+4000ms ๐ข โโ instantiateActivity() | |
โ | โโ endsWith(".MainActivity") = TRUE |
โ | โโ markActivityInstantiation() |
โ | โโ ๐๐ฎ๐๐๐ป๐ถ๐๐ถ๐ฎ๐น๐ถ๐๐ฒ๐๐ผ๐บ๐ฝ๐น๐ฒ๐๐ฒ=๐๐ฟ๐๐ฒ (init finished) |
โ | โโ staticMainActivityCreationTime == null = TRUE |
โ | โโ ๐๐๐ฎ๐๐ถ๐ฐ๐ ๐ฎ๐ถ๐ป๐๐ฐ๐๐ถ๐๐ถ๐๐=๐ฐ๐ฌ๐ฌ๐ฌ |
โ | | |
T+4000ms โ | โ ๐ฅ๏ธ Splash screen
โ | | visible
โ | | |
T+4050msโ | onCreate() |
โ | | |
โ | โโ Inflate views |
โ | โโ Init React |
| | |
| (IncomingCallActivity may | |
| appear as overlay/system | |
| UI, not tracked in TTI) | |
| | |
| | ๐ ๐จ๐๐ฒ๐ฟ ๐ฎ๐ป๐๐๐ฒ๐ฟ๐ ๐ฐ๐ฎ๐น๐น
| | |
T+4100msโ | โโ Content renders |
โ | | |
โ | | |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ๐ด [๐ง๐ง๐ ๐๐ก๐]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ TTI MEASUREMENT RANGE (๐ข start โ ๐ด end) โ
โ appStartType = WARM (initialize complete when MainActivity opened) โ
โ appOpenedTime = 4000ms โ
โ TTI = [view visible time] - 4000ms โ
โ IncomingCallActivity (overlay/system UI) correctly EXCLUDED โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Legend:
๐ข = TTI measurement START (appOpenedTime)
๐ด = TTI measurement END (calculated in JS)
๐ = User tap/interaction (triggers action)
๐ฅ๏ธ = User sees UI (splash, main app, etc.)
๐ฑ = System event (notification arrives)
๐ = Incoming call
๐ = Configuration change (rotation)
โ = MainActivity instance
โ = TTI measurement in progress
๐๐ผ๐น๐ฑ = Values used in TTI calculation for this scenario
Normal = Events that occur (helpful context)
API < 28 Support:
- Manual tracking in
onStartCommand()andonReceive()with API version checks - Fallback in
MainActivity.onCreate()for timestamp capture - All scenarios work identically on older Android versions