关闭

Android Gradle 自定义Task详解二:进阶

标签: androidgradle赵彦军zhaoyanjungradle-tas
439人阅读 评论(4) 收藏 举报
分类:

转载请标明出处: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 , 每天推送优质技术文章,欢迎关注

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Gradle学习系列之九——自定义Task类型

在本系列的上篇文章中,我们学习了多Project构建,在本篇文章中,我们将学到如何自定义Task类型。     请通过以下方式下载本系列文章的Github示例代码: git clon...
  • caomiao2006
  • caomiao2006
  • 2016-04-24 17:20
  • 792

Gradle学习系列之九——自定义Task类型

在本系列的上篇文章中,我们学习了多Project构建,在本篇文章中,我们将学到如何自定义Task类型。     请通过以下方式下载本系列文章的Github示例代码: git clon...
  • caomiao2006
  • caomiao2006
  • 2016-04-24 17:20
  • 792

Gradle 自定义Task 打Jar包

之前的ADT为eclipse,所以对外提供jar时候,直接Export,选中src目录输出就可以了。但切到AS中的时候,就一直很啰嗦。所以,趁着晚上无聊,就研究了一下Gradle的Jar包的输出。 可...
  • qq_15364915
  • qq_15364915
  • 2016-08-09 23:14
  • 7337

gradle学习笔记之hook task

这周在项目中加入hotfix功能,在gradle下需要在构建流程中嵌入代码注入的处理,用到了hook task(在已有插件Taskgraph中嵌入自定义task),参考ReactNative的reac...
  • yuanjw2014
  • yuanjw2014
  • 2017-01-07 19:58
  • 1481

android gradle编译,各个task拆分解析

android gradle编译,各个task拆分解析首先看如下编译命令对应的各个task gradle clean assembleDebug -x lint check –stacktrace ...
  • zhaofuchang321
  • zhaofuchang321
  • 2017-02-06 14:13
  • 1428

自定义Gradle插件(二)

上一篇博客已经介绍了如何实现简单的自定义gradle插件,今天介绍如何自定义Task。 一、自定义Task          1、直接沿用上一篇的代码,copy一份改名CustomPluginTask...
  • liuhongwei123888
  • liuhongwei123888
  • 2016-01-19 14:47
  • 6439

Gradle 创建Task的多种方法

Gradle的Project从本质上说只是含有多个Task的容器,一个Task与Ant的Target相似,表示一个逻辑上的执行单元。我们可以通过很多种方式定义Task,所有的Task都存放在Proje...
  • y874961524
  • y874961524
  • 2017-03-12 17:38
  • 954

Gradle task简单使用

还望支持个人博客站:http://www.enjoytoday.cntask是什么task是gradle构建脚本的最小运行单元,我们通过在gradle脚本中创建task任务,以期完成某个特定的功能,t...
  • chf1142152101
  • chf1142152101
  • 2017-05-31 11:15
  • 763

自己动手应用Groovy实现Gradle的DSL(一) Task定义

通过Groovy语法构建Gradle的DSL
  • Hello__Zero
  • Hello__Zero
  • 2016-09-02 16:10
  • 739

Gradle Task基本知识

本文内容是参考http://android.jobbole.com/81485/整理得来的。 1:gradle脚本是使用groovy语言写的(DSL),groovy中有一个重要的概念闭包(Closu...
  • xueshanhaizi
  • xueshanhaizi
  • 2015-11-01 12:38
  • 4296
    个人资料
    • 访问:97843次
    • 积分:1557
    • 等级:
    • 排名:千里之外
    • 原创:251篇
    • 转载:2篇
    • 译文:0篇
    • 评论:16条
    联系我
    QQ交流群:431048982
    个人公众号:zhaoyanjun125 ,欢迎关注
    上海鲜花港 - 郁金香
    博客专栏
    最新评论