Android模块化设计方案之sourceSets配置

2,547 阅读3分钟

Android模块化设计方案系列文章:

1、Android模块化设计方案模型图

2、Android模块化设计方案之接口API化

3、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文件夹的同一层级,再新建几个文件夹:

image.png

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?赶快动手试试吧~

image.png

项目地址:gitee.com/StudyNotes/…

如果该文章能够帮到你,欢迎点赞评论和关注,一起交流探讨~