Duolingo 使用 MVVM 和 Jetpack 库重构 Android 应用

Duolingo 是全球最受欢迎的语言学习应用,因为它成功地将过去人们认为令人生畏的事情变得轻松有趣。这种轻松的语言学习体验需要持续不断地推出新功能和实验,以及一个能够提供所有这些功能的流畅运行的应用。对于 Duolingo 来说,在世界任何地方的设备上出现无响应的应用都可能意味着学习者可能会失去信心。这让他们致力于打造卓越的应用,尤其是在 60% 学习者(包括其首席执行官)使用的 Android 设备上,首席执行官会通过入门级手机跟踪应用情况。因此,当 Duolingo 的 Android 开发团队注意到“应用无响应”错误和丢帧的增加,甚至收到手写的投诉时,他们立即采取了行动。

他们很快发现了应用性能问题的根源:现有的软件架构无法很好地扩展以适应团队的增长。必要的更新导致应用出现痛苦的性能倒退。他们的开发者花费更多时间修复错误,而减少了发布新的创收功能的时间。他们过时的软件架构开始变得难以接受——对他们、他们的团队速度以及最重要的是用户体验造成了拖累。他们需要从头开始重建代码库。

他们是如何做到的

一开始,团队意见不一。这是否应该成为他们现在的首要任务?一部分人认为继续发布新功能和推动收入更重要,而另一部分人则认为将所有注意力集中在 Android 重构上是前进的道路。最终,他们达成共识,认为不断增加的解决倒退问题的努力可能会完全破坏他们的路线图。他们必须全力以赴。

团队选择了一个越来越受欢迎的解决方案。他们决定使用Model-View-ViewModel重写他们的应用,这是一种谷歌支持的软件模式,允许开发者通过创建明确的关注点分离来简化应用的架构。使用 MVVM,他们可以将图形用户界面(视图)的开发与业务逻辑(模型)的开发分离。他们可以建立清晰且一致的模式,从而更容易使他们的方法与新功能保持一致,并让新加入的开发者更容易上手。

将每个功能分解成独立的模块化部分,使团队能够快速恢复生产力,因为他们可以分配小团队并行处理每个功能,从而提高速度并减少错误。

他们使用 Android 的Jetpack中的库实现了这种新的架构,包括DaggerHilt,以帮助他们编写跨 Android 版本和设备一致工作的代码。这两个新增功能使他们能够创建封装性更好的功能,并更有效地利用 Android 的内置模块

结果

这些性能提升显著改善了学习者在 Android 上,特别是在入门级设备上的体验。它们还带来了一种更灵敏的应用,在旗舰设备上具有更流畅的动画。每日“应用无响应”或 ANR 率下降了 41%。应用低于目标帧率的时间百分比下降了 28%。最重要的是,用户在滚动关键屏幕时的速度提高了 40%。

双手拿着笔记,显示 ANR 减少了 41%,帧率提高了 28%,体验速度提升了 40%。


整个重构耗时八周,使应用对所有 Duolingo 学习者来说都更加引人入胜和令人愉悦。在随后的六个月中,团队没有记录到任何重大的新性能倒退,使他们能够再次专注于发布创收功能。专注于质量的决定得到了回报。

Duolingo 对其使命的奉献使他们成为全球语言学习领域的头号应用。他们对应用卓越的承诺——在不影响可访问性的前提下创造尖端的教育体验——是他们保持领先地位的原因。

开始使用

如果您想深入了解 Duolingo 如何集成 Jetpack 库以及 Model-View-ViewModel 如何改进他们的应用,请阅读我们为开发者准备的技术案例研究