sourceSets——安卓gradle

16,663 阅读4分钟

目录
一、前言
二、sourceSets 结构简析
三、sourceSets 的属性
3.1 java
3.2 assets
3.3 aidl
3.4 jni
3.5 jniLibs
3.6 manifest
3.7 renderscript
3.8 res
3.9 resources
四、sourceSets 的方法
4.1 setRoot(String path)
五、写在最后

一、前言

Android 项目中,代码的摆放位置都是约定好的,这是因为 gradle 的理念 “约定大于配置”,减少各种配置的书写。

约定并非规定,所以可以进行配置改动,这也是 gradle 的一大优点。在 Android 中,我们通过 sourceSets 进行配置。

二、sourceSets 结构简析

老规矩,我们看看 sourceSets 的存在结构形式

android{
	sourceSets{
		main{
		}
		
		// hello 风味会叠加在 main 上面,而不是替换
		hello{
		}
	}
	
	flavorDimensions('product')
	productFlavors{
	    hello{
			dimension 'product'
	    }
	}
}

在上面的代码中我们可以得知三个信息

  • sourceSets 可以针对不同的 风味 进行个性化配置,例如这里的 【hello风味】可以有自己的资源目录。
  • main 为主干,其他的风味设置为分支,分支的设置会合并到主干中,例如这里的【hello风味】的配置会合并 main 的配置。
  • sourceSets 下可以装载多个 sourceSet,我们这里的 main 和 hello 即为 sourceSet。

所以按照套路,我们来看下 sourceSet 的继承结构,sourceSet 的具体表现类为 com.android.build.gradle.api.AndroidSourceSet 是一个接口,没有继承其他的类。

三、sourceSets 的属性

3.1 java

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 java 代码的存放位置
  • 使用方法:
main {
	java {
	    srcDirs = [
	            'src/main/java',
	            'src/main/patternFilterableDemo/exclude'
	    ]
	
	    excludes = ['zincStudy/*.java']
	    includes = ["com/zinc/gradlestudy/MainActivity.java"]
	}
}

AndroidSourceDirectorySet 有三个属性可以设置,我们一一解析:

3.1.1 srcDirs

描述:存在的java代码路径,例如上面我们设置了两个文件夹 javaexclude

3.1.2 includes

描述:针对我们设置的 “srcDirs” 文件夹路径,设置将哪些类进行编译打包。

默认情况下该属性的值为 **/*.java(具体规则请查看 PatternFilterable 官方文档),表示包含目录下的所有文件夹以及其下的所有文件。

我们这里的例子设置了 "com/zinc/gradlestudy/MainActivity.java",最终apk包的效果如下图所示

3.1.3 excludes

描述:针对我们设置的 “srcDirs” 文件夹路径,设置将哪些类不进行编译打包

举个例子:

main {
	java {
	    srcDirs = [
	            'src/main/java',
	            'src/main/patternFilterableDemo/exclude'
	    ]
	
	    excludes = ['zincStudy/*.java']
	}
}

我们只使用 excludes,最终apk的代码结构如下,已经看不到zincStudy的代码

强调一下下:includes 和 excludes 的值是针对 “srcDirs” 设置的文件夹路径进行设置的。

3.2 assets

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 assets 的存放位置
  • 使用方法:
assets.srcDirs 'src/main/assets', 'src/main/zincAssets'

3.3 aidl

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 aidl 的存放位置
  • 使用方法:
aidl.srcDirs 'src/main/aidl', 'src/main/zincAidl'

3.4 jni

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 jni 的存放位置
  • 使用方法:
jni.srcDirs '目录1','目录2'

3.5 jniLibs

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 jniLibs 的存放位置
  • 使用方法:
jniLibs.srcDirs '目录1','目录2'

3.6 manifest

  • 类型:AndroidSourceFile
  • 描述:设置 manifest 的存放位置
  • 使用方法:
manifest.srcFile 'src/main/ZincManifest.xml'

3.7 renderscript

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 renderscript 的存放位置
  • 使用方法:
renderscript.srcDirs 'xxx','xxx'

3.8 res

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 res 的存放位置
  • 使用方法:
res.srcDirs 'src/main/res', 'src/main/zinc-res'

3.9 resources

  • 类型:AndroidSourceDirectorySet
  • 描述:设置 java 资源的存放位置
  • 使用方法:
resources.srcDir 'xxx','xxx'

四、sourceSets 的方法

4.1 setRoot(String path)

  • 描述:这个方法会使我们上面分享的属性失效。 一旦我们设置了 setRoot ,则 gradle 会在我们设置的同级目录下找资源。(具体见下面例子)

  • 使用方法:

 zinc {
     // 如果我们的代码都在同一个目录下,可以用setRoot进行设置,
     // 设置了 setRoot 之后,gradle的编译只会在同级目录下找资源,
     // 例如:只会在 src/zincPower/java 找java代码
     // 会忽略 java.srcDirs 设置的路径
     setRoot 'src/zincPower'

     // 这个会忽略
     java.srcDirs 'zzz'
 }

五、写在最后

sourceSets 较为简单,但却很好用的,因为在一个项目中,管理好代码结构是一项非常重要的任务,而管理好代码结构的其中一项任务就是要用不同的文件夹将不同功能的代码放在该合理的位置, 这样做的好处就是易拆卸(前提是解耦要够,有点扯远了)。

如果喜欢的话请给我一个赞,并关注我吧。文章中如有写的不妥的地方,请评论区与我讨论吧,共同进步。