在build.gradle中学习Gradle

applyplugin:'com.android.application' 

android {

compileSdkVersion26

    buildToolsVersion"26.0.2"

    defaultConfig {

applicationId"com.study.gradle.gradledemo"

        minSdkVersion15

        targetSdkVersion26

        versionCode1

        versionName"1.0"

        testInstrumentationRunner"android.support.test.runner.AndroidJUnitRunner"

    }

buildTypes {

release {

minifyEnabledfalse

            proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'

        }

}

}

dependencies {

compile fileTree(dir:'libs',include: ['*.jar'])

androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

excludegroup:'com.android.support',module:'support-annotations'

    })

compile'com.android.support:appcompat-v7:26.0.0-alpha1'

    testCompile'junit:junit:4.12'

}

/*Task对象  Extension对象  Project对象  Gradle对象  闭包  方法*/

/*--------------------------------------------------------Plugin  插件------------------------------------------------------*/

//自定义插件,Extension  --》插件(Project)---》Task

applyplugin: GreetingPlugin

class GreetingPluginimplements Plugin {

void apply(Project project) {

//通过插件在Project中添加任务Task对象,在任务执行的完毕后执行闭包中的代码。

        project.task('testpluging') {

doLast {

println"helloworld from the GreetingPlugin"

                def android = project.extensions.getByType(com.android.build.gradle.AppExtension)

//可以看出就是遍历集合把对象传递给闭包。

                android.applicationVariants.all { variant ->

def appID = variant.generateBuildConfig.appPackageName

def variantData = variant.variantData

def scope = variantData.scope

String generateBuildConfigTaskName = variant.getVariantData().getScope().getGenerateBuildConfigTask().name

println"appID:" + appID

println"scope:" + scope

println"generateBuildConfigTaskName:" + generateBuildConfigTaskName

}

}

}

//在创建任务对象的时候就执行闭包中的代码。

        project.task("testpluging1", {

def android = project.extensions.getByType(com.android.build.gradle.AppExtension)

//可以看出就是遍历集合把对象传递给闭包。

            android.applicationVariants.all { variant ->

def appID = variant.generateBuildConfig.appPackageName

def variantData = variant.variantData

def scope = variantData.scope

String generateBuildConfigTaskName = variant.getVariantData().getScope().getGenerateBuildConfigTask().name

println"appID1:" + appID

println"scope1:" + scope

println"generateBuildConfigTaskName1:" + generateBuildConfigTaskName

}

})

//通过Extesion来获取额外的对象。

        project.extensions.add("extensionTest", ExtensionTest)

project.task("testpluging2", {

doLast {

//获取额外的对象并在task中使用

                ExtensionTest extensionTest = project.extensionTest;

println"extensionTest:" + extensionTest

}

})

//通过NamedDomainObjectContainer获取多个额外对象 ,提供一个存放ExtensionTest对象的容器

        NamedDomainObjectContainer extensionTests = project.container(ExtensionTest);

//把存放ExtensionTest对象的容器添加project的extensions属性中。(*****)

        project.extensions.add("extensionTests", extensionTests)

project.task("testpluging3", {

doLast {

def extensionTestss = project.extensionTests;

println"extensionTestss:" + extensionTestss

}

})

//获取额外的混合对象,通过project创建一个容器对象

        NamedDomainObjectContainer extensionTests1 = project.container(ExtensionTest);

Team team =new Team(extensionTests1);

project.extensions.add("team", team)

project.task("testpluging4", {

doLast {

def team1 = project.team;

println"team1:" + team1

}

})

}

}

/*--------------------------------------------------------Extension 延伸------------------------------------------------------*/

//在Project添加简单的扩展对象extensions,在对象中可以定义构造方法和普通的方法。就是java对象。

class ExtensionTest {

Stringname;

int age;//默认为0

    public ExtensionTest(name) {

this.name = name;

}

public ExtensionTest() {

}

@Override

    String toString() {

return "name:" +name +"  age:" +age;

}

}

//1:单个Extentsion

extensionTest {

name'testext'

}

//2:列表式Extension

extensionTests {

//先给name赋值为ExtensionTest,然后在赋值为test。

    ExtensionTest {

name ='test'

        age =6

    }

//使用的是ExtensionTest带参数的构造方法

    testext {

age =1

    }

testext1 {

age =4

    }

extensionTest {

name ='test9'

        age =5

    }

extension {

age =5

    }

}

//3:单个对象包含列表

class Team {

Stringname;

int count;

NamedDomainObjectContainerlist;

public Team(NamedDomainObjectContainer list) {

this.list = list;

}

public void setName(name) {

this.name = name;

}

//定义一个方法,通过闭包配置list属性。(****)

    def list(Closure closure) {

list.configure(closure)

}

@Override

