一个安卓老项目重构计划

老项目维护,最老代码可以追述到十年前!生词本背单词维护至今,除了新功能开发,UI迭代,架构没有特别大的变更。后续引入Rxjava+retrofit,安卓系统高版本适配等几次动静都不大。现在安卓开发MAD已经成熟,Jetpack Compose趋于稳定,是时候来一波大的改造了。

现状

  • 大部分是Java代码
  • RxJava and Hndler处理异步任务
  • 使用AppCompat theme
  • 使用sqlite helper及raw sql封装数据库调用
  • 大量分散的shared preference用户设置, 没有归类和类型检查
  • Intent传值比较多,没有类型检查

改造计划

  • AppCompat theme -> MD3
    • 切换到md3
    • 主页面tab切换到BottomNavigationView+ViewPager2
  • xml ui -> Jetpack Compose
    • 部分页面切换到compose
  • Navigation component
    • Navigation link
    • 使用Safe argument做传值数据类型检查
  • Java -> Kotlin
  • 引入Kotlin coroutine
  • 引入Hilt注入框架
  • 采用mvvm, viewmodel + Coroutine flow + Livedata
  • raw sql -> Room
    • new table schema
    • db migration
      • 多个相同schema的table合成一个table
  • Shared preference -> DataStore
    • Proto DataStore + Coroutine + LiveData封装成可以监听的有类型检查的LiveData
    • 用户legacy preference setting migration

踩坑/收获

  • Room不支持动态table name,相同scehma的table只能有一个。之前一个生词本一张table存储,现在需要合并到同一个table。
  • 想一步到位迁移到StateFlow,发现使用上有点复杂。Flow没有Android和Lifecircle概念的,需要使用特殊的collect去处理多次触发stream,不能自动unsubscribe等问题。考虑到Sunflower这个Google自己的示范archetechure的库还在使用Livedata,考虑暂时使用Flow+Livedata结合的方式。在repo以及更底层使用Flow,Viewmodel中使用asLivedata()将flow转换为Livedata,UI层去observe Livedata以更新UI。
  • 自己坑最致命,看十年前代码很是酸爽!