Android模块化设计方案系列文章:
4、Android模块化设计方案之sourceSets配置
在Android模块化设计方案之接口API化那篇文章中,我们使用Gradle脚本生成一个api模块,通过对api模块的引用解决了模块间依赖的问题。当然Gradle脚本还有很多灵活的用法,这篇文章就介绍一下Gradle中sourceSets的使用。
假如我们现在有两种环境,dev是开发环境,pro是生产环境,dev环境下,我们要尽可能让代码输出更多的log日志用来调试,或者添加一些有调试逻辑的类文件,但是在pro环境下,就要避免无效log的输出,而且最好不要把在dev环境下的调试类打包到apk中。如果通过常规的逻辑判断来执行不同环境下的不同操作,显然不是一个好的处理方式。那么可不可以通过Gradle脚本来对环境做控制?
当然可以,那就是sourceSets。首先我简单先介绍一下sourceSets的用法:
android{
sourceSets{
main{
java{ }//指定代码目录
manifest{ }//指定清单文件路径
res{ }//指定资源文件目录
jniLibs{ }//指定jni文件目录
... //感兴趣的可以找一下专门介绍sourceSets的文章进行学习
}
}
}
在sourceSets中可以显式的指定特定的文件和目录,我们利用这个特性来完成代码和资源的灵活配置。那么渐染知道了基本用法,接下来就让我们在项目中实践一下吧。
首先,我们在项目的根build.gradle中定义一下变量:
ext {
//开发模式
modelDev = 1
//生产模式
modePro = 2
//当前开发模式
currentModel = modelDev
}
然后,我们在项目的java文件夹的同一层级,再新建几个文件夹:
dev文件夹对应dev环境中要添加的一些调试类。
pro文件夹对应在dev环境中添加调试类的空实现。
例如,我们在dev下面添加了一个ActivityUtil方法,具体如下:
object ActivityUtil{
fun install(application: Application){
application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks{
//TODO 具体实现和调试操作
})
}
}
这个方法在Application中通过install方法进行初始化。
如果这时候环境切换到了pro,但是pro中没有这个类的话,编译就要报错,除非我们删除掉Application中初始化ActivityUtil的方法,这样显然不够友好。
如果我们在pro中创建一个一模一样的ActivityUtil类,也有一个install方法,但是这个方法里面只是一个空的实现,这样是不是既能在切换环境的时候不需要修改代码,而那些测试的代码也不会被打包到apk中去了?
现在我们的不同环境的文件夹和调试类已经创建完毕,只剩下最后一个步骤了:
android{
sourceSets {
if (currentModel == modelDev) {
main.java.srcDirs += 'src/main/dev' //dev模式下额外指定了dev目录
main.res.srcDirs += 'src/main/res-dev' //dev模式下额外指定了dev资源目录
} else {
main.java.srcDirs += 'src/main/pro' //pro模式下额外指定了pro目录
main.res.srcDirs += 'src/main/res-pro' //pro模式下额外指定了pro资源目录
}
}
}
以后我们切换环境,只需要修改一下build.gradle中的currentModel就可以了,再也不用担心把调试的逻辑和不必要的类打包到生产环境了。
是不是很easy?赶快动手试试吧~
项目地址:https://gitee.com/StudyNotes/x-moduler
如果该文章能够帮到你,欢迎点赞评论和关注,一起交流探讨~