AndroidStudio下gradle的入门介绍与使用

参考:

网易云加密http://apk.aq.163.com

网易云捕http://crash.163.com

1 Groovy

Groovy 是没有类型的 Java 代码 ,语法更简洁,形式有点类似脚本语言,被gradle用于构建脚本的语言

1.1 特殊类型

1、范围

范围 是一系列的值。例如 “0..4” 表明包含 整数 0、1、2、3、4。Groovy 还支持排除范围,“0..<4” 表示 0、1、2、3。还可以创建字符范围:“a..e” 相当于 a、b、c、d、e。“a..<e” 包括小于 e 的所有值。

def range = 0..4

2、集合

def coll = ["Groovy", "Java", "Ruby"]

3、映射

def hash = [name:"Andy", "VPN-#":45]

1.2 闭包Closure

闭包是可执行的代码块。它们不需要名称,可以在定义之后执行。

1、 闭包的格式

  1. def xxx = {paramters -> code}  //或者
  2. def xxx = {无参数,纯code}  这种case不需要->符号

2、 闭包的特点

闭包在Groovy中大量使用,比如很多类都定义了一些函数,这些函数最后一个参数都是一个闭包。

Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。比如

其实标识doLast为一个函数,函数的最后一个参数为闭包

  1. doLast({
  2. println‘Hello world!‘
  3. })

有了圆括号,你会知道 doLast只是把一个Closure对象传了进去。很明显,它不代表这段脚本解析到doLast的时候就会调用println ‘Hello world!‘ 。

但是把圆括号去掉后,就感觉好像println ‘Hello world!‘立即就会被调用一样!

举例:闭包用于迭代

def acoll = ["Groovy", "Java", "Ruby"]

acoll.each{
 println it
}

闭包中的 it 变量是一个关键字,指向被调用的外部集合的每个值
— 它是默认值,可以用传递给闭包的参数覆盖它。

1.3 groovy脚本的实质

既然是基于Java的,Groovy会先把xxx.groovy中的内容转换成一个Java类。比如:

test.groovy的代码是:

  1. println ‘Groovy world!‘

Groovy把它转换成这样的Java类:

执行 groovyc-d classes test.groovy

groovyc是groovy的编译命令,-d classes用于将编译得到的class文件拷贝到classes文件夹下

2 Gradle

Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。 用于自动化构建、测试、发布打包。

2.1 基本组件

Gradle是一个框架,它定义一套自己的游戏规则。我们要玩转Gradle,必须要遵守它设计的规则。下面我们来讲讲Gradle的基本组件:

Gradle中,每一个待编译的工程都叫一个Project。每一个Project在构建的时候都包含一系列的Task。比如一个Android APK的编译可能包含:Java源码编译Task、资源编译Task、JNI编译Task、lint检查Task、打包生成APK的Task、签名Task等。

1.  gradle projects查看工程信息

到目前为止,我们了解了Gradle什么呢?

l 每一个Project都必须设置一个build.gradle文件。至于其内容,我们留到后面再说。

l 对于multi-projects build,需要在根目录下也放一个build.gradle,和一个settings.gradle。

l 一个Project是由若干tasks来组成的,当gradlexxx的时候,实际上是要求gradle执行xxx任务。这个任务就能完成具体的工作。

2.  gradle tasks查看任务信息

gradleproject-path:tasks 就行。注意,project-path是目录名,后面必须跟冒号。

对于Multi-project,在根目录中,需要指定你想看哪个poject的任务。不过你要是已经cd到某个Project的目录了,则不需指定Project-path。

2.2 gradle build的生命周期

  • l Gradle有一个初始化流程,这个时候settings.gradle会执行。
  • l 在配置阶段,每个Project都会被解析,其内部的任务也会被添加到一个有向图里,用于解决执行过程中的依赖关系。
  • l 然后才是执行阶段。你在gradle xxx中指定什么任务,gradle就会将这个xxx任务链上的所有任务全部按依赖顺序执行一遍!

(1)生命周期

eg:Single project build example

settings.gradle

println ‘This is executed during the initialization phase.‘

build.gradle

println ‘This is executed during the configuration phase.‘

task configured {
    println ‘This is also executed during the configuration phase.‘
}

task test << {
    println ‘This is executed during the execution phase.‘
}

task testBoth {
    doFirst {
      println ‘This is executed first during the execution phase.‘
    }
    doLast {
      println ‘This is executed last during the execution phase.‘
    }
    println ‘This is executed during the configuration phase as well.‘
}

(2)setting.gradle中多工程配置

其中setting.gradle在多project的配置中,用于声明包含的project及其层级关系(平坦和层级结构的project都支持)

include ‘project1‘, ‘project2:child‘, ‘project3:child1‘
includeFlat ‘project3‘, ‘project4‘

(3)根据生命周期定制task

eg:Logging of start and end of each task execution

build.gradle

task ok

task broken(dependsOn: ok) << {
    thrownew RuntimeException(‘broken‘)
}

gradle.taskGraph.beforeTask { Task task ->
    println "executing $task ..."
}

gradle.taskGraph.afterTask { Task task, TaskState state ->
    if (state.failure) {
        println "FAILED"
    }
    else {
        println "done"
    }
}

3 Gradle用途

(1)依赖管理

我们的project可能会用到其他的库(本地、maven或者ivy)

eg:Declaring dependencies

本地project依赖

dependencies {
    compile fileTree(include: [‘*.jar‘], dir: ‘libs‘)
    compile project(‘:bugrpt‘)
}

远程库依赖

apply plugin: ‘java‘

repositories {
    mavenCentral()
}

dependencies {
    compile group: ‘org.hibernate‘, name: ‘hibernate-core‘, version: ‘3.6.7.Final‘
    testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.+‘
}

标识project需要hibernate-core一起编译,project test需要junit的编译,另外一种写法group:name:version

dependencies {
    compile ‘org.hibernate:hibernate-core:3.6.7.Final‘
}

像这些外部的库,gradle是通过repository来找到的

eg:Usage of a remote Maven repository

build.gradle

repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}

eg:Usage of a local Ivy directory

build.gradle

repositories {
    ivy {
        // URL can refer to a local directory
        url "../local-repo"
    }
}

(2)版本发布

eg:发布工程

uploadArchives {
    repositories {
        ivy {
            credentials {
                username "username"
                password "pw"
            }
            url "http://repo.mycompany.com"
        }
    }
}

(3) 差异管理

比如app生成不同版本(免费,收费),适配特殊机型,多渠道等需要发多个包,最终能编译出的apk的数量是由productflavor与BuildType决定的,BuildType默认有debug和release两种

eg:免费与收费设置不同包名

productFlavors {

pay {

applicationId "me.ghui.gradledemo.pay"

}

free {}

}

eg:buildTypes 对应的不同版本

android {

    buildTypes {

        debug {

            applicationIdSuffix ".debug"

        }

        jnidebug {

            initWith(buildTypes.debug)

            packageNameSuffix ".jnidebug"

            jniDebuggable true

        }

    }

}

对于每一种buildTypes 会创建相应的ssemble<BuildTypeName>任务,比如debug会自动创建assembleDebug任务

eg:多渠道打包

4 gradle wrapper

gradlew通过包裹了gradle,然后通过配置中url下载,存储到用户目录 $USER_HOME/.gradle/wrapper/dists.

启动图形界面

gradle --gui

附录 gradle脚本基础

1 project和task

task表示构建的一次原子操作,包括编译类、创建jar包、发布到repository、生成javadoc等,而project通常包含多个task

task hello {
    doLast {
        println ‘Hello world!‘
    }
}

这个脚本定义了一个叫做hello的task,并且添加了一个action,这个action实际上是由groovy语言编写的闭包,更简洁的写法

task hello << {
    println ‘Hello world!‘
}

> gradle -q hello

Hello world!

2 task依赖

project(‘projectA‘) {
    task taskX(dependsOn: ‘:projectB:taskY‘) << {
        println ‘taskX‘
    }
}

project(‘projectB‘) {
    task taskY << {
        println ‘taskY‘
    }
}

3 可以动态创建task,并通过api操作task

4.times { counter ->
    task "task$counter" << {
        println "I‘m task number $counter"
    }
}
task0.dependsOn task2, task3

4 task可以定义属性

task myTask {
    ext.myProperty = "myValue"
}

task printTaskProperties << {
    println myTask.myProperty
}

5 设置默认

defaultTasks ‘clean‘, ‘run‘

task clean << {
    println ‘Default Cleaning!‘
}

task run << {
    println ‘Default Running!‘
}

task other << {
    println "I‘m not a default task!"
}

6 可以添加HOOK

task distribution << {
    println "We build the zip with version=$version"
}

task release(dependsOn: ‘distribution‘) << {
    println ‘We release now‘
}

gradle.taskGraph.whenReady {taskGraph ->
    if (taskGraph.hasTask(release)) {
        version = ‘1.0‘
    } else {
        version = ‘1.0-SNAPSHOT‘
    }
}

7 定位task

1)使用task的名字

println hello.name

2)使用tasks collection

println tasks.hello.name

3)使用project:task路径定位

tasks.getByPath(‘:projectA:hello‘).path

8 配置task

Configuring a task - with closure



task copy(type: Copy) {
   description ‘Copies the resource directory to the target directory.‘
   from ‘resources‘
   into ‘target‘
   include(‘**/*.txt‘, ‘**/*.xml‘, ‘**/*.properties‘)
}

参考:

gradle入门 http://www.androidchina.net/2155.html

深入理解Android之Gradle http://blog.csdn.net/innost/article/details/48228651

构建神器Gradle  http://jiajixin.cn/2015/08/07/gradle-android/

Gradle多渠道打包  http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/

gradle user guide https://docs.gradle.org/current/userguide/userguide.html

Gradle Plugin User Guide  http://tools.android.com/tech-docs/new-build-system/user-guide

精通groovy http://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html

编写gradle build脚本 https://docs.gradle.org/current/userguide/pt03.html

时间: 2024-07-31 22:50:14

AndroidStudio下gradle的入门介绍与使用的相关文章

[Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的"原图"等,此时尝试学习Phantomjs和CasperJS来解决这个问题.这第一篇文章当然就是安装过程及入门介绍. 一. 安装Phantomjs 下载地址:http://phantomjs.org/        官网介绍:          PhantomJS is a headless WebKit scriptable with a JavaScript

[Python学习] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的"原图"等,此时尝试学习Phantomjs和CasperJS来解决这个问题.这第一篇文章当然就是安装过程及入门介绍. 一. 安装Phantomjs 下载地址:http://phantomjs.org/ 官网介绍: PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fas

Android CoordinatorLayout 入门介绍

Android CoordinatorLayout 入门介绍 CoordinatorLayout View 知道如何表现 在 2015 年的 I/O 开发者大会上,Google 介绍了一个新的 Android Design Support Library,该库可以帮助开发者在应用上使用 meterial design.它包含了许多重要的 meterial design 的构建块,并且它支持 API 7及以上的版本.如果你错过了这次大会,那就请打开谷歌开发者站点来查阅它的相关信息吧:传送门. Co

Gradle从入门到放弃

1 Gradle工具的基本介绍 Java作为一门世界级主流编程语言,有一款高效易用的项目管理工具是Java开发者共同追求的心愿和目标.先是2000年的Ant,后有2004年Maven两个工具的诞生,都在Java市场上取得了巨大的成功.但是二者都有一定的不足和局限性. 2012年基于Ant和Maven产生的Gradle,弥补了Ant和Maven的不足,带来了一些更加高效的特点.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置.面向Java应用为主.当

Windows下FFmpeg高速入门

本系列文章导航 Windows下FFmpeg高速入门 ffmpeg參数解释 mencoder和ffmpeg參数具体解释(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视频文件转换成FLV整理 java 视频处理 mencoder java 视频处理 ffmped+mencoder Windows下FFmpeg高速入门 FFmpeg简单介绍 FFmpeg是什么? FFmpeg是用于录制.转换和流化音频和视频的完整解决方式, 包含 libavcodec ,一套率先

Linux入门介绍

Linux入门介绍 一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以及游戏支持度不足 Linux的应用 网络服务器 关键任务的应用(金融数据库.大型企业网管环境) 学术机构癿高效能运算任务 手持系统(PDA.手机.导航系统) 个人办公使用 Linux的吉祥物/Logo 企鹅(英文名:Tux),由来:因为Torvalds在小时候被企鹅咬过,因此印象非常深刻 在Linu

CUDA C编程入门-介绍

CUDA C编程入门-介绍 1.1.从图形处理到通用并行计算 在实时.高清3D图形的巨大市场需求的驱动下,可编程的图形处理单元或者GPU发展成拥有巨大计算能力的和非常高的内存带宽的高度并行的.多线程的.多核处理器.如图1和图2所示. 图 1 CPU和GPU每秒的浮点计算次数 图 2 CPU和GPU的内存带宽 在CPU和GPU之间在浮点计算能力上的差异的原因是GPU专做密集型计算和高度并行计算-恰好是图形渲染做的-因此设计成这样,更多的晶体管用于数据处理而不是数据缓存和流控制,如图3所示. 图 3

(转)eclipse下 gradle构建项目

原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 在 eclipse 下利用 gradle 构建系统 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI. 开发工具:Eclipse IDE for SOA Developers 版本,请到 ht

Gradle学习系列之一——Gradle快速入门(转)

这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构建多个Project 自定义Task类型 自定义Plugin 请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git 和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作