zoukankan      html  css  js  c++  java
  • Android Gradle 学习笔记(五):Gradle 任务 Task

    在之前的学习中,我们了解到Gradle的构建工作都是由Task组合完成的。本节我们就来介绍一下 Task - 任务。

    一、多种方式创建任务

    在Gradle中,我们可以有很多种方式来创建任务。为什么有这么多种方式呢?这都依赖于Project提供的快捷方法以及TaskContainer提供的相关Create方法。所以我们阅读一些Gradle脚本的时候,见到一些不熟悉的创建任务的方法也不要奇怪,一般分为以下几种方式:

    • 第一种:直接以一个任务名字创建任务。
    • 第二种:以一个任务名字+一个对该任务配置的Map对象来创建任务。
    • 第三种:任务名字+闭包配置。
    • 第四种:任务名字+Map参数+闭包。
    • 第五种:使用TaskContainer创建任务,调研tasks.create方法创建任务。

    二、多种方式访问任务

    其实我们在之前的学习的例子中,我们已经通过了一些方式访问了任务。下面我们整理一下相关的方式:

    • 第一种:我们创建的任务都会作为项目(Project)的一个属性,属性名就是任务名,所以我们可以通过该任务名称访问和操作该任务。
    • 第二种:任务都是通过TaskContainer创建的,TaskContainer就是我们创建任务的集合,在Project中我们可以通过tasks属性访问TaskContainer,所以我们可以以访问集合元素的方式访问我们的任务。
    • 第三种:通过路径访问。方式有两种:get & find,区别在于get的时候找不到就会抛出UnknownTaskException异常,而find在找不到任务的时候会返回null。
    • 第四种:通过名称访问。通过名字的访问也有两种:get & find,它们的区别和上面第三种介绍的一样。

    值得强调的是,通过路径访问的时候,参数可以是任务路径也可以是任务的名字。但是通过名字访问的时候,参数值只能是任务的名字,不能为路径。

    三、任务排序

    其实并没有真正的任务排序功能,这个排序不像我们想象的通过设置优先级或者Order顺序实现,而是通过任务的shouldRunAfter和mustRunAfter这两个方法,它们可以控制一个任务应该或者一定在某个任务之后执行。通过这种方式,你可以在某些情况下控制任务的执行顺序,而不是通过强依赖的方式。

    这个功能是非常有用的,比如我们设置的顺序是,必须先执行单元测试,然后才能进行打包,这就保证了App的质量。类似的情况还有很多,比如必须要单元测试之后,才能进行集成测试,打包成功之后才能进行部署发布等。

    举例说明:

    • taskB.shouleRunAfter(taskA):表示taskB应该在taskA执行之后执行,这里的应该而不是必须。所以有可能任务顺序并不会按预设的执行。
    • taskB.mustRunAfter(taskA):表示taskB必须在taskA执行之后执行,这个规则相对更加严格。

    四、任务的onlyIf断言

    断言就是一个条件表达式。Task有一个onlyIf方法,它接受一个闭包作为参数,如果该闭包返回true,则该任务执行,否则就跳过。这有很多用途,比如控制程序哪些情况下打什么包,什么时候进行单元测试,什么情况下执行单元测试的时候不执行网络测试。

    下面我们以一个打首发包的例子来说明:

    final String BUILD_APPS_ALL="all";
    final String BUILD_APPS_SHOUFA="shoufa";
    final String BUILD_APPS_EXCLUDE_SHOUFA="exclude_shoufa";
    
    task ex48QQRelease << {
        println "打应用宝的包"
    }
    task ex48BaiduRelease << {
        println "打百度的包"
    }
    task ex48HuaweiRelease << {
        println "打华为的包"
    }
    
    task ex48MiuiRelease << {
        println "打Miui的包"
    }
    
    task build {
        group BasePlugin.BUILD_GROUP
        description "打渠道包"
    }
    
    build.dependsOn ex48QQRelease,ex48BaiduRelease,ex48HuaweiRelease,ex48MiuiRelease
    
    ex48QQRelease.onlyIf {
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APPS_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = true
        }
        execute
    }
    
    ex48BaiduRelease.onlyIf {
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APPS_SHOUFA.equals(buildApps)
                    || BUILD_APPS_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = true
        }
        execute
    }
    
    ex48HuaweiRelease.onlyIf {
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
                    || BUILD_APPS_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = true
        }
        execute
    }
    
    ex48MiuiRelease.onlyIf {
        def execute = false;
        if(project.hasProperty("build_apps")){
            Object buildApps = project.property("build_apps")
            if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
                    || BUILD_APPS_ALL.equals(buildApps)){
                execute = true
            }else{
                execute = false
            }
        }else{
            execute = true
        }
        execute
    }

    在例子中,我们定义了4个渠道,其中百度和应用宝是首发包,另外两个华为和MiUi不是首发包,通过build_apps属性来控制我们要打哪些渠道包。

    通过这种方式,我们在进行一些相关流程控制上会更加灵活。这在我们使用JenKins等CI工具进行自动化打包和部署的时候就能很好的体现出来。

    五、多渠道打包(补充资料)

    1.Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道):https://www.jianshu.com/p/533240d222d3

    2.Android Gradle 多版本多APK打包,修改生成APK名称:https://blog.csdn.net/aiynmimi/article/details/68944830

  • 相关阅读:
    HTTPS缓存
    URL中“#” “?” &“”号的作用
    HTML5开发使用Eclipse通过WIFI调试Android程序
    JS判断鼠标是否在三角形内
    html5开发全屏android软件
    修改织梦自动摘要字数
    HTML5移动开发添加APP启动画面
    AJAX读取模板文件并替换模板中的标签
    感慨一下,2001年的游戏在win8上运行正常!
    PC端利用Xshell连接Android上的Termux
  • 原文地址:https://www.cnblogs.com/renhui/p/10904382.html
Copyright © 2011-2022 走看看