Kotlin搭建组件化应用模板

0.前言

随着版本的迭代,项目可能越来越臃肿,越来越复发,编译起来也很耗时。这个时候组件化开发就体现出优势了,每个组件也就是每个module可以单独运行,单独编译单独测试,这为项目的开发和测试节约了不少时间。

1.问题

组件化开发需要解决的问题:

1.1每个组件既可以单独测试又可以集成测试

1.2组件之间的方法调用

1.3组件间activity的跳转和fragment的使用(router)

1.4部分集成测试

2.方案

2.1每个组件既可以单独测试又可以集成测试

每个module建立一个gradle.properties文件,定义gradle变量isRunAlone用来控制当前控件时在单独测试还是集成测试

《Kotlin搭建组件化应用模板》 image

在module的build.gradle文件中,根据isRunAlone的值来确定module的类型,application还是library

《Kotlin搭建组件化应用模板》 image

同时每个module当单独运行时还需要一个Activity作为默认启动时的activity,而在集成运行是是不需要的,所以我们需要定义两个AndroidManifest文件

《Kotlin搭建组件化应用模板》 image

不要忘记单独测试时为module指定applicationId

 if (isRunAlone.toBoolean()) {
            applicationId "com.skateboard.modulea"
        }

2.2组件之间的方法调用

由于组件间是彼此隔离的,为了调用其他组件的方法,我们这里定义了一个基本组件core,每个组件都引用这个组件,在core组件里定义其他组件对外提供的方法,在其中注入其他组件里对接口的实现。
首先定义modulea的接口

《Kotlin搭建组件化应用模板》 image

定义servicefactory用来注入实现

《Kotlin搭建组件化应用模板》 image

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

《Kotlin搭建组件化应用模板》 image

在modulea中的application中实现注入

《Kotlin搭建组件化应用模板》 image

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

《Kotlin搭建组件化应用模板》 image

在app的application的initModuleApp方法里

《Kotlin搭建组件化应用模板》 image

一次调用每个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

《Kotlin搭建组件化应用模板》 image

关注我的公众号

    原文作者:滑板上的老砒霜
    原文地址: https://www.jianshu.com/p/f640191b7ff8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