Android模块化设计方案系列文章:
在对项目进行模块化的时候,为了避免相同层级的模块之间交叉依赖,把模块之间需要相互调用的方法抽象成接口下沉到公共模块是普遍的解决方案,但是这样会导致公共模块越来越臃肿,承担了很多不属于它的职能,而且出现问题的时候也不方便进行定位。
那么如何解决这个问题?
微信团队有一篇文章《微信Android模块化架构重构实践》 给出了一个方案,即API化:
那么接下来,我就根据微信团队提出的理论,在实战项目中进行实践:
开发工具:Android Studio 3.6.3
Gradle版本:5.6.4
开发语言:Kotlin
第一步:我在a模块中简单定义了一个接口:
并在impl里面对该接口进行了实现,现在可以看到我这个接口的拓展名是.kapi的,为了能让Android Studio更好的识别该自定义文件,我们可以在Preferences > Editor > File Types里面定义文件的类型。
这里有问题,本来这个.kapi应该和上面的.api一样,定义在各自的文件类型下,但是我定义在Kotlin的文件下的时候,编译项目时会随机飘红,我研究了下但是并没有找到原因所在,所以只能在Kotlin的同层定义了一个Kapi的类型与拓展名。有知道原因的大佬希望能不吝赐教。
第二步:在a模块中新建一个api.gradle,作为自动生成-api模块的build.gradle文件
由于跨模块调用资源文件的场景一般不多,所以我就简单一点,让自动生成的-api模块类型为java-library。
第三步:自定义gradle脚本实现-api模块的生成,我在setting.gradle文件的同层目录下创建一个名为supportApi.gradle的脚本文件,其内容如下:
(简书插入gradle代码的时候全成了一坨,我就偷个懒,就截图展示了😹)
定义完我们的脚本文件之后,在setting.gradle中引入,并把include替换为我们自己定义的includeWithApi
然后就可以重新构建我们的项目了。
第四步:脚本自动生成的liba-api模块就可以愉快的被其他模块调用了,因为这个模块里面只有我们在liba模块里面kapi接口,并没有其他多余的文件,我们也可以放心大胆的在其他模块中依赖这个api模块了。
而liba模块本身在脚本中已经自动完成对生成模块的依赖了,所以liba模块无需再依赖liba-api。
接口API化的简单实现方案就此完成,赶快试试吧~
项目地址:https://gitee.com/StudyNotes/x-moduler
欢迎关注~