在写gradle插件时可能会使用到源码文件,如作源码文件的版本对比,源码分析等,但源码如何来获取呢?一般gradle项目的源码默认都是在固定的位置,如project/app/src/main/java 。但源码的位置并非一定要在此,这只是一个默认位置,在Gradle的配置文件build.gradle里是可以配置源码的位置的,下面可以看下在Android和Java项目中是如何配置的。
配置源码位置
-
Android项目源码配置
Android源码配置是在android下面的sourceSets参数里进行配置。
apply 'com.android.application'
//apply 'com.android.library'
android {
sourceSets {
main {
manifest.srcFile 'src/main/AndroidManifest.xml'
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
assets.srcDirs = ['src/main/assets']
jniLibs.srcDir(['Libs'])
}
}
}
-
Java项目源码配置
Java项目sourceSets与Android项目的不同,它在最外层直接配置。
apply 'java'
sourceSets {
main {
java {
srcDirs = ['src/main/java']
}
resources {
srcDirs = ['src/main/resources']
}
}
}
获取源码文件
我们知道在gradle的配置文件中,每个名称都是一个Extension,每个Extension可以配置指定的参数列表。如android{},是由AppPlugin通过project.getExtensions().create("android",AppExtension)来创建的,而AppExtension类的成员变量定义了gradle参数,如defaultConfig,productFlavors,buildTypes,signingConfigs等。然而事实并非如何,gradle里还有一种配置自定义参数的方式,即Convention。Convention方式中每个成员变量对应的是一个extension。其中Java项目中的sourceSets即是使用如何方式进行配置的。
下面看一下如何获取获取项目的源码。既然源码是通过自定义参数配置的,那么获取的时候通过拿到自定义的参数对象,获取其sourceSets字段即可。
-
Android项目获取sourceSets
android使用的是BaseExension对象配置的参数,所有通过Plugin获取到extension对象,取其中的sourceSets字段。
//Android项目
BaseExtension extension = project.getPlugins().getPlugin(AppPlugin).getExtension()
//Library项目
//BaseExtension extension = project.getPlugins().getPlugin(LibraryPlugin).getExtension()
extension.getSourceSets()
-
Java项目获取sourceSets
Java项目是通过Convention配置的,所以需要找到Convention对象,即JavaPluginConvention。通过此对象来获取Java项目的源码文件
Convention convention = project.getConvention()
JavaPluginConvention javaPluginConvention = convention.getPlugin(JavaPluginConvention)
SourceSet sourceSet = javaPluginConvention.getsourceSets()
注意Java项目创建了Jar任务用来打包,而Jar也有一个getSource方法,此方法获取的并不是源码文件,而是编译过的class文件。