一个安卓老项目重构计划
老项目维护,最老代码可以追述到十年前!生词本背单词维护至今,除了新功能开发,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。
- 自己坑最致命,看十年前代码很是酸爽!