Kotlin搭建组件化应用模板

780 阅读3分钟

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的接口

定义servicefactory用来注入实现

最后就是在modulea中对接口的实现了

在modulea中的application中实现注入

大家都知道,多个module情况下,只有主module也就是声明为application的那个module的application会被初始化,那么如何调用其他module进行接口实现的注入呢?答案就是利用反射 首先定义ModuleConfig,指定每个application的类名

在app的application的initModuleApp方法里

一次调用每个application的initModuleApp方法,这样就实现了注入

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

关注我的公众号