Gradle基本认识及理解


date: 2016-12-09 16:39:53

A build system that we think is a quantum leap for build technology in the Java (JVM) world.
gradle是java编译技术领域中一个跨越性飞跃。

Hello gradle!

Gradle是什么?

gradle首先可以理解为一个项目构建工具,或者理解深入点,是一种编程框架,安卓项目最流行的也是google官方推荐的安卓项目编译工具。官方介绍如下:

可见gradle有多么高的认可度,所以是值得java程序员特别android程序员熟练掌握并应用的一项技能!

Gradle 强大再哪里?为何选择她?

优势(gradle provides):

  • 比ant, maven更加灵活强大且简单的构建能力
  • 强大(powerful support)的多项目(multi-project)编译支持
  • 强大的项目依赖关系管理
  • 完善的maven 库支持(repository infrastructure)
  • 简单强大的Groovy语言
  • 技术成熟,可以处理大规模构建
  • 可定制插件(plugin),自定义能力强
  • 总之,是java程序员首先编译工具~

Gradle安装及环境部署

安装

下载地址:https://gradle.org/gradle-download/?_ga=1.168710433.1636299837.1479991326

文档位置:https://docs.gradle.org/current/userguide/installation.html

下载后解压到制定pc位置,然后配置环境变量即可。
当然也可以用sudo apt来安装,免去手动配置环境变量。

Gradle Wrapper

Gradle的本地包装,可以省去在PC上安装gradle.Google 推出了 Gradle Wrapper 的概念,就是他在你每个项目都配置了一个指定版本的 Gradle ,你可以理解为每个 Android 项目本地都有一个小型的 Gradle ,通过这个每个项目你可以支持用不同的 Gradle 版本来构建项目,这样wrapper跟随项目同步保存,就可以在其他pc机器上免安装gradle,并且用统一的gradle版本。。

如何创建自己的gradlw wrapper?

先在自己项目下添加 build.gradlw 文件

task createWrapper( type: Wrapper){
    gradleVersion = '2.1-preview-1'
}

执行 gradle cW 就生成了我们想要的wrapper,目录结构及代码如下图:

wrapper.png

项目结构基本认识

Gradle项目有两个概念,project和task, Project为一个项目,Task为一次构建任务中的一个个别任务,Task是隶属与project的,每次build可以有多个project. Gradle以module为单位来管理project.

这里我们已一个安卓项目来说明gradle的基本项目构建结果。

Gradle管理的Android项目基本结构

project.png

一个项目的根目录下放置了整个项目构建的相关配置,除了gradle wrapper相关文件外,放置了整个项目的相关配置。

app目录为项目主目录,主项目module放在里面,submodule目录下可以放多个附属项目。每个module项目根目录有个build.gradle文件,定义了该module是如何编译的。

1 settings.gradle为整个项目的多个module配置,如:

include ':App', ':WaveProgress'
include ':SwitchButton'

project(':SwitchButton').projectDir = new File('submodules/SwitchButton')
project(':WaveProgress').projectDir = new File('submodules/Waveprogress/app')

如何各个module的根目录即为整个项目的根目录,则不用指定projectDir.

2 local.properties 为放置本地pc相关配置路径,如相关sdk保存路径,此文件无需同步保存。

ndk.dir=/home/android-sdk-linux/ndk-bundle
sdk.dir=/home/android-sdk-linux

3 gradle.properties 为gradle设置或赋值一些变量

## Project-wide Gradle settings.
#
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
#
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
#Thu Jan 21 20:02:21 CST 2016
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8118

4 根目录下build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

这里定义了整个项目的相关全局变量及引用,默认android项目会在这里引用jcenter()代码仓库。gradle有三种仓库可以在这里设置,maven ivy 及本地 flat仓库。

maven{
    url '...'
    }
ivy{
    url '...'
    }
flatDir{
    url '...'
    }

当然这些仓库可以定义别名,直接引用别名更方便如:

 repositories {
        jcenter()
    }

有些场景maven也需要引用本地库,如java项目中引用一些android库。maven也可以设置m2repository目录,如:

    maven {
        url "/home/android-sdk-linux/extras/android/m2repository"
    }

5 android编译文件build.gradle

//添加插件
apply plugin: 'com.android.application' //安卓项目插件
apply plugin: 'com.neenbedankt.android-apt' //可以添加多个插件

android {
    compileSdkVersion 24 //编译版本
    buildToolsVersion deps.bTVersion //编译工具版本
    defaultConfig { //项目默认配置,会应用到buildTypes相关版本上
        applicationId "com.canking.bind.cxinjectdemo"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    buildTypes {//编译版本控制,可以配置多个
        release {
            minifyEnabled false //混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {//依赖模块
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile deps.supportCompat
    compile deps.supportv7

    testCompile 'junit:junit:4.12'
    compile project(':bindview')
    compile project(':annimationlib')
    apt project(':javabind')
}

Gradle任务

gradle的安卓插件提供了4个定级任务:

assemble 构建项目输出
check 运行检测和测试任务
build 为assemble和check接合体
clean 清理任务

定级任务回合buildTypes中不同版本组合为新的不同任务。
如:

./gradlew assembleDebug

细心的同学会在介绍Gradle Wrapper的时候发现,gradle命令是支持首字母简写的,如:

gradlw cW
./gradlw aD

通过 gradle tasks 可以查看项目多有的task任务。

tasks.png

问题

gradle项目编译如何自定义化,比如项目build.gradle如何扩展,如何如自己打包逻辑等待,想掌握这些技能就需要学习gradle的编写语言Groovy,更灵活的构建系统,帮助我们构建更复杂的项目。
所有,下节将一起学习Groovy语音的基础,深入了解Gradle.

作者主页:http:www.canking.win

Github:https://github.com/CankingApp

新浪:http://weibo.com/canking666

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,748评论 6 342
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 前言 从2013年Google推出Android Studio(后面以AS简称)开始,到现在已经历经3年,版本也发...
    dfqin阅读 1,825评论 1 3
  • 文 | 叶水送 ●●● 2016年1月14日,《知识分子》主编、北京大学终身讲席教授饶毅获颁《第一财经》“年度思想...
    知识分子阅读 397评论 0 1
  • 不是夕阳落山眼前就升起黑暗 而是一点心魔 就如堕地狱 这一点心魔,是贪,是嗔,是痴 坐落于心间 将心城笼罩 这一点...
    王错错阅读 167评论 0 2