https://juejin.im/post/5d37a0e8e51d4510a37bacc5
1. 采用挤牙膏的运营方式,前期只会有国内的部分业务,后期会慢慢把国内的业务移植过去。
2. 不同地区有不同的APP,这些APP可能有不同的业务功能。 3. 海外的APP会有UI、逻辑等细微的不同。
- 壳工程:壳工程主要用来做一些打包的配置和一些对全局都有影响的功能。打包配置这个很好理解,例如:渠道包配置、风味配置等。对全局有影响的功能主要是一些检测APP运行状态的功能。例如:我们会在Debug模式下开启LeakCanary、会检测UI渲染是否失帧等。另外,我们集成了Tinker,也是在这个模块下完成的。
- 业务组件:业务层的代码,每个组件单独出去都是一个完整的功能,它们还是沿用之前的MVP架构。
- 业务相关基础组件:这一层是为业务层服务的。原则上这一层不要有UI的逻辑处理,只提供业务能力。UI部分可以放到业务组件中。但是,这个原则并不是一成不变的。例如,我们为扫码功能、分享、地图等功能都提供了完整的UI。
- 业务无关组件:这一层就和业务完全无关了。
整个项目我们使用多仓库的管理方式。我们的仓库管理方式是这样的:
- APP壳工程和每个业务组件都是一个单独仓库。
- 业务相关基础组件整合到一个仓库。
- 业务无关组件整合到一个仓库。
这样做的原因是: 业务层的组件必然会在不同的APP中有所差异,我们的设计必须拥抱这种差异。 我们期望每个业务组件的改动都以版本的形式留下记录,这样我们可以尽可能的使组件在不同的APP间复用。因此我们需要每个业务组件是一个单独的仓库。但是,仓库过多,势必会造成仓库、版本等管理上的困扰。因此我们把业务相关组件层和业务无关组件层分别整合到一个仓库中。这样做的另外一个原因是我们对于业务相关基础组件和业务无关组件在不同APP的差异是拒绝的,我们希望不同的APP可以共用这些组件。
/ 组件间通信 /
/ 组件化初始 /
Android编译期插桩,让程序自己写代码(三):
https://juejin.im/post/5cef3f676fb9a07ee1690c94
知乎的组件化方案:
https://zhuanlan.zhihu.com/p/45374964
有些组件有在应用启动时初始化服务的需求,而且很多服务还是有依赖关系的,最初我们为每个组件都添加了一个 init() 方法,但是并不能解决依赖顺序问题,需要每个组件都在 app 工程中按顺序添加初始化代码才能正常运行,这使得不熟悉整套组件业务的人很难建立起一个可以独立运行的组件 app。因此我们开发了一套多线程初始化框架,每个组件只要新建若干个启动 Task 类,并在 Task 中声明依赖关系即可。
/ 组件化遇到Dagger2 /
还有一种方式是使用Dagger.Android(https://dagger.dev/android.html),它的出现是为了解决上文中提到的模板代码问题。这种方式提高了Dagger的易用性,但是它与组件化不兼容。不幸的是,我们的项目恰好采用了这种方式。因此我们必须解决掉它。
ApplicationAndroidInjector实现了AndroidInjector,它是用来为Application提供注入的。ApplicationAndroidInjector中,有一个DaggerApplicationLike的集合。这个集合内的元素是通过gradle插件利用字节码注入技术在编译期注入的。在inject时,我们合并DaggerApplicationLike集合,生成全新的activityInjector、serviceInjector等注入给Application。
我个人把规划分为技术规划和产品规划。
1. 技术规划主要是结合我们当前的项目做一些技术选型。 我上面提到的项目结构、组件间通信、组件初始化等都属于技术规划。 2. 产品规划是指我们要了解产品未来的发展方向以及近期可能的迭代需求。 我们做设计时要有一定的前瞻性,了解产品未来的发展方向可以帮助我们拆分出更合理的业务组件。
为什么这么说呢? 我举个例子。 现在很多企业都忙于变现,我们也不例外。 我们为APP增加了会员功能,不过这个功能比较隐晦,它被放到了个人模块里。 在做组件拆分时,很自然的我们把会员功能放到了个人模块里。
过了一段时间,产品要大力拓展会员功能。 会员功能在个人组件中的比重也越来越大,以至于我们不得不把会员功能从个人组件中拆分出来。 假如在组件化拆分时,我们就了解到会员功能会被拓展,那么我们在最初就会把会员功能拆分成一个组件。
1. 先从原项目拆分出app壳,这是很简单的。 2. 从原项目中拆分业务相关基础层和业务无关基础层应该是按功能模块为单位的。 例如,把网络作为一个整体移动到业务无关基础层、把支付移动到业务相关基础层等。 这里分包的时候要按模块划分,方便我们拆分拆分组件。 3. 每移动完一个功能,都要commit代码。
推荐阅读: 是的,Retrofit想用得好就得这么死磕
Android Q新特性,一起来学习折叠屏应该如何适配
动手开发一个滴滴出行,你没有看错!