Android的Gradle技巧 4.4自定义源集

32 篇文章 0 订阅
4.4自定义源集
问题
您想要在项目源代码中使用非标准目录。

在Gradle构建中使用sourceSets属性。
讨论
Android发行版附带的示例配置为使用多个源文件夹,以便从主示例代码中分离公共文件。
考虑一个来自API 23(Android 6.0,Marshmallow)分布的一个任意示例,称为基本手势检测,它位于samples部分的输入/ BasicGestureDetect文件夹中。应用程序本身的细节并不重要 - 它是显示源集修改的Gradle版本。
示例4-15显示了Application子目录中的Gradle构建文件(请注意,示例通常对主子项目使用Application而不是app)。
实例4-15。 Gradle构建文件与源集
// The sample build uses multiple directories to
// keep boilerplate and common code separate from
// the main sample code.
List<String> dirs = [
'main', // main sample code; look here for the interesting stuff.
'common', // components that are reused by multiple samples
'template'] // boilerplate code that is generated by the sample template process
android {
// ... code omitted ...
sourceSets {
main {
dirs.each { dir ->
java.srcDirs "src/${dir}/java"
res.srcDirs "src/${dir}/res"
}
}
androidTest.setRoot('tests')
androidTest.java.srcDirs = ['tests/src']
}
}

构建文件定义了一个名为dirs的List <String>来表示源目录。 Groovy支持列表的本地语法,使用带有逗号分隔的值的方括号。在这种情况下,值为main,common和template。
在Android块中,sourceSets属性用于将相关源目录添加到类路径。着重于主块内部的部分,Groovy的每个迭代器将列表中的每个条目提供给示例4-16中的closure参数。
实例4-16。 Groovy每个都有一个闭包
dirs.each { dir ->
java.srcDirs "src/${dir}/java"
res.srcDirs "src/${dir}/res"
}

每个方法都来自Groovy。它迭代集合的每个元素,将其传递给闭包参数。闭包在这里将每个元素标记为dir,并将其替换为Groovy字符串。
标准项目布局定义了默认源代码树src / main / java和资源树src / main / res。在这种情况下,然而,通过使用srcDirs属性将附加目录添加到这些集合。在这种情况下的结果是文件夹src / main / java,src / common / java和src / template / java都被添加到编译类路径,文件夹src / main / res,src / common /和src / template / res都被认为是资源目录。
然而,真正的讽刺的是,这个特定的示例中没有任何额外的文件夹。所有的Java源都在src / main / java下,所有的资源都在src / main / res下。事实上,没有样本实际使用定义的结构。
它们都将他们的Java源代码和资源限制到标准目录。因此,刚才定义的结构是未来规划的内容,或是旧内容的延续,或者只是Google Android开发人员有幽默感的证据。
但是,使用了sourceSets属性的一个部分。代替将所有测试放在预定义的src / androidTest / java文件夹下,Gradle构建文件将更改该位置(示例4-17)。
实例4-17。更改测试的根目录
androidTest.setRoot('tests')
androidTest.java.srcDirs = ['tests/src']
测试根目录现在是tests文件夹,测试本身放在tests / src文件夹中。每个示例项目在应用程序目录下有两个文件夹:src和tests,测试文件夹包含一个名为src的子目录。 ActivityInstrumentation示例的基本项目布局包含一个Application目录,其内容结构与示例4-18中的相同。
实例4-18。示例项目的目录布局
.
├── build.gradle
├── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── android
│ │ ├── activityinstrumentation
│ │ │ └── MainActivity.java
│ │ ... // more
│ └── res
│ ├── drawable-hdpi
│ │ ├── ic_launcher.png
│ │ └── tile.9.png
│ ... // more
│ ├── values-v11
│ │ └── template-styles.xml
│ └── values-v21
│ ├── base-colors.xml
│ └── base-template-styles.xml
└── tests
├── AndroidManifest.xml
└── src
└── com
└── example
└── android
└── activityinstrumentation
└── SampleTests.java

如你所见,Java代码在src / main / java下,资源位于src / main / res下,测试在所有地方的tests / src下进行。
sourceSets属性在哪里使用?旧版Android应用(例如,在转换为Gradle构建系统之前编写的应用)使用了不同的项目结构。 Android Studio可以导入这些应用程序,但它会重写结构。有关详细信息,请参见配方2.2和配方2.3。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值