Android Studio Set of source 代码源集

一、源集

1、定义:Android Studio 按逻辑关系将每个模块的源代码和资源进行分组,这个分组叫做源集。
2、main Module 源集包括其所有构建变体共用的代码和资源。这句话很关键,意思是,所有的其他构建变体,src/main是其共同拥有的。在说明BuildType时,我们会通过案例代码进行介绍。
3、其他源集目录为可选项,在您配置新的构建变体时,Android Studio 不会自动为您创建这些目录,用户可以通过File > New 菜单选项新建文件或目录,进行特定源集进行创建。

源集按照构建类别(buildType)、产品倾向(productFlavor)等,分为以下几个类型:

源集 备注
src/main/ 此源集包括所有构建变体共用的代码和资源。
src/<buildType>/ 创建此源集可加入特定构建类型专用的代码和资源。
src/<productFlavor>/ 创建此源集可加入特定产品风味专用的代码和资源。
src/<productFlavorBuildType>/ 创建此源集可加入特定构建变体专用的代码和资源。

例如,要生成应用的“完整调试”版本,构建系统需要合并来自以下源集的代码、设置和资源:

src/fullDebug/(构建变体源集)
src/debug/(构建类型源集)
src/full/(产品风味源集)
src/main/(主源集)

4、源集的Overlay机制。如果不同源集包含同一文件的不同版本,Gradle 将按以下优先顺序决定使用哪一个文件(左侧源集替换右侧源集的文件和设置):

构建变体 > 构建类型[BuildType] > 产品风味[ProductFlavor] > 主源集[main] > 库依赖项

在合并多个清单时,Gradle 会使用专用于试图构建的资源进行编译,这些文件包括:构建变体的文件,其他应用版本共用的 Activity、应用逻辑和资源,从而达到不同的构建,编译不同的资源的目的。

二、源集的创建

Gradle 会按照与 main/ 源集类似的特定组织形式来管理源集文件和目录。例如,Gradle 要求您的“调试”构建类型所特定的 Java 类文件位于 src/debug/java/ 目录中。

以debug为例,源集构建会有如下几种方式:

方式一:

1、打开 Project 窗格并从窗格顶端的下拉菜单中选择 Project 视图。
2、导航至 MyProject/app/src/。
3、右键点击 src 目录并选择 New > Folder > Java Folder。
4、从 Target Source Set 旁边的下拉菜单中,选择 debug。
5、点击 Finish。

方式二:

1、在相同的 Project 窗格中,右键点击 src 目录并选择 New > XML > Values XML File。
2、为 XML 文件输入名称或保留默认名称。
3、从 Target Source Set 旁边的下拉菜单中,选择 debug。
4、点击 Finish。
Target Source Set

以上两种方式,都可以创建源集,源集成功创建后,工程展示如下:

三、源集的重定向

可以通过sourceSets {}来设定Gradle module对应的源集路径。

Android SourceSet表示Java,aidl和RenderScript源以及Android和非Android(Java风格)资源的逻辑组。

3.1、属性

属性 描述
aidl Android AIDL源目录为此源设置。
assets 该资源集的Android Assets目录。
compileConfigurationName 该源集合的编译配置的名称。
java Java源代码由Java编译器编译到类输出目录中。
jni 这个源码集的Android JNI源目录。
jniLibs 这个源码集的Android JNI libs目录。
manifest 该源代码集的Android Manifest文件。
name 这个源集的名称。
packageConfigurationName 此源集合的运行时配置的名称。
providedConfigurationName 此源集合的仅编译配置的名称。
renderscript 该源码集的Android RenderScript源目录。
res 该资源集的Android资源目录。
resources 要复制到javaResources输出目录的Java资源。

3.2、方法

方法 描述
setRoot(path) 将源集的根设置为给定的路径。源集合的所有条目都位于此根目录下。

更多属性以及方法详情,请参与官方文档

案例配置: 配置app/other/目录中的源映射到 main源集的某些组件,并更改 androidTest 源集的根目录。

 android {
   ...
   sourceSets {
     // main源集(source set)的闭包配置。
     main {
       // 变更Java 的源文件夹,默认的文件夹 = 'src/main/java'.
       java.srcDirs = ['other/java']

       //如果像以下方式一样,列出来多个文件夹,那么Gradle使用所有的这些文件夹来加载资源,
       //并赋予这些文件夹相同的优先级。如果不同的文件夹中定义了相同的资源,那么会产生资源合并错误。
       //默认的资源文件夹是 'src/main/res'.
       res.srcDirs = ['other/res1', 'other/res2']

       //避免多个文件夹出现“父子”依赖关系。例如:如下情况要避免:
       //res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings']
       //应该只指定:'other/res1'或者指定'other/res1/layouts' and 'other/res1/strings' 

       //每个源集只能有一个AndroidManifest.xml清单文件,
       //默认情况下,main源集的清单文件在src/main/ 目录中。
       manifest.srcFile 'other/AndroidManifest.xml'
       ...
     }

     // 创建额外闭包块区配置其他源集
     androidTest {

       // 如果所有的源集文件都在一个单独的目录中,可以使用setRoot来进行配置。
       // 这样子,Gradle就只会加载该区域。例如:如下配置,Gradle只会从src/tests/java/
       // 来获取源集文件。
       setRoot 'src/tests'
       ...
     }
   }
 }
 ...

四、源集的使用

在使用源集进行编译的时候,要特别注意资源合并的优先级的问题。上面也提到了,优先级如下:

构建变体 > 构建类型[BuildType] > 产品风味[ProductFlavor] > 主源集[main] > 库依赖项

详细说明如下:

  • Java文件。如果找到两个或两个以上定义相同Java 类名的源集目录,那么Gradle 就会引发一个构建错误。
    例如,在构建调试 APK 时,同时定义 src/debug/Utility.java 和 src/main/Utility.java,会发生编译错误。 这是因为Gradle 在构建中检查这两个目录并引发了“duplicate class”错误。
  • 清单合并为单个清单。在合并清单时,将按照上述列表中的顺序指定优先级。也就是说,某个构建类型的清单设置会替换某个产品风味的清单设置,依此类推。
  • value资源。values/ 目录中的文件也会合并在一起。如果两个文件同名,例如存在两个 strings.xml 文件,将按照上述列表中的相同顺序指定优先级。也就是说,某个源集文件中定义的值将会替换产品风味中同一文件中定义的值,依此类推。
  • res/ 和 asset/ 目录中的资源将打包到一起。如果两个或两个以上的源- 集中定义有同名资源,将按照上述列表中的相同顺序指定优先级。
  • 最后,在构建 APK 时,Gradle 会为随库模块依赖项包含的资源和清单分配最低的优先级。

写作不易,耗费心力,如果上面的内容对你有帮助,请随意打赏,让我们坚持下去~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容