Android App Excellence: Duolingo
Article Summary
Duolingo's Android app was degrading 5-10% every month. New features meant guaranteed performance regressions every 90 days.
With 10M daily learners, Duolingo's team halted feature development for two months to fix their architecture. They migrated from a monolithic global state object to MVVM with Dagger and Hilt, fundamentally restructuring how their Android app handles state and dependencies.
Key Takeaways
- One release increased crashes 10%, slowed renders 25%, lessons 70% slower
- MVVM migration cut ANR rate 41%, improved frame consistency 28%
- Breaking monolithic DuoState into scoped repositories eliminated cascading updates
- Two month feature freeze to refactor paid off in sustained performance
Duolingo shipped new features for six months post-refactor without significant performance regressions, ending a cycle of monthly degradation.
About This Article
Duolingo's global DuoState object created tight coupling throughout the codebase. Updates cascaded unpredictably, causing rendering performance to degrade and crashes to spike with each release.
The team switched to MVVM architecture using Dagger and Hilt for dependency injection. They broke up the monolithic state into smaller scoped repository objects, which let multiple modules run on separate threads.
After the refactor, Duolingo saw a 41% drop in daily ANR rate, 28% improvement in frame rate consistency, and 40% faster scrolling over six months of ongoing feature work.