转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958
本文出自【赵彦军的博客】

系列目录

Android Gradle使用总结
Android Studio 插件开发详解一:入门练手
Android Studio 插件开发详解二:工具类
Android Studio 插件开发详解三:翻译插件实战
Android Studio 插件开发详解四:填坑
Android Gradle 自定义Task 详解
Android Gradle 自定义Task详解二:进阶

自定义 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 依赖 assembleRelease
copyFile.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 , 每天推送优质技术文章,欢迎关注

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZiZuYH8-1604565055028)(http://o7rvuansr.bkt.clouddn.com/weixin200.jpg)]

Android Gradle 自定义Task详解二:进阶相关推荐

  1. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  2. android自定义task,Android Gradle 自定义Task 详解

    一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...

  3. android定义 task,Android Gradle 自定义Task 详解

    一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...

  4. PopUpWindow使用详解(二)——进阶及答疑

    相关文章: 1.<PopUpWindow使用详解(一)--基本使用> 2.<PopUpWindow使用详解(二)--进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

  5. Android面试Hash原理详解二

    Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...

  6. android camera 3d特效 详解与进阶

    1 概述 本篇主要讲解camera,这里的camera并不是照相相关的类,而是android.graphics.Camera,这个类中封装了一个matrix,不熟悉的同学可以看前面的文章来了解.and ...

  7. Android之自定义ContentProvider详解

    第一个版本  对android中MIME类型的理解 初始MIME类型,是在学习ContentProvider的时候. 当在创建自己的ContentProvider的时,需要从抽象类ContentPro ...

  8. android 开发框架 怎么使用,Android快速开发框架dyh详解(二)---控件层的使用

    1.控件组合 1.1.ViewPager + Fragment, 这两个控件的组合在项目里也是比较常用的,效果同ViewPager,但由于是用Fragment所以可以使代码操作起来更方便: 1.1.1 ...

  9. android自定义dialog 例子,android dialog自定义实例详解

    本人工作有一个月多了.对于android很多东西,都有了新的了解或者说真正的掌握.为了让更多的像我这样的小白少走弯路,所以我会坚持将我在工作中遇到的一些比较令我印象深刻的知识点整合出来给大家(顺序是按 ...

最新文章

  1. python 数字循环
  2. 浅析C#基于TCP协议的SCOKET通信
  3. 数据结构:链表(c语言)
  4. C++编程笔记:C++用new与不用new创建对象的区别
  5. 6 追前沿,领略SET化架构衍化与设计
  6. 测试 JavaScript 函数的性能
  7. v-infinite-scroll懒惰加载
  8. U盘启动盘 U盘安装Win10系统图文教程
  9. 新体育杂志新体育杂志社新体育杂志社新体育编辑部2022年第8期目录
  10. 钢铁少女 无限钻石安卓版下载 和 源代码部署成功
  11. 00001-微信小游戏--显示图片
  12. 解决pip装包报错ERROR: Cannot unistall ‘llvmlite‘. It is a distutils installed project and thus we cannot..
  13. 通过面积证明:两个函数相乘 / 相除的导数为什么长成这样?
  14. DFRobot离线语音识别模块真实测评
  15. 对接阿里云opensearch
  16. 设置主菜单背景显示为壁纸
  17. 路由器wan和lan口
  18. ¥3EG踩坑记录¥Vitis HLS xfopencv库的安装解决minGW32-make 编译opencv时 error
  19. 点击的时候直接跳转到 微信界面
  20. java saas_una-saas-toturial-master

热门文章

  1. php+中午截取,PHP_php字符串截取中文截取2,单字节截取模式,//中文截取2,单字节截取模式 - phpStudy...
  2. java关键字及其作用解释_java 常见关键字及其作用
  3. html密码框不显示,密码框中密码的显示与隐藏切换(JS)
  4. 北京内推 | 京东推荐招聘内容推荐研发工程师(2022届校招)
  5. Self-training在目标检测任务上的实践
  6. 报名 | TensorFlow China Roadshow 正式开启
  7. 使用PaddleFluid和TensorFlow实现图像分类网络SE_ResNeXt | 文末超大福利
  8. 报名 | “阳奉阴违”的半监督学习算法 - Virtual Adversarial Training
  9. LeetCode 罗马数字与阿拉伯数字的转换
  10. matlab 变长参数,变长参数函数的概念