sourceSets——安卓gradle

目录
1、前言
2、sourceSets 结构简析
3、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
4、sourceSets 的方法
4.1 setRoot(String path)
5、写在最后
html

1、前言

Android 项目中,代码的摆放位置都是约定好的,这是由于 gradle 的理念 “约定大于配置”,减小各类配置的书写。java

约定并不是规定,因此能够进行配置改动,这也是 gradle 的一大优势。在 Android 中,咱们经过 sourceSets 进行配置。android

2、sourceSets 结构简析

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

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

在上面的代码中咱们能够得知三个信息gradle

  • sourceSets 能够针对不一样的 风味 进行个性化配置,例如这里的 【hello风味】能够有本身的资源目录。
  • main 为主干,其余的风味设置为分支,分支的设置会合并到主干中,例如这里的【hello风味】的配置会合并 main 的配置。
  • sourceSets 下能够装载多个 sourceSet,咱们这里的 main 和 hello 即为 sourceSet。

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

3、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 有三个属性能够设置,咱们一一解析:spa

3.1.1 srcDirs

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

3.1.2 includes

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

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

咱们这里的例子设置了 "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'
复制代码

4、sourceSets 的方法

4.1 setRoot(String path)

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

  • 使用方法:

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

     // 这个会忽略
     java.srcDirs 'zzz'
 }
复制代码

5、写在最后

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

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

相关文章
相关标签/搜索