Jetpack 寻英贴
背景
1. Jetpack 的出现缘由和价值
熟悉 Jetpack 的开发者都知道,Jetpack 是 Google 为了解决我们在 Android 日常开发中遇到的一些痛点而推出的一套组件。比如:
-
为了解决因为屏幕旋转等配置变化引起 Activity 销毁重建而引发的数据丢失或崩溃问题,推出了 Lifecycle 组件。
-
为了解决依赖注入 Dagger 框架使用技术门槛高的问题,推出了 Hilt。
-
为了解决后台任务管理的问题,推出了 WorkManager。
-
为了解决SQLite数据库使用便利性和门槛的问题,推出了ORM框架 Room,代替 GreenDao。
-
为了解决 Fragment 之间导航的问题,推出了 Navigation。
-
为了解决传统 MVC、MVP 模式下 UI 更新和数据源之间的同步问题,推出了 Databinding+Viewmodel+Livedata的 MVVM 架构模式,可以很方便的实现双向绑定和动态更新。
-
Kotlin 协程与架构组件一起使用,进一步简化了我们异步任务的处理。
Jetpack 出现的主要意义有两个:
- 简化 Android 开发者的工作,让开发者更方便、成本更低的构建应用。
- 通过一些推荐的、标准化的做法,便于构建优质的应用。
为了介绍和推广 Jetpack 的使用,Google 官方还推出了将这些架构组件组合在一起使用的 Demo 应用 Sunflower,Jetpack 相关的官方技术文档现在也比较完善了。比如官方推荐的应用架构如下图:
2. 那我们还有必要做什么吗?
但是,有一点比较有意思的是,「通常官方的东西在实际的工程实践中,都会有一些特定的需求没法很好的满足」。
为了解决这些痛点,有些开发者就会去造一些很好用的*开源出来,然后 Google 慢慢吸收一些好的设计,融进自己的体系中,推出官方的解决方案。这也很正常,也算软件开发中常见的情况。比如 okhttp、ButterKnife、GreenDao、Dagger,都是这么过来的,Google 也在不断的迭代和优化。
那这次的 Jetpack 也一样,最近我在项目中使用 Room 和 WorkManager 的时候就遇到了一些问题和一些疑惑。也是直接导致这篇文章和这个活动产生的原因。
3. 我和 Jetpack 的结缘
我开始知道 Jetpack 和 Kotlin 还算是比较早的,前几年也参加过几次深圳线下官方推广 Jetpack 和 Kotlin 的技术论坛,有幸见到了 Kotlin 语言的技术布道师 Hadi Hariri,有过短暂的交流。但是一直也没有很深的研究,更多处于了解和关注它的演进的层面。
由于各种历史原因,我们的项目也没有使用 Kotlin 来写,直到去年底才重构成 Kotlin 版本。做技术的朋友都知道,了解理论和真正在项目中用过,理解层面的深度差异还是挺大的。
最近新开了个项目,完全用标准的 MVVM、Kotlin、Jetpack 来构建,我才真正得到了一些很好的锻炼,也引发了一些思考和更深入的探索。
4. 我目前碰到的问题
-
- 我在使用 Room 中遇到的问题
但是,Room 也有很多先进的设计,比如不能在主线程执行操作,在主线程执行操作运行时会崩溃;还有写 SQL 语句时如果写的不对编译时就能报错。使用 Room 确实比直接用 SQLite 高效多了,需要写的代码也少了很多。
- 2)我在使用 WorkManager 和看官网文档时遇到的一些疑惑和问题
我们想做些什么?
很显然,Google 官方的方案也不是全能的,它可能是从各个渠道收集来的一些痛点然后推出解决方案,但也不可能全都能覆盖,它也需要去迭代和优化。在工程实践中,面对复杂的需求场景,还是可能会有一些痛点没有得到很好地满足的。
也许是他们都没有想到或遇到过的场景,比如我们国家的互联网规模比较大,有好几个用户群体比较大的超级 APP,面临的场景和技术挑战也许是目前其他国家都没有遇到过的,这些过程中沉淀出来的技术方案也许是有指导价值的。
比如我们在跟 Android 系统限制斗智斗勇过程中沉淀出来的插件化技术,这个氛围要比国外的要好一些,也是一些需求场景推动下的产物。中国软件行业发展到今天,我们有一些领域是可以平等交流的了,也是可以进行一些技术输出的。
基于以上的原因,我们主要想探讨:
-
Jetpack 组件的最佳实践,有什么优缺点,什么场景该用它,什么场景不能用它。(解决使用上的问题)
-
探究 Jetpack 的原理以及理论和工程实践之间的差距,有什么地方是设计得还不够友好的,或者是不能很好的满足需求场景的,是还可以优化的(解决优化的问题)
通过以上的探索,我们想沉淀出一些更有实用价值的最佳实践。
另外,一个人学技术是枯燥、低效、有限的,找一群志同道合的人一起学习,大家互相学习,所长互补,也是一件幸事。
如果能因缘际会帮助到更多遇到同类问题的人,那也挺好的。
最后,对 Jetpack 感兴趣也满足招募条件的 Android 开发者,欢迎联系我交流。(请备注明:Jetpack)