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 較爲簡單,但卻很好用的,由於在一個項目中,管理好代碼結構是一項很是重要的任務,而管理好代碼結構的其中一項任務就是要用不一樣的文件夾將不一樣功能的代碼放在該合理的位置, 這樣作的好處就是易拆卸(前提是解耦要夠,有點扯遠了)。

若是喜歡的話請給我一個贊,並關注我吧。文章中若有寫的不妥的地方,請評論區與我討論吧,共同進步。

相關文章
相關標籤/搜索