0.前言
随着版本的迭代,项目可能越来越臃肿,越来越复发,编译起来也很耗时。这个时候组件化开发就体现出优势了,每个组件也就是每个module可以单独运行,单独编译单独测试,这为项目的开发和测试节约了不少时间。
1.问题
组件化开发需要解决的问题:
1.1每个组件既可以单独测试又可以集成测试
1.2组件之间的方法调用
1.3组件间activity的跳转和fragment的使用(router)
1.4部分集成测试
2.方案
2.1每个组件既可以单独测试又可以集成测试
每个module建立一个gradle.properties文件,定义gradle变量isRunAlone用来控制当前控件时在单独测试还是集成测试
在module的build.gradle文件中,根据isRunAlone的值来确定module的类型,application还是library
同时每个module当单独运行时还需要一个Activity作为默认启动时的activity,而在集成运行是是不需要的,所以我们需要定义两个AndroidManifest文件
不要忘记单独测试时为module指定applicationId
if (isRunAlone.toBoolean()) {
applicationId "com.skateboard.modulea"
}
复制代码
2.2组件之间的方法调用
由于组件间是彼此隔离的,为了调用其他组件的方法,我们这里定义了一个基本组件core,每个组件都引用这个组件,在core组件里定义其他组件对外提供的方法,在其中注入其他组件里对接口的实现。 首先定义modulea的接口
在modulea中的application中实现注入
大家都知道,多个module情况下,只有主module也就是声明为application的那个module的application会被初始化,那么如何调用其他module进行接口实现的注入呢?答案就是利用反射 首先定义ModuleConfig,指定每个application的类名
2.3组件间activity的跳转和fragment的使用(router)
这里采用了阿里的ARouter框架作为路由框架,需要注意的是使用kotlin时需要将build.gradle文件中的annoationprocessor改为kapt
2.4部分集成测试
我们需要的是组件之间彼此隔离,各个组件之间的类是不能直接饮用的,但是如果使用compile在app主组件中引用其他组件时,仍然可以直接使用其他组件的类。这个问题我们可以通过 Gradle 提供的方式来解决,Gradle 3.0 提供了新的依赖方式 runtimeOnly ,通过 runtimeOnly 方式依赖时,依赖项仅在运行时对模块及其消费者可用,编译期间依赖项的代码对其消费者是完全隔离的。
2.5其他问题
另外有些其他问题就是为了避免资源名字重复导致不能编译通过,可以为每个module的资源添加前缀,可以在build.gradle文件中添加resourcePrefix进行资源前缀检查
3.Demo
Github demo地址 Github
关注我的公众号