前言
为什么要写这个android的flavors的文章,其实关于flavors的配置的文章有很多。主要是想记录一下这两天遇到的关于gradle编译的问题,项目上有三个flavors,但是我们每个flavors都需要写自动化测试用例,自动化测试用的框架是 Espresso,但是我们要分flavors来写测试代码,所以如果按照正常的写测试用例是不行的,当然最后的解决方法肯定是和gradle的编译有关,所以想从0开始学习gradle的编译。gradle其实在项目中是非常重要的,控制着整个项目的编译方式,可以说是整个项目的大纲。我们先分三步:
- 给项目配置多个flavors
- build.gradle中每段代码都是起到什么作用
- 解决实际问题给Espresso自动化测试分多flavors
多个flavors的配置:
ok现在就开始我们的第一步,如何给 android 项目分多个flavors?
1.build.gradle 中配置
android { defaultConfig { .... flavorDimensions "wxy“ } productFlavors { flavor1 {} flavor2 {} } sourceSets { flavor1 { java.srcDirs('src/flavor1/java') res.srcDir('src/flavor1/res') manifest.srcFile('src/flavor1/AndroidManifest.xml') } flavor2 { java.srcDirs('src/flavor2/java') res.srcDir('src/flavor2/res') manifest.srcFile('src/flavor2/AndroidManifest.xml') } } }
2. 在src文件中配置flavor
如图:
3.选择需要编译的flavors
如图:
build.gradle中语句的含义:
通过上面的讲解我们大致了解了flavors的配置,但是每个语句起到什么作用,我们接下来来分析以下:
首先我们来看一张图:
上图我们可以看到选中的文件,有的是可编译状态有的是不可编译状态,都是我们写的class文件,为何有的后缀名是.java.为何androidTest文件夹下面的java文件和flavor1 / flavor2下面的java图标为何不一样????
其实这些都是我们build.gradle中的代码控制的,接下来我们来分析代码。
//项目文件路径配置---闭包 sourceSets { flavor1 { java.srcDirs('src/flavor1/java') res.srcDir('src/flavor1/res') manifest.srcFile('src/flavor1/AndroidManifest.xml') } flavor2 { java.srcDirs('src/flavor2/java') res.srcDir('src/flavor2/res') manifest.srcFile('src/flavor2/AndroidManifest.xml') } }
通过两个图我们来了对比解以下这段代码:
每个项目的sourceets{}里面都默认配置了右侧图片信息,所以我们项目main下面的文件才是始终可编译的状态。如果我们把 main下面的java文件夹名字改成了javaTest,项目就会报错。这时候我们也需要把 java.Dirs('src/main/javaTest')路径也改了才行。
所以这就是我们为什么配置 flavor1 和 flavor2 的路径和文件名称。也就是我们写代码时候为什么必须要在main/java下面创建java类,其他地方创建不起作用的原因了。因为gradle编译的时候只识别到 main/java 文件下面。
Espresso 分 flavors 做自动化测试:
我们用这个espresso框架集成多个flavors,怎么给不同的flavors写对应的测试用例呢。
首先我们正常的自动化测试用例的项目结果是如图:
如图:java文件夹是可编译状态,但是我们现在需要给不同的flavors加单独的测试用例,我们写了一个java文件肯定不行呀,所以就有图下图:
我们写了两个flavors,但是我们可以看到两个文件都是不可编译状态,我们运行项目这两个文件完全不起作用。这怎么办呢?
我们上面已经讲过了,java文件之所以能编译是因为,gradle中早已经给我们设置了默认加载路径,但是我们新加的两个flavors,是不是也要到 gradle中去把路径给她们写好,所以:
sourceSets { .......... //就有了如下两句去加载我们的路径 androidTestFlavor1.java.srcDirs=['src/androidTest/flavor1/java'] androidTestFlavor2.java.srcDirs=['src/androidTest/flavor2/java'] }
通过上面的设置之后,我们的项目就是能编译的状态了。
其实解决这个问题很简单,我们主要就是,举个例子,来让我们明白gradle的配置到底有多重要。所以我们才有动力去学习他,使用它。
其实这个问题很简单,主要就是举个例子,来让我们明白,gradle 在项目编译的时候是非常重要的,这样我们才会有动力去学习他。