AndroidStudio下gradle的入门介绍与使用

news/2024/5/20 5:02:00 标签: gradle, Android, groovy
参考:
网易云加密: 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

groovycgroovy的编译命令,-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什么呢?

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

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

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


2.  gradle tasks查看任务信息

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

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


2.2 gradle build的生命周期
  • Gradle有一个初始化流程,这个时候settings.gradle会执行。
  • 在配置阶段,每个Project都会被解析,其内部的任务也会被添加到一个有向图里,用于解决执行过程中的依赖关系。
  • 然后才是执行阶段。你在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

http://www.niftyadmin.cn/n/801897.html

相关文章

windowsubuntu双系统

本文以微信公众号形式发表的&#xff0c;点击跳转。 更多精彩文章请微信扫码关注

成绩是否超出范围php,在php中输入while循环时变量超出范围

尝试在php中填充数组时遇到问题。看来&#xff0c;一旦我用mysql_fetch_assoc方法进入while循环&#xff0c;我无法填充我的数组。我已经包含下面的代码。$params $_REQUEST[params];$arr["status"]"ok";$projectsarray();$filesarray();$titlesarray();$…

python3实现微信自动聊天

目前微信官方禁止网页登录&#xff0c;本项目暂时不能运行了 看这个链接可以帮助到你吗 准备工作&#xff1a; ①两个微信号&#xff08;A添加B&#xff0c;备注B为Girl&#xff09; ②python编辑器&#xff08;推荐pycharm&#xff09; ③wxpy库&#xff08;三种方式安装&…

python return的理解,Python return语句

Python return语句Python return语句教程在如果 return 语句使用在普通的如果 return 语句使用在Python return语句详解语法def fun():# do somethingreturn说明使用 return 语句&#xff0c;终止函数 fun 的执行。案例使用return语句&#xff0c;终止函数执行使用 return 语句…

leetcode-176. Second Highest Salary

Difficulty Easy Description Write a SQL query to get the second highest salary from the Employee table. —------- | Id | Salary | —------- | 1 | 100 | | 2 | 200 | | 3 | 300 | —------- For example, given the above Employee table, the query should retu…

python循环成本,更少循环?看看这3个Python函数

全文共1146字&#xff0c;预计学习时长5分钟请点击图源&#xff1a;wired诞生于1991年的Python&#xff0c;这几年突然火了。简历上有了Python&#xff0c;就业竞争力瞬间提升&#xff0c;甚至一些小学教材上都出现了Python内容。这种语言的热度超过了以往任何时候。作为21世纪…

Android安卓破解之逆向分析SO常用的IDA分析技巧

参考&#xff1a;网易云加密&#xff1a;http://apk.aq.163.com网易云捕&#xff1a;http://crash.163.com1、结构体的创建及导入&#xff0c;结构体指针等。以JniNativeInterface, DexHeader为例。 解析Dex的函数如下&#xff1a;F5后如下&#xff1a;File->load file->…

Fibonacci数列(C++版)

规律&#xff1a; a[0] 1; a[1] 1; a[i] a[i-2] a[i-1];代码演示&#xff1a; #include <iostream> using namespace std;int main() {int N;printf("Please input the number N:");scanf("%d",&N);while(N<2){cout<<"Pleas…