Duolingo Android
The 5-Second Wall
39% of Duolingo's entry-level Android users waited 5+ seconds to see the home screen. They weren't waiting for the server. They were waiting for an ad.
The Incident
Duolingo's 2025 Android performance audit revealed a stark split: flagship device users had an acceptable experience, but 39% of users on entry-level Android devices — the dominant hardware in Duolingo's emerging-market growth markets — experienced startup latency above 5 seconds. App-open conversion rate was only 91% on these devices, meaning 9% of users who opened the app gave up before the home screen loaded. Three independent blocking operations were responsible.
Evidence from the Scene
- 39% of entry-level device users experienced 5+ second startup (flagship users: under 2 seconds)
- App-open conversion rate was 91% on budget devices — 9% of opens abandoned before home screen
- Android Profiler showed a WebView being created on the main thread during startup
- A network call with a 1+ second P99 in India completed before the home screen rendered
- Course data deserialization from a multi-megabyte JSON payload blocked the UI thread
- Removing the startup network call in a local test cut startup by ~30% immediately
The Suspects
3 of these are the real root causes. The others are plausible-sounding distractors.
Ads SDK initializing a WebView on the main thread during app startup
Synchronous site availability HTTP request blocking home screen render
Multi-megabyte course data payload deserialized synchronously on the UI thread at startup
Missing Baseline Profiles causing JIT warmup overhead on new installs
Full-resolution character illustrations loaded synchronously before home screen displayed
The Verdict
Real Root Causes
Ads SDK initializing a WebView on the main thread during app startup
WebView initialization is one of the most expensive operations on Android — it loads a Chromium instance. Running it on the main thread during startup added over 1.5 seconds to cold start on entry-level devices. Deferring ads SDK initialization until after the home screen rendered eliminated this entirely.
Synchronous site availability HTTP request blocking home screen render
A network call to check service availability completed synchronously before the home screen rendered. In high-latency markets (India, Brazil), this added 1+ second to every startup. Making it non-blocking with caching removed it from the critical path.
Multi-megabyte course data payload deserialized synchronously on the UI thread at startup
Duolingo's course data had grown to multi-megabyte JSON payloads. Deserializing this on the main thread at startup added hundreds of milliseconds on slow CPUs. The fix: split into on-demand chunks and deserialize off-thread.
Plausible But Wrong
Missing Baseline Profiles causing JIT warmup overhead on new installs
Duolingo did add Baseline Profiles as part of the fix (achieving an additional 30% startup improvement in a separate initiative), but the 5-second wall on entry-level devices was caused by the three blocking main-thread operations, not JIT compilation.
Full-resolution character illustrations loaded synchronously before home screen displayed
Image loading via Coil/Glide runs on background threads and does not block TTID. The blocking operations here are all explicitly on the main thread: WebView init, network call, and JSON deserialization.
Summary
Duolingo's entry-level Android users were stuck at a 5-second wall caused by three independent main-thread blocking operations: an ads SDK creating a WebView during startup, a synchronous network availability check, and multi-megabyte course data being deserialized inline. After running 200+ A/B tests to validate each fix, Duolingo cut the percentage of users experiencing 5+ second startup from 39% to 8% and improved app-open conversion from 91% to 94.7% on budget devices — recovering hundreds of thousands of daily active users. Published June 2025.
The Real Decision That Caused This
“Integrating an ads SDK without measuring its initialization cost on low-end hardware, and not establishing a policy that nothing blocking runs on the main thread before the home screen renders.”
Lesson Hint
Chapter 7 (Platform & Performance) covers startup optimization, StrictMode, and the App Startup library. Chapter 4 (Networking) covers async request patterns and caching strategies to remove network from the startup critical path.
Want to test yourself before reading the verdict?
Open Interactive Case in Autopsy Lab