Android studio【idea】Android开发Android开发经验谈

Gradle终于懂了(二)带你认识SourceSet

2019-08-28  本文已影响0人  键盘上的麒麟臂

上一章内容Gradle终于懂了(一)带你玩转Project发现还是很多人对Gradle比较关注的,弄得我想水几篇文章都不行了。
这里说一下,如果大家有对哪个方面感兴趣的,可以在评论处留言,我会抽时间去总结这部分内容。好吧,我知道我这水平的文章也没多少人看。

没看过上一篇的朋友希望能先去了解下第一篇,因为我不想重复说一些知识点,但是我们还是会基于官方文档来说,当然也只是部分内容,如果想知道更多,当然官方文档才是最权威的。

一.SourceSet

先说说SourceSet吧,虽然之前也写过文章介绍过浅谈Gradle(二)与SourceSet

1.带你浏览文档中的SourceSet

看看官网的文档



可以看到官网一上来就一个demo,我只能说良心啊,而且这个Demo的质量还是挺高的。
我再用手敲一次

sourceSets {
  main {
    java {
      exclude 'some/unwanted/package/**'
    }
  }
}

从这里看得出什么吗?我们回归到上一篇,可以知道,一起对象的起始是project,所以不管我们写什么内容都离不开project,而project的文档中有这么一行


在java这个插件中,project还有sourceSets属性,可以找到详情也同样给出一个demo

而且还提到了SourceSet和SourceDirectorySet,那从这里你就知道SourceSet是什么了吧,SourceSet就是指project的属性sourceSets,当然这样解释不是很好,但是他能给你一种感觉,把SourceSet和project联系到一起的感觉,sourceSets就是project的一个属性。所有我们能从project的这个地方跟着索引找到SourceSet的文档,也就是我最上面的截图。
这里多说两句,假如我们看下面文档的这张图,我们有必要去了解这些属性吗

没必要,因为这些是antlr插件、groovy插件、scala插件,我们用不上,我们用的是java插件或者android插件,等我们用到相应的插件的时候才去看对应的内容。
点击进去可以看到相关的api,我们开发的时候就对照着api开发就行,如果你想实现某个逻辑功能,先看看api是否有能直接调用的方法,如果没有的话就需要自己去实现,那就比较麻烦了。

这个图我截不完,如果你此时已经打开了api,可以看到有个java方法

这就是我们常用的,对照Demo(再多贴一遍)

java插件的情况下,我们其它的方法也能这样调用,比如我这里写
sourceSets{
    main{
        println "getClassesTaskName()"+getClassesTaskName()
    }
}

调用getClassesTaskName方法,从api可以找到它的返回值是String,所以可以直接打印看看



再随便多找个方法玩玩



我们这样写
sourceSets{
    main{
        println "name:"+getName()
        SourceDirectorySet sets = getJava();
        println "sets 长度:"+sets.size()
    }
}

可以看到结果有打印


至于这个SourceDirectorySet怎么用,可以点过去看文档,这里就不介绍了。
PS:注意,我现在所有写的sourceSets都是在android{}外部

我想很多人可能都不知道sourceSet还有这么多方法,只是用过Java这些方法。但是你如果看得懂文档的话,即便是Java方法,你也可以这么玩
sourceSets{
    main{
        SourceSet myJava = java{
            // ......
        }
    }
    println "名称:"+myJava.name
}
可以看到有打印结果

因为文档中java是返回SourceSet对象,而SourceSet文档我们又能找到它有个name的属性,所以可以直接这样调用。
文档中的SourceSet就举这些例子吧,我感觉讲得还是挺多了,就算不会用,至少也能有个了解了
2.Android插件中的sourceSet

讲完文档,其实还是想说一些我们sourceSet常用的方法。
这里多补充一点,这点很重要,你看sourceSet的文档中发现



为什么只有java和resources方法呢,这不太对啊,我们平时至少都是这么写的

    sourceSets{
        main{
            java{

            }
            res{

            }
            assets{

            }
        }
    }

但是api里面没有res方法啊,没有assets方法啊。那是因为我们平时写的这个sourceSet是Android插件的,而官方文档里面的sourceSet是java插件的(上面有说过)。
但是有有一个比较坑的地方,那就是Gradle官方文档,是没有介绍Android插件的,所以我们就需要去单独找Android插件的文档,才能看到Android插件的sourceSet的api。
http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.api.AndroidSourceSet.html

android这边的文档比较简陋,写得就没Gradle的详细,所以第一次看的时候可能会需要花费一些时间。



可以看到它的java返回的是AndroidSourceDirectorySet,和java返回的对象不同,我们也可以看看这个对象



看到后我们也可以这样玩
    sourceSets{
        main{
            println java.name
        }
    }

可以看到打印



这个能看得懂吧,Java返回AndroidSourceDirectorySet对象,AndroidSourceDirectorySet对象里面有name属性,所以java.name就是调用AndroidSourceDirectorySet的name。
没事,觉得简单我们再举一个稍微复杂那么一些的例子

    sourceSets{
        main{
            Set<File> files = java.sourceFiles.getFiles();
            for (File mfile:files){
                println "文件名:"+mfile.name
            }
        }
    }

一般没见过这种玩法吧,一般都不会这样玩,我只是想说学会看Api之后,你想怎么玩都可以,看看结果。



因为我的Demo的文件目录是


例子讲完了,相信你对SourceSet也有一定了解了,那我们再回顾一下,平时我们的做法是什么?
看到api



没错,我们经常用的就是srcDir

上一篇下一篇

猜你喜欢

热点阅读