Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务

问题:

你想用自己的任务定制gradle的构建过程。

解决方案:

在gradle的build文件里面增加task元素。用Android插件支持的extra属性使得开发更容易。

讨论:

Gradle的DSL支持使用task块来定义自己的任务。API包括的非常广范围的task(像 Copy,Wrapper和Exec),你可以简单的通过配置来使用。

举例子,Copy任务包含from和to属性,from块可以设置排除指定格式文件名的文件。将那些没有签名的apk以外的所有apk复制到新的文件夹下,任务如下:

task copyApks(type: Copy) {
    from("$buildDir/outputs/apk") {
        exclude ‘**/*unsigned.apk‘, ‘**/*unaligned.apk‘
    }
    into ‘../apks‘
}

buildDir属性和默认的build目录相关,$符号被用来将它插入到Groovy字符串里面(使用双引号)。Copy任务的文档显示,exclude块支持Ant风格的文件目录名,意味着**匹配所有的子目录。

如果你想要简单的配置一个已有的gradle任务,你需要理解gradle里面configuration和execution阶段的区别。在configuration阶段,Gradle基于依赖构建了一个DAG。然后执行特点的任务。所有任务在执行前都被配置过。

Gradle喜欢陈述性的任务。像上面的例子,你具体说明你想要做什么,而不是怎么做。如果你需要执行命令,在Gradle任务里面增加一个doLast块:

task printVariantNames() {
    doLast {
        android.applicationVariants.all { variant ->
            println variant.name
        }
    }
}

任何doLast块前面或者后面的task中执行的,都会在configuration期间执行。doLast块里面的代码在execution期间执行。

Android插件增加一个android属性,相应的有一个applicationVariants属性可以返回所有的buildType/flavor的组合。在这种情况下,他们能够在控制台上输出。

将所有debug flavors装到同一个设备上面(假设他们有唯一的applicationId值),可以使用下面的任务:

task installDebugFlavors() {
    android.applicationVariants.all { v ->
         if (v.name.endsWith(‘Debug‘)) {
              String name = v.name.capitalize()
              dependsOn "install$name"
         }
    }
}

dependsOn方法显示这是configuration阶段的一部分,而不是execution的。每个变体的名字,像friendlyDebug,被大写(FriendlyDebug),然后相应的安装任务(installFriendlyDebug)被添加到installDebugFlavors任务里面。

这个任务是在configuration阶段,installArrogantDebug,installFriendlyDebug,installObsquiousDebug都作为依赖添加到installDebugFlavors里面。因此执行installDebugFalvors任务也会要求三个flavor安装。

写自定义任务需要一点Groovy的只是。进一步讨论有点超出本书的范围。但是有一些不错的书,额外的Groovy概念在里面有介绍。

时间: 2024-10-14 13:32:34

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)4.1——编写自己的任务的相关文章

Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)

如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 1.其实AS project/module的目录结构很简单,我浓缩成2张图给总结了,先看图,再看下面的文字,因为还有些细节图上体现不出来(我这个图上的项目来源于我之前的Eclipse项目,并且有lib项目库相互依赖) 2.上面的图很直观,但也很眼花缭乱,我再针对图总结下重点和疑问点. ①在AS的世界里,文件夹都以模块(module)为单位组织的,其

配置cordova的android开发环境(无android studio)

原文:配置cordova的android开发环境(无android studio) 趁元旦放假想试一下cordova,不想安装庞大的android studio,所以想最小化安装,居然花了一整天的时间才能正常编译cordova工程,记录一下过程,备将来参考. 安装环境:操作系统:windows 10 x64 第一步:安装nodejs,下载最新版本v10.15.0 第二步:设置npm安装源 npm config set registry http://registry.npm.taobao.org

【Android开发】完美解决Android完全退出程序

背景:假说有两个Activity, Activity1和Activity2, 1跳转到2,如果要在2退出程序,一般网上比较常见的说法是用 System.exit(0) 或是 android.os.Process.killProcess(android.os.Process.myPid()) 但实际应用中,并不是能够真正退出,问题出在?1跳转到2时,如果Activity1你finish掉了,两么是可以退出程序的,但有时1跳转到2时,我们不能将Activity1 finish掉,那么在Activit

Android开发:《Gradle Recipes for Android》阅读笔记1.2

在android开发中会需要配置使用app的android SDK的最低版本和目标版本,这个是bulidl.gradle的android模块设置.默认有以下几个设置: applicationId,这个是应用的包名,在google应用商店里必须是唯一的,在app的整个生命周期里是不能修改的,修改后会被认为是一个新的app minSdkVersion,设置app支持的sdk最低的版本.在google应用商店里,低于这个版本的机器是看不到这个app的 targetSdkVersion,设置app的目标

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的API向导,Java相关文档,工具文档等.Android Gradle插件相关的内容却非常的少. Android Gradle插件的主要文档在点击这里,包含了最新的信息: 用户向导非常有用,但是经常过期...(这也是这本书存在的意义): 另外一个Android 插件工具的网站是DSL Reference

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)5.1——单元测试

问题: 你想要测试app中的非android部分. 解决方案: 可以使用Android Studio1.1里面增加的单元测支持和Android的Gradle插件. 讨论: ADT插件只支持集成测试,并且要求开发者创建一个单独的测试项目.转化到Android Studio和Gradle的其中一个好处就是支持在android项目内进行测试. 在AndroidStudio1.1之前和相关的Gradle插件,这些测试仍然被限制集成测试,意味着,你需要一个模拟器或者连接的设备才能进行测试.集成测试可以非常

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.3——用Eclipse ADT导出App

问题: 想在一个已经存在的Eclipse ADT的项目中使用Gradle 解决方案: Eclipse ADT插件可以帮助生成Gradle文件 讨论: Eclipse的ADT插件是在2013年推出Gradle之前主要的android开发工具.现在ADT项目被android studio所替代,但是还是有遗留的项目存在. ADT插件可以基于已经存在的项目结构和依赖帮你生成gradle的配置文件. 虽然这已经不是一个主流的机制,但是实践中会遇到这样的项目.这也是一个很好地机会,展示Gradle中的so

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.3——整合resource文件

问题: 想要在product的flavor里面改变图片,文字或者其它资源. 解决方案: 在flavor里面增加合适的资源目录,并且改变他们包含的值. 讨论: 考虑下3.2章的"hello world with attitude"应用,它定义了三个flavors:arrogant,friendly和obsequious.在每个情况下,app提示用户输入姓名,并且用这个姓名欢迎用户.每个的java代码都是相同的,但是看上去和感觉上好像每个都不一样. product的flavors在grad

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.1——使用Build Types

问题: 你想要自定义debug和release的build types,并且新建一些新的types. 解决方案: 使用buildTypes块配置build types. 讨论: build type决定了app如何被打包.默认的,android的gradle插件支持两种build type:debug和release.两种都在模块的build.gradle文件中的buildTypes块下定义.在新的项目下的buildTypes块如下: 例子中值显示了release的build,但是想要编辑默认配