你是否把所有初始化都写在一个 Applocation 中,没有组件化的时候, 项目中需要的初始化, 我们必须在一个 Applocation 中进行, 组件化之后, 基本也得在一个 Applocation 中进行。 能不能在新增组件时不改变 Application ?
你的 BaseActivity 就是上帝, 公共的业务逻辑都往 BaseActivity 里面扔, 随着项目慢慢膨胀, BaseActivity 该怎么维护 ?
组件化之后, 为了组件间通信, 你是否又新增了一个模块下沉组件间通信的接口, 随着项目的膨胀, 该下沉模块复杂度也大增 ?
项目中的耦合总是喜欢聚集在一个地方, 臭味相投, 怎么办 ?
当进行项目组件化的时候, 我们是希望能把一个稍大的项目拆分为一个个更小的组件, 使得每个更小的组件能在自己的业务边界内职责更清晰, 更容易维护, 并且随着项目的发展, 项目复杂度增长也更平缓。 在组件化实践后, 我想分享下自己在实践时的一些取舍, 如上图所示。 组件化用的路由为 IRouter, 基于另一个项目 SPI 实现的路由。 SPI 原理为编译时 gradle transform 加 ASM 字节码插桩, 功能主要是接口发现与注册, 基于 SPI 还实现了 Application 生命周期组件化。 IRouter 用法像 Retrofit, 通过接口加动态代理实现。不妨看看怎么使用, 先有个感性的认识,顺便注意下项目结构。
添加 spi-gradle-plugin 插件到你的项目
buildscript { repositories { jcenter() } dependencies { classpath 'com.afirez.spi:spi-gradle-plugin:1.0.1' } } // in module build.gradle apply plugin: 'com.android.application' apply plugin: 'spi' // or apply plugin: 'com.afirez.spi' 复制代码
添加 spi 到需要的子模块
implementation "com.afirez.spi:spi:1.0.1" // 实现 Application 组件化(可选) implementation "com.afirez.applike:applike:1.0.1" 复制代码
添加 irouter 到需要的子模块
implementation "com.afirez.irouter:irouter-api:1.0.0" implementation "com.afirez.rxactivityresult:rxactivityresult:1.0.0" implementation "io.reactivex.rxjava2:rxjava:2.2.12" implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' 复制代码
其实 AppLike 不需要 irouter 也能实现 Application 生命周期组件化, AppLike 基于 SPI 实现, 而且 IRouter 本身基于 SPI 实现。 如果遇到其他类似 AppLike 这样的接口加载场景, 我们还可以模仿 AppLike 实现, 这就需要看具体的场景。
最后推荐运行一下 irouter-app 示例, 体验一下,并且在本地熟悉下示例项目的模块结构,项目组件化业务拆分其实很重要,我在完成示例的时候有意的拆分了一下组件,基本每一个业务组件都会额外加一个组件接口暴露模块, 这样的话一个组件由一个组件接口模块和一个组件实现模块构成,职责划分更清晰,组件间交叉通信时也方便,两个组件对彼此的实现不可见, 但是通过组件接口能实现通信,再一次, 我们又面向接口编程了。