您的位置:首页 > 移动开发 > Android开发

Gradle 第七讲 之 android插件的入门2 SourceSets

2015-12-11 13:36 477 查看
SourceSets 并非是安卓插件中引入的,而是java插件中引入的,所以只要理解其一,即可贯通,

我们先来介绍一下在java插件中如何使用,

1.gradle的资源路径一般都是固定的,

/src/main/java/***

/src/test/java/***

也就是说我们再不编辑sourceSets的情况下,只有这里面的代码才会被编辑, test中的是测试代码。

Question 1:

现在我想要加一些我需要的java文件,但我们还不想按照这个文件夹结构怎么办呢,

我想在

src/sourceSet

下面加一些代码,并且希望编译进jar包里

sourceSets {

    main {

        java {

            srcDir 'src/sourceSet'

        }

    }

}

这样当我们gradle build的时候,你会发现我们新添加的路径里的文件也变到最终的jar包里了,

人类是永远无法满足的,所以我要想到了

Question 2:

我想要可以单独打sourceSet下的jar包,不包括main下面的,这样以后方便我模块区分。


其实很简单,这时我们就不需要将新添加对代码添加到main里了,而是自己声明一个sourceSet

sourceSets {

    intTest

}
先声明一个intTest的sourceSet

再向这里面添加classpath

sourceSets {

    intTest {

         java {

              srcDir 'src/sourceSet'

         }

    }

}
输入:gradle intTestClasses

我们发现在build/classes/中声称了我们的java class,而且只有这个,证明编译成功了

继续向目标前进,我们希望达成jar包,

我们定义一个声称jar包对task

task intTestJar(type:Jar){

    from sourceSets.intTest.output

}

wudideMacBook-Pro:gradle ***$ gradle intTestJar

:clean UP-TO-DATE

:compileIntTestJava

:processIntTestResources
UP-TO-DATE

:intTestClasses

:intTestJar

编译成功,下面到build/libs/下面看到了生成的jar文件,这个jar文件中只有我们的sourceSet文件夹下的类

这时问题又来了,这样如果我有多个sourceSet的话,都声称同一个jar文件,就分不清了,

Question 3:

这时我们需要将每个jar文件拷贝到其他目录,并且重新命名

task copyJar(type:Copy){

    from('/Users/***/AndroidStudioProjects/gradle/build/libs')

    into('/Users/***//AndroidStudioProjects/gradle/out')

    include('gradle-3.0.jar')

    rename('gradle-3.0.jar','intTest.jar')

}

copyJar.dependsOn(intTestJar)

intTestJar.dependsOn(clean)
这样我们每次执行gradle copyJar的时候,

wudideMacBook-Pro:gradle xiepengchong$ gradle copyJar

:clean

:compileIntTestJava

:processIntTestResources
UP-TO-DATE

:intTestClasses

:intTestJar

:copyJar
这样就在指定目录生成制定文件了

现在我们的功能已经完成了

Question 4:但我们能不能简化一下代码呢?
我们将

sourceSets {

    intTest {

         java {

              srcDir 'src/sourceSet'

         }

    }

}
改为

sourceSets {

    intTest.java.srcDir 'src/sourceSet'

}
再运行,结果是不是一样呢,所以说两种写法的功能是相同的,

然后再将

sourceSets {

    intTest

}
这句删除在试试呢?还是ok的,所以这句和下面这句功能也是相同的,有下面的就不需要这个了

Question 5 :我们在上面用到了下面这个,这个是干嘛的呢?

sourceSets.intTest.output

这个我说也未必能说明白,说明白,你也未必能看懂,看懂了也未必记得住,所以我把官方解释放到这,剩下的就靠自己的天赋了。



最后结合我们所学的来了解一下sourceSets在android插件中如何使用的,

android {
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}

}

不知道大家是否见过,如果我们自己构建AndroidStudio程序,这些是没有的,但是eclipse转到android studio的程序,这个是必须的,

想想也很好理解,studio建立的目录符合/src/main/java的gradle目录结构,所以编译会走默认的就可以了

但是eclipse的目录结构可不是这样的,所以就需要自己设置sourceSets将目录结果按照gradle的标准配置一下,

上面的也很好理解,除了上面java的属性以为,还有一些android插件自己的,这里就不细说了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: