# Performance & Stability Guidelines Android Vitals thresholds, performance requirements, and stability best practices. ## Android Vitals Thresholds ### Core Metrics (Google Play) Exceeding these thresholds affects app visibility on Google Play: | Metric | Overall Threshold | Per Phone Model | Per Watch Model | |--------|-------------------|-----------------|-----------------| | User-perceived crash rate | **1.09%** | 8% | 4% | | User-perceived ANR rate | **0.47%** | 8% | 5% | | Excessive battery usage | 1% | - | 1% | | Excessive wake locks | 5% | - | - | ### Consequences of Exceeding Thresholds - Reduced app visibility in Google Play - Warning label on store listing - Lower ranking in search results - Negative impact on user trust ## Startup Performance ### Requirements | Metric | Target | Maximum | |--------|--------|---------| | Cold start | < 1 second | 2 seconds | | Warm start | < 500ms | 1 second | | Hot start | < 100ms | 500ms | ### If Startup Exceeds 2 Seconds Must provide visual feedback: - Progress indicator - Splash screen with animation - Loading skeleton ### Optimization Techniques | Technique | Impact | |-----------|--------| | Lazy initialization | Defer non-critical work | | Async loading | Move I/O off main thread | | View hierarchy optimization | Reduce layout depth | | App Startup library | Initialize components efficiently | | Baseline Profiles | Pre-compile hot paths | ## Rendering Performance ### Frame Rate Requirements | Target | Frame Time | Notes | |--------|------------|-------| | 60 FPS | ≤ 16.67ms | Standard requirement | | 90 FPS | ≤ 11.11ms | High refresh rate displays | | 120 FPS | ≤ 8.33ms | Premium devices | ### Jank Detection | Metric | Threshold | Severity | |--------|-----------|----------| | Slow frames | > 16ms | Warning | | Frozen frames | > 700ms | Critical | | Jank rate | > 1% of frames | Poor experience | ### Common Rendering Issues | Issue | Cause | Solution | |-------|-------|----------| | Overdraw | Multiple layers drawn | Reduce background stacking | | Deep hierarchy | Complex view nesting | Use ConstraintLayout, Compose | | Main thread work | Blocking operations | Move to background thread | | Large bitmaps | Unoptimized images | Downsample, use vector | ## ANR Prevention ### ANR Triggers | Scenario | Timeout | |----------|---------| | Input dispatch | 5 seconds | | Broadcast receiver | 10 seconds | | Service start | 20 seconds | ### Prevention Strategies - Never perform network calls on main thread - Never perform database operations on main thread - Never perform file I/O on main thread - Use coroutines, RxJava, or other async mechanisms - Reduce synchronized block contention ### Common ANR Causes | Cause | Solution | |-------|----------| | Network on main thread | Use coroutines/RxJava | | Database on main thread | Use Room with suspend | | File I/O on main thread | Use Dispatchers.IO | | Lock contention | Reduce synchronized blocks | | Dead locks | Careful threading design | ## Battery Optimization ### Wake Lock Guidelines | Rule | Implementation | |------|----------------| | Minimize duration | Release as soon as possible | | Use appropriate type | PARTIAL_WAKE_LOCK only when needed | | Always release | Use try-finally or lifecycle | | Prefer WorkManager | System-managed scheduling | ### Background Restrictions | Feature | Best Practice | |---------|---------------| | Background services | Use WorkManager instead | | Location | Request only when necessary | | Network | Batch requests, respect connectivity | | Alarms | Use inexact alarms when possible | ### Doze and App Standby | Mode | Behavior | Adaptation | |------|----------|------------| | Doze | Limited network, alarms delayed | Use FCM for high-priority | | App Standby | Background work restricted | Use expedited WorkManager | | Buckets | Frequency limits by usage | Design for infrequent execution | ## Memory Management ### Memory Best Practices | Practice | Benefit | |----------|---------| | Avoid memory leaks | Prevent OutOfMemoryError | | Use weak references | Allow garbage collection | | Recycle bitmaps | Reduce memory pressure | | Monitor heap | Profile regularly | ### Common Memory Issues | Issue | Detection | Solution | |-------|-----------|----------| | Activity leak | LeakCanary | Fix lifecycle references | | Bitmap leak | Memory profiler | Recycle, use Glide/Coil | | Context leak | Static analysis | Use application context | | Handler leak | Lint warning | Use WeakReference | ## StrictMode ### What StrictMode Detects | Category | Issues | |----------|--------| | Thread | Disk reads/writes, network, slow calls | | VM | Leaked objects, unsafe intents, content URI exposure | Enable StrictMode in debug builds to detect violations during development. ## SDK Requirements ### Version Requirements | Property | Requirement | |----------|-------------| | targetSdk | Latest Android SDK (Google Play requirement) | | compileSdk | Latest Android SDK | | minSdk | Based on target audience | ### Third-Party SDK Management | Practice | Reason | |----------|--------| | Keep updated | Security fixes, compatibility | | Audit regularly | Remove unused dependencies | | Monitor crashes | SDKs can cause issues | | Check permissions | SDKs may request excessive permissions | ### Non-SDK Interface Restrictions - Don't use reflection for hidden APIs - Use Android Studio lint to detect - APIs may break in future versions ## Monitoring and Profiling ### Tools | Tool | Purpose | |------|---------| | Android Studio Profiler | CPU, memory, network, energy | | Android Vitals (Play Console) | Production crash/ANR data | | Firebase Performance | Real-time performance monitoring | | Perfetto | Advanced system tracing | | Benchmark library | Reproducible measurements | ### Key Metrics to Track | Metric | Tool | |--------|------| | Startup time | Macrobenchmark | | Frame timing | JankStats | | Memory usage | Memory Profiler | | Network latency | Network Profiler | | Battery drain | Energy Profiler | ## Performance Checklist - [ ] Cold startup < 2 seconds - [ ] Rendering at 60 FPS - [ ] No StrictMode violations - [ ] Crash rate < 1.09% - [ ] ANR rate < 0.47% - [ ] No memory leaks - [ ] Background work uses WorkManager - [ ] Wake locks properly released - [ ] SDKs up to date