转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958
本文出自【赵彦军的博客】
自定义 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 , 每天推送优质技术文章,欢迎关注