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

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

时间: 2024-10-26 14:23:12

Android Gradle 自定义Task详解二:进阶的相关文章

Android Gradle 自定义Task 详解

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置.面向Java应用为主. 当前其支持的语言限于Java.Groovy.Kotlin和Scala,计划未来将支持更多的语言.基

android如何自定义TextView详解

Android控件中的TextView控件只有一个输入框,但是为了用于的操作方便我们应该实现一些功能: 1. 可以直接将内容删除的功能按钮 2. 可以记录用户以前输入的数据,同时能够将数据通过下拉显示,点击的时候实现输入 先上图: 下拉的图片没有做,所以和删除的图片使用同一个了,同志们可以直接在xml文件中更换就行了 分析: 肯定要使用自定义view来实现的,我们知道自定义view大概可以分为三类:自绘控件,组合控件,继承控件,我们这里是要进行增强的textView的功能,所以我这里使用的 是组

android dialog自定义实例详解_Android

本人工作有一个月多了.对于android很多东西,都有了新的了解或者说真正的掌握.为了让更多的像我这样的小白少走弯路,所以我会坚持将我在工作中遇到的一些比较令我印象深刻的知识点整合出来给大家(顺序是按照我工作到现在的时间来制作的,其实也是想给自己一个记录吧.记录自己一路走来以及以后的路, 至少我想找到曾经的记录都有了). 第一个需求:简单的自定义dialog 需求:创建一个dialog,该dialog具备以下功能: 1.有一个窗口可以显示文章 2.根据需求显示 1)点击同意(不同意),触发对应的

android dialog自定义实例详解

本人工作有一个月多了.对于android很多东西,都有了新的了解或者说真正的掌握.为了让更多的像我这样的小白少走弯路,所以我会坚持将我在工作中遇到的一些比较令我印象深刻的知识点整合出来给大家(顺序是按照我工作到现在的时间来制作的,其实也是想给自己一个记录吧.记录自己一路走来以及以后的路, 至少我想找到曾经的记录都有了). 第一个需求:简单的自定义dialog 需求:创建一个dialog,该dialog具备以下功能: 1.有一个窗口可以显示文章 2.根据需求显示 1)点击同意(不同意),触发对应的

android进程与线程详解

并且已经存在这个应用的线程了(因为有这个应用程序的另一个组件已经运行了),于是这个组件就会在这个已有的进程中启动并且运行在同一个线程中.然而,你完全可以安排不同的组件运行于不同的进程,并且你可以为任何程序创建另外的线程. 进程 默认下,同一个程序的所有组件都运行在同一个进程中并且大多数程序不必改变这一状况.然而,如果你非要与众不同,也可以通过修改manifest文件实现. manifest文件中的所有支持android:process属性的那些项(<activity>,<service&

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

  [Android布局学习系列]   1.Android 布局学习之--Layout(布局)详解一   2.Android 布局学习之--Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之--LinearLayout的layout_weight属性   4.Android 布局学习之--LinearLayout属性baselineAligned的作用及baseline      Layout Parameters(布局参数):            在XML文

《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

6.4 Android NFC P2P开发进阶 Android NFC开发实战详解 本节将介绍Android API 16+中引入的针对NFC P2P功能开发的新功能--文件传输进行介绍.该功能包括setBeamPushUrisCallback和setBeamPushUris两个方法.通过本节的介绍,大家可以结合NFC和蓝牙或WiFi很轻松的实现Android设备之间大数据(如图片.音乐等)的传输. 6.4.1 Beam实现文件传输的方法 Android4.1(Jelly Bean,Androi

Android Loader 异步加载详解二:探寻Loader内部机制

Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70259914 本文出自[赵彦军的博客] Android Loader 异步加载详解一:基础概念 Android Loader 异步加载详解二:探寻Loader内部机制 在上一篇文章中,讲解了 Loader 的基本概念.这一篇将会用实战的方式来探寻 Android Loader的内部机制.我们准备做一个 读取手

Android xmlns 的作用及其自定义实例详解

Android xmlns 的作用及其自定义实例详解 xmlns:Android="http://schemas.android.com/apk/res/android的作用是: 这个是xml的命名空间,有了他,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么是对的,什么是错的,也可以理解为语法文件.或者语法判断器什么的 这个主要作用是在运行的时候那些控件的属性都是通过它来识别的,如果上面你写错了,不会有任何问题,但是在运行的时候就会有问题,提示你没有指定宽度等什么.这个是不用联网