4.1编写您自己的自定义任务
问题
你想用你自己的任务来定制Gradle构建过程。
解
将任务元素添加到Gradle构建文件。使用Android插件提供的额外属性,使开发更轻松。
讨论
Gradle DSL支持用于定义自己的自定义任务的任务块。 API包括大量现有任务(如复制,包装和执行),您只需通过设置属性即可使用。
例如,复制任务包括from和into属性,from块可以配置为排除指定的文件名模式。要将所有APK复制到新文件夹(不包括未签名或未对齐的文件夹)中,请将示例4-1中的任务添加到模块构建中。
实例4-1。将APK复制到另一个文件夹
如果您不想简单地配置现有的Gradle任务,您需要了解Gradle的配置和执行阶段之间的区别。在配置阶段,Gradle基于它们的依赖性构建DAG。然后它执行所需的任务及其依赖关系。所有任务之前都已配置
任何被执行。
Gradle喜欢声明性任务,例如4-1的任务,你指定你想做什么,但不是如何做。但是,如果需要执行命令,请向Gradle任务添加一个doLast块。
在这里重复从示例4-2中所示的任务,从配方3.2。
实例4-2。用于打印可用变量的自定义任务
Android插件添加了一个android属性,它依次具有一个返回所有buildType / flavor组合的applicationVariants属性。在这种情况下,它们都被打印到控制台。
applicationVariants属性仅适用于com.android.application插件。 Android库中提供了libraryVariants属性。 testVariants属性在两者中可用。
要将所有调试风格安装到单个设备上(假设它们都具有唯一的applicationId值),请使用示例4-3中的任务。
实例4-3。在单个设备上安装所有调试风格
结果是在配置过程中,installArrogantDebug,install FriendlyDebug和installObsequiousDebug都作为依赖添加到installDebugFlavors。因此,在命令行执行installDebugFlavors需要所有三个flavor安装。
实例4-4。安装所有调试flavor
你可以看到,编写自己的自定义任务需要至少一些Groovy的知识。因此,广泛的讨论有点超出了本书的范围,但是有好几个好的Groovy资源。本书中定义了其他Groovy概念。
扩展ADP超时期
另外,虽然构建过程相对较快,但部署过程可能不是。 android标签支持adbOptions标签,以增加进程达到超时限制之前允许的时间量(示例4-5)。
实施例4-5。更改ADB超时期限
android {
adbOptions {
timeOutInMs = 30 * 1000
}}
}}
这将超时限制延长到30秒。如果您收到ShellCommandUnresponsiveException失败,请调整此值。
问题
你想用你自己的任务来定制Gradle构建过程。
解
将任务元素添加到Gradle构建文件。使用Android插件提供的额外属性,使开发更轻松。
讨论
Gradle DSL支持用于定义自己的自定义任务的任务块。 API包括大量现有任务(如复制,包装和执行),您只需通过设置属性即可使用。
例如,复制任务包括from和into属性,from块可以配置为排除指定的文件名模式。要将所有APK复制到新文件夹(不包括未签名或未对齐的文件夹)中,请将示例4-1中的任务添加到模块构建中。
实例4-1。将APK复制到另一个文件夹
task copyApks(type: Copy) {
from("$buildDir/outputs/apk") {
exclude '**/*unsigned.apk', '**/*unaligned.apk'
}
into '../apks'
}
buildDir属性引用默认构建目录(app / build),美元符号用于将其注入Groovy字符串(使用双引号)。复制任务的文档显示,里面的排除块支持Ant风格的目录名,这意味着**匹配所有后代目录。
如果您不想简单地配置现有的Gradle任务,您需要了解Gradle的配置和执行阶段之间的区别。在配置阶段,Gradle基于它们的依赖性构建DAG。然后它执行所需的任务及其依赖关系。所有任务之前都已配置
任何被执行。
Gradle喜欢声明性任务,例如4-1的任务,你指定你想做什么,但不是如何做。但是,如果需要执行命令,请向Gradle任务添加一个doLast块。
在这里重复从示例4-2中所示的任务,从配方3.2。
实例4-2。用于打印可用变量的自定义任务
task printVariantNames() {
doLast {
android.applicationVariants.all { variant ->
println variant.name
}
}
}
任务在doLast块之前或之后执行的任何操作都将在配置时运行。 doLast块中的代码本身在执行时运行。
Android插件添加了一个android属性,它依次具有一个返回所有buildType / flavor组合的applicationVariants属性。在这种情况下,它们都被打印到控制台。
applicationVariants属性仅适用于com.android.application插件。 Android库中提供了libraryVariants属性。 testVariants属性在两者中可用。
要将所有调试风格安装到单个设备上(假设它们都具有唯一的applicationId值),请使用示例4-3中的任务。
实例4-3。在单个设备上安装所有调试风格
task installDebugFlavors() {
android.applicationVariants.all { v ->
if (v.name.endsWith('Debug')) {
String name = v.name.capitalize()
dependsOn "install$name"
}
}
}
在这种情况下,dependsOn方法显示这是配置过程的一部分,而不是执行。每个变体名称(如friendlyDebug)都大写(FriendlyDebug),然后将相应的安装任务(安装FriendlyDebug)作为installDebugFlavors任务的依赖项添加。
结果是在配置过程中,installArrogantDebug,install FriendlyDebug和installObsequiousDebug都作为依赖添加到installDebugFlavors。因此,在命令行执行installDebugFlavors需要所有三个flavor安装。
实例4-4。安装所有调试flavor
./gradlew instDebFl
:app:preBuild UP-TO-DATE
:app:preArrogantDebugBuild UP-TO-DATE
:app:checkArrogantDebugManifest
// ... lots of tasks ...
:app:assembleArrogantDebug UP-TO-DATE
:app:installArrogantDebug
Installing APK 'app-arrogant-debug.apk' on 'Nexus_5_API_23(AVD) - 6.0'
Installed on 1 device.
:app:checkFriendlyDebugManifest
// ... lots of tasks ...
:app:assembleFriendlyDebug UP-TO-DATE
:app:installFriendlyDebug
Installing APK 'app-friendly-debug.apk' on 'Nexus_5_API_23(AVD) - 6.0'
Installed on 1 device.
:app:checkObsequiousDebugManifest
// ... lots of tasks ...
:app:assembleObsequiousDebug UP-TO-DATE
:app:installObsequiousDebug
Installing APK 'app-obsequious-debug.apk' on 'Nexus_5_API_23(AVD) - 6.0'
Installed on 1 device.
:app:installDebugFlavors
BUILD SUCCESSFUL
你可以看到,编写自己的自定义任务需要至少一些Groovy的知识。因此,广泛的讨论有点超出了本书的范围,但是有好几个好的Groovy资源。本书中定义了其他Groovy概念。
扩展ADP超时期
另外,虽然构建过程相对较快,但部署过程可能不是。 android标签支持adbOptions标签,以增加进程达到超时限制之前允许的时间量(示例4-5)。
实施例4-5。更改ADB超时期限
android {
adbOptions {
timeOutInMs = 30 * 1000
}}
}}
这将超时限制延长到30秒。如果您收到ShellCommandUnresponsiveException失败,请调整此值。