不得不学之「 Gradle」 ③ 构建脚本基础

其实学到这里,对于 AndroidStudio 里的 Gradle 还是不懂, 好多东西见过 ,可是 不知道具体是干啥的,所以学好基础,到后面再看 Android Gradle 就很简 单了 。我 们接着学习基础。

带着疑问去学习。

  • 什么是 Settings 文件?
  • 什么是 Build 文件?
  • 什么是 Project?
  • 什么是 Task?

我们在 Gradle 中会经常看到根目录下有个 settings.gradle

image

一、setting.gradle

settings.gradle 的作用是为了设置子工程,因为在 Gradle 的多工程是通过工程树来表示的,其实和 AndroidStudio 中的 project 和 Module 的概念差不多,根工程就是 project,子工程就是 module。

一个子工程只有在 Settins 文件中配置了才会被 Gradle 识别,也就是才会在构建的时候被包含进去。

rootProject.name = 'mopub-android'
include ':mopub-sdk', ':mopub-sample', ':mopub-sdk:mopub-sdk-base', ':mopub-sdk:mopub-sdk-banner',
        ':mopub-sdk:mopub-sdk-interstitial', ':mopub-sdk:mopub-sdk-rewardedvideo',
        ':mopub-sdk:mopub-sdk-native-static', ':mopub-sdk:mopub-sdk-native-video'

这里是为子项目指定默认的目录,我们也可以手动指定目录。

include ':mopub-sdk'
project (':mopub-sdk').projectDir = new File(rootDir,'mopub/mopub-sdk')

二、build.gradle

每一个 Project 都会有一个 build.gradle ,这是该 Project 构建的入口,在这里对 Project 进行配置,比如依赖哪的库啊,依赖哪个插件啊。

虽然每个 Project 都有一个 build.gradle 但是 Root Project 是老大,可以获取到所有 Child Project ,所以在 Root Project 的 build.gradle 中可以对 Child Project 统一进行配置。比如所有的 Child Project 的仓库为 jcenter,这样我们依赖的 jar 就可以直接从 jcenter 中下载了。

buildscript {
    repositories {
        jcenter()
        google()
    }
    ...
}

Child Project

apply plugin: 'java-library'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.google.auto.service:auto-service:1.0-rc4'
    implementation 'com.squareup:javapoet:1.11.1'
    implementation project(path: ':router_annotation')
}

3、Projects 和 Tasks

多 Project 其实是为了更好的拆分,低耦合、高聚合,一个项目可以由多个 project 组成,一个 Project 又可以由多个 Task 组成。

比如编译一次 Java 代码,上传到 JCenter,打包成 aar 等等都是任务。

image

4、Task。

//文件名为 custom.gradle
ask customTask{
    doFirst{
println ':customTask:doFrist'
    }
    doLast{
println ':customTask:doLast'
    }
}
image

5、任务依赖

task Buying  {
    doLast{
    println 'Buying:买菜'
}
}
task Washing(dependsOn: Buying){
    doLast{
println 'Washing:洗菜'
    }
}
task Cook(dependsOn: Washing){
    doLast{
println 'Cook:做饭'
    }
}
image

6、任务间通过 API 控制、交互

名称有点拗口,其实意思就是,比如我们写了一个 Task ,其实这个 Task 就和我们定义的其他变量一下,可以直接使用 Task 以及他的方法。

task exHello  {
    println '<<'
}
exHello.doFirst{
    println project.hasProperty('exHello')
    println 'doFirst'
}
exHello.doLast{
    println 'doLast'
}
image

7、自定义属性

这个我们就用的比较多了,基本都会使用到。如果需要添加额外的自定义属性,那么可以通过两种方式,一种是 ext.age 这样单独添加,一种是 ext{} 添加多个。

ext.age = 12
ext{
    phone = 123456
    address = 'beijing'
}
task exCustomProperty{  
    println phone
    println address
    println age
}

相信大家在 AS 中都用过吧,所以这个自定义属性还是用的很广泛的。跨 Project、跨 Task 等统一配置相信大家基本都搞过,没有搞过的就去搞搞。

还有一个地方挺经常用的,那就是 SourceSet,以及 使用 projectFlavors 中,都会和它打交道。

apply plugin:"java"
task exCustomProperty{
sourceSets.each{
    println " ${it.name}--${it.java.srcDirs}"
}
}

sourceSets.all{
    ext.srcDirs = null
}
 sourceSets {
        main { 
            srcDirs = ['main/src']            
        }
        test{
            srcDirs = ['test/src']
        }
 }
image

所以我们再开发中的时候,为了避免各个 module 的配置不同和免去手抖带来的 bug,所以需要统一管理一些配置信息,所以就可以 ext{},美滋滋,偷懒的利器。

8、脚本即代码,代码即脚本

这就是在 Gradle 中灵活的地方,在这个脚本文件中可以使用 Groovy、Java 以及 Gradle 的任何语法和 API,来做我们想要做的事情。在脚本里,可以定义类,内部类,导入包,定义方法,常量,接口,灵活的你想象不到,比如 我们根据时间来生成 apk 包名。

def buildTime(){
    def data = new Date()
    def formattedData = date.format('yyyyMMdd')
    return formattedData
}

划重点: 本文是完全参考 《Android Gradle 权威指南》而写,作为学习笔记使用。

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

推荐阅读更多精彩内容