78 lines
2.5 KiB
Markdown
78 lines
2.5 KiB
Markdown
# 12. App Startup Time & ANR Prevention
|
|
|
|
meta:
|
|
id: android-production-12
|
|
feature: android-production
|
|
priority: P2
|
|
depends_on: []
|
|
tags: [performance, startup, production]
|
|
|
|
objective:
|
|
- Optimize app startup time and prevent ANRs to ensure smooth user experience
|
|
|
|
deliverables:
|
|
- Startup time measurement and baseline
|
|
- Lazy initialization of heavy components
|
|
- ANR prevention measures
|
|
- App Startup library integration
|
|
|
|
steps:
|
|
1. Measure current startup time:
|
|
- Use Android Studio Profiler
|
|
- Use Macrobenchmark library
|
|
- Measure cold start (first launch)
|
|
- Measure warm start (subsequent launches)
|
|
- Establish baseline metrics
|
|
2. Optimize Application.onCreate:
|
|
- Minimize work in KordantApp.onCreate
|
|
- Use App Startup library for initialization ordering
|
|
- Defer non-critical initialization
|
|
- Initialize on background threads where possible
|
|
3. Lazy load heavy components:
|
|
- Defer TRPCApiService initialization until needed
|
|
- Lazy load repository dependencies
|
|
- Defer analytics initialization
|
|
- Use Dagger/Hilt lazy injection
|
|
4. Optimize theme and layout:
|
|
- Use simple splash theme (windowBackground only)
|
|
- Avoid complex layouts in first screen
|
|
- Preload critical resources
|
|
5. Prevent ANRs:
|
|
- Move all IO operations to background threads
|
|
- Use coroutines with Dispatchers.IO
|
|
- Avoid blocking main thread in composables
|
|
- Profile with StrictMode in debug builds
|
|
6. Add tests:
|
|
- Macrobenchmark tests for startup time
|
|
- ANR detection in CI
|
|
- Memory usage during startup
|
|
|
|
tests:
|
|
- Performance: Startup time <1.5s on Pixel 6
|
|
- ANR: No ANRs during critical flows
|
|
- Memory: No memory spikes during startup
|
|
|
|
acceptance_criteria:
|
|
- Cold startup time <1.5 seconds on Pixel 6
|
|
- Warm startup time <1 second on Pixel 6
|
|
- Splash screen visible for <500ms
|
|
- No blocking operations on main thread during startup
|
|
- Heavy components loaded lazily
|
|
- ANR-free during all critical user flows
|
|
- Macrobenchmark tests for startup time
|
|
- Startup time tracked in CI
|
|
- No StrictMode violations in debug builds
|
|
|
|
validation:
|
|
- Android Profiler → cold start <1.5s
|
|
- Macrobenchmark → startup metrics within budget
|
|
- StrictMode → no disk/network on main thread
|
|
- Physical device test → feels instant
|
|
- ANR traces → none from Kordant
|
|
|
|
notes:
|
|
- Android Vitals tracks startup time and ANRs automatically
|
|
- ANR threshold is 5 seconds for input, 10 seconds for BroadcastReceiver
|
|
- App Startup library helps manage initialization order
|
|
- Test on low-end devices (Android 10, 2GB RAM)
|