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