    String toString() {

return "name:" +name +"count:" +count +list.toListString()

}

}

team {

//setName就是team中定义的setName()方法,通过该方法给Team的name属性赋值。(*****)

    setName"team"

    //不通过方法直接赋值

    count =2

    //list就是team中定义的list方法,传递的参数是闭包类型

    list {

testext {

}

testext1 {

}

}

}

/*-------------------------------------------------------- 监听------------------------------------------------------*/

tasks.whenTaskAdded { task ->

task.ext.srcDir ='src/main/java'

}

Action action =new Action() {

@Override

    void execute(Task task) {

task.ext.test ='test'

        println'taskName:' + task.name;

println'test:' + task.ext.test;

}

}

tasks.whenTaskAdded(action)

gradle.afterProject { project, projectState ->

if (projectState.failure) {

println"Evaluation of $projectFAILED"

    }else {

println"Evaluation of $projectsucceeded"

    }

}

/*--------------------------------------------------------Task  任务------------------------------------------------------*/

/*

ContextAwareTaskAction extends Action

每个Task对象里面都有一个private final List actions = new ArrayList();

存放Action的集合对象。Closure也会通过适配器模式,封装Closure,实现ContextAwareTaskAction接口。private static class ClosureTaskAction implements ContextAwareTaskAction {

private final Closure closure;

把Closure转化为Action对象。*/

ext.srcDir =""

//在Terminal中执行命令:gradlew sayGreeting1

//创建一个名字为sayGreeting1的Task对象,并调用其<<方法向Task尾部添加Action,表示该Task执行到最后的时候执行闭包里面的代码。

//重点在执行时(*****)

task sayGreeting1  <<{

//监听一定要在task定义前定义好,然后就可以访问到在监听中为每个task设置的额外属性了(ext.test)

    println'sayGreeting1'+ext.test

println rootProject.ext.springVersion;

}

//在Terminal中执行命令:gradlew sayGreeting2

//创建一个名字为sayGreeting2的Task对象,该Task创建的时候就执行闭包里面的代码。

//重点在创建时(*****)

task sayGreeting2 {

println'sayGreeting2' +srcDir

println rootProject.ext.springVersion;

}

sayGreeting2.dependsOn sayGreeting1

//在Terminal中执行命令:gradlew sayGreeting3

/*

日志分析::app:sayGreeting1

sayGreeting1

3.1.0.RELEASE

:app:sayGreeting3

Hello!

可以看出先执行:app:sayGreeting1再执行:app:sayGreeting3(*****)*

* */

task sayGreeting3(dependsOn: sayGreeting1) {

doLast {

println file(greetingFile).text

}

}

//在Terminal中执行命令:gradlew byTasks

Task byTasks = tasks.create("byTasks");

byTasks.doFirst {

println'Create Task by tasks!'

}

ext.greetingFile ="$buildDir/hello.txt"

class CreateFileTaskextends DefaultTask {

def destination

    File getDestination() {

//使用project创建一个文件对象

        project.file(destination)

}

@TaskAction

    def create() {

def file = getDestination()

file.parentFile.mkdirs()

file.write"Hello!"

    }

}

task createTxt(type: CreateFileTask) {

destination = { project.greetingFile }

}

task distribution {

doLast {

println"We build the zip with version=$version"

    }

}

task release(dependsOn:'distribution') {

doLast {

println'We release now'

    }

}

gradle.taskGraph.whenReady {taskGraph ->

if (taskGraph.hasTask(release)) {

version ='1.0'

    }else {

version ='1.0-SNAPSHOT'

    }

}

TaskExecutionGraphListener taskExecutionGraphListener =new TaskExecutionGraphListener() {

@Override

    void graphPopulated(TaskExecutionGraph taskExecutionGraph) {

List list =  taskExecutionGraph.allTasks;

for(Task task :list){

println'taskName:'+task.name;

}

}

}

gradle.taskGraph.addTaskExecutionGraphListener(taskExecutionGraphListener)

task ok

task broken(dependsOn: ok) {

doLast {

throw new 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"

    }

}

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

推荐阅读更多精彩内容

  • Groovy :是一种动态语言。 1:这种语言比较有特点,它和 Java 一样,也运行于 Java 虚拟机中。简单...
    PeytonWu阅读 1,532评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,490评论 18 139
  • 前一段时间看到不少人在技术论坛里问「刚学 Android 不久,对 Gradle 不懂,看了很多资料依然一知半解」...
    f9dd77add98e阅读 3,496评论 1 8
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,044评论 25 707
  • 高考作文小练笔――浅之城 从“大家好,我来了”到“谢谢大家,你们来了”,这期间意味着“自我”少了,“他人”多了,是...
    浅之城阅读 766评论 0 0