博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Gradle 自定义Task详解二:进阶
阅读量:6860 次
发布时间:2019-06-26

本文共 2720 字,大约阅读时间需要 9 分钟。

转载请标明出处:

本文出自

自定义 Task 参数传递

下面我们定义一个 hello task

task hello <<{    println "++++名字:" + ( project.hasProperty('yourName')? yourName : "赵彦军")    println "++++名字" + project.getProperties().get("yourName")    println "++++年龄:" + ( project.hasProperty('yourAge')? yourAge : "20")    println "++++年龄" + project.getProperties().get("yourAge")}

运行 hello task :

gradlew hello -PyourName=张三 -PyourAge=18

效果如下:

++++名字:张三+++名字张三++++年龄:18++++年龄18

在代码里面分别用了 project.hasProperty(‘yourName’)和 project.hasProperty(‘yourAge’) 来判断是否有这个参数。如果没有参数,就会用默认的参数值。

传参就是在后面加上 -P参数,-P 后面再加上要传入的键值对,中间用 = 号连接,需要什么参数就传什么参数,如果有其他需要也可以自定义加入。

Mapping 文件的保存

通常我们在打包的时候,会开启混淆。开启混淆会产生 mapping 文件。mapping 文件存在的目录如下图所示:

这里写图片描述

mapping 文件其实就是所混淆的类名前后对照,为了以后查看方便,我们需要在每次打包完成后把 mapping 文件存储起来。

我的思路是,每次打包完成后,执行一个 task ,这个 task 的功能就是把 mapping 文件拷贝到电脑 d 盘的一个 mappings 文件夹。

第一种实现方法

新建 copyFile task 如下图所示:

build.gradle

//自定义task,复制文件 task copyFile(type: Copy){    from '../app/build/outputs/mapping'    into "d:/mappings"}

在命令行终端运行 :

gradlew assembleRelease copyFile//或者使用简写//gradlew aR cF

效果如下

这里写图片描述

第二种实现方式

我们还需要这个 copyFile 在打包完后执行,下面开始建立 copyFile 的依赖关系。如下所示

build.gradle

//自定义task,复制文件 task copyFile(type: Copy){    from '../app/build/outputs/mapping'    into "d:/mappings"}//copyFile 依赖 assembleReleasecopyFile.dependsOn assembleRelease

但是我们已同步 build.gradle 就会报错,错误如下:

这里写图片描述

问题就在 assembleRelease 这个 task 是根据 build.gradle 里面的配置情况动态生成的,没有办法提前设定 assembleRelease 的依赖关系。不过这个问题是很好解决的,用 tasks 的 whenTaskAdded 方法,具体实现如下:

build.gradle

//自定义task,复制文件 task copyFile(type: Copy){    from '../app/build/outputs/mapping'    into "d:/mappings"}//在task被添加的时候定义依赖关系tasks.whenTaskAdded {      task ->        if (task.name.equals("assembleRelease")) {            copyFile.dependsOn assembleRelease        }}

这次再点击同步按钮,代码正常同步完成,没有报错。我们直接运行 copyFile task ,如下所示

gradlew copyFile

根据依赖关系我们知道当运行 copyFile 任务的的时候 ,会先执行 assembleRelease 任务。依赖关系如下图所示:

这里写图片描述

效果如下:

这里写图片描述

如下,我们已经完成了对 mapping 文件的保存任务。


apply

apply plugin 应用插件

如果是 app

build.gradle

apply plugin: 'com.android.application'

如果是 library 库

build.gradle

apply plugin: 'com.android.library'

apply from 应用其他的 .gradle 文件

在上一个模块,我们在 app 的 build.gradle 里面创建了一个复制文件的 task , 如下所示:

build.gradle

//自定义task,复制文件 task copyFile(type: Copy){    from '../app/build/outputs/mapping'    into "d:/mappings"}

如果我们的需求非常复杂的情况下, 这个 build.gradle 里面的就会充斥这很多自定义的 task ,非常的不美观。为了解决这个问题,我们可以把 copyFile task 单独的抽出一个文件就叫 util.gradle , 如下图所示:

这里写图片描述

那么如何用 util.gradle 呢?

在 app 的 build.gradle 用

// ../代表根目录apply from:"../util.gradle"

这样在 build.gradle 就可以用 copyFile task 了,具体实现如图所示

apply from:"../util.gradle"//在task被添加的时候定义依赖关系tasks.whenTaskAdded {    task ->        if (task.name.equals("assembleRelease")) {            copyFile.dependsOn assembleRelease        }}

个人微信号:zhaoyanjun125 , 每天推送优质技术文章,欢迎关注

你可能感兴趣的文章
混合云?行业云?“合脚”的才是好用的云
查看>>
Talos实验室深入我国DDoS黑市DuTe 揭露各种DDoS团伙、平台、工具及攻击
查看>>
明略数据首发"明智系统" 吴明辉:从个体附能到全局智能
查看>>
云计算带给SaaS的机遇
查看>>
掘金全球最大商务差旅市场 SAP旗下Concur联合中数通进军中国
查看>>
《PIC微控制器项目设计:C语言》一1.3 总结
查看>>
程序员父亲的遗产——编程十诫
查看>>
不可不知的NAT网关的防火墙功能
查看>>
《机械制造业智能工厂规划设计》——2.2 智能工厂设计需求分析
查看>>
关于Vue.js的响应式原理
查看>>
云运维管理专项评估标准将在可信云大会推出
查看>>
大变样:Firefox新一代UI “Photon”设计曝光
查看>>
云计算、IoT和SDN为企业网带来最大的问题
查看>>
云趋势下的Windows平台:生存并快乐着
查看>>
不要再在JavaScript中写 CSS了
查看>>
Gartner:云安全进入高速发展期
查看>>
云存储能否成为数据安全灵药?几个角度全方位剖析
查看>>
未来几年SDN将进一步提升云服务利润率
查看>>
手把手教你用 Python 和 Scikit-Learn 实现垃圾邮件过滤
查看>>
Hinton亲自讲解迄今未发表工作:胶囊理论的核心概念到底是什么?
查看>>