Gradle API 以及Task

Gradle 編程框架

1.groovy語法

2.Build Script Block

3.gradle api

前言

1.靈活性上: ANT和Maven 不能在構(gòu)建過程中,做自定義操作.

2.顆粒度: gradle 代碼開源, 根據(jù)task編譯,可讀,可改

3.擴展性 : 可以在gradle腳本中 可以自定義插件.自定義task

4.兼容性 : gralde代碼中, 可以繼續(xù)依賴 maven等框架

執(zhí)行過程

initliazation 解析整個工程的所有project, 構(gòu)建project對象

configuration 解析project對象中的task, 構(gòu)建好 所欲task 的拓撲圖

execution 執(zhí)行具體的task 以及依賴

project API

project 樹狀結(jié)構(gòu)

rootProject 根節(jié)點

parentProject 父節(jié)點

this.project 當前節(jié)點

subProject 子節(jié)點

project 中常用api介紹

//給某個project設(shè)置屬性
project("module-user"){Project project ->


}


//可以給所有子項目 設(shè)置 自動推送到maven倉庫
subprojects {Project project->
    if(project.plugins.hasPlugin('com.android.library')){
        apply from:"../publishToMaven.gradle"
    }
}


//可以給所有子項目 設(shè)置 自動推送到maven倉庫
subprojects {Project project->
    if(project.plugins.hasPlugin('com.android.library')){
        apply from:"../publishToMaven.gradle"
    }
}

//配置所有項目的屬性
allprojects {Project project->
    group "com.ccj"
    
}

project的屬性API

默認屬性

為啥 配置文件必須叫build.gradle?

因為project中 第一個屬性就是 ,默認的文件名,不可修改

    /**
     * The default project build file name.
     */
    public static final String DEFAULT_BUILD_FILE = "build.gradle";

    /**
     * The hierarchy separator for project and task path names.
     */
    public static final String PATH_SEPARATOR = ":";

    /**
     * The default build directory name.
     */
    public static final String DEFAULT_BUILD_DIR_NAME = "build";

    public static final String GRADLE_PROPERTIES = "gradle.properties";

    public static final String SYSTEM_PROP_PREFIX = "systemProp";

    public static final String DEFAULT_VERSION = "unspecified";

    public static final String DEFAULT_STATUS = "release";

擴展屬性

1.在rootProject或者當前project中,使用ext字段,來自定義屬性

ext{
    compileSdkVersion 25
       
}

在項目中可以用這個字段來使用


android {
    //兩種方式, rootProject. compileSdkVersion  也可以直接用complieVersion
    //因為, project之間有繼承關(guān)系, 如果父類有自定義的屬性,那么結(jié)構(gòu)樹下的所有子project都會有這個屬性.
    compileSdkVersion compileSdkVersion //rootProject. compileSdkVersion

1.使用 apply from '配置路徑'

首先,在根節(jié)點 新建一個config.gradle .然后在各個子 項目中, 直接使用apply from: this.file("config.gradle") 即可.


/*
* 在rootProject中 引用
* apply from: this.file("config.gradle")
*
* 在子project中 這樣引用 rootProject.ext.android.XXX 即可
* */
ext{
    android=[
            compileSdkVersion: 26,
            buildToolsVersion: "26.0.1",
            minSdkVersion: 21,
            targetSdkVersion: 26,
            versionCode: 1,
            versionName: "1.0"

    ]
    dependencies=[
            compile:'com.android.support:support-v4:21.0.3',
            compile: (project(':CommonSDK')) { exclude group: "com.android.support" },
            provided: fileTree(dir: 'src/android5/libs', include: ['*.jar']),
            provided: project(':main-host')
    ]
}
依賴相關(guān)
buildscript {ScriptHandler scriptHandler->

    //配置工程的倉庫地址  //為啥不用閉包參數(shù)就可以調(diào)用, 因為閉包的delegate設(shè)置的就是repositoryHandler
    scriptHandler.repositories {RepositoryHandler repositoryHandler ->
        repositoryHandler.jcenter()
       // repositoryHandler.mavenCentral()//這也是為啥gradle能兼容maven的原因
       // google()
       //repositoryHandler.flatDir("這里可以直接依賴項目")

       /* repositoryHandler.maven {   //可以添加自己的
            name "myMaven"
            url 'http://localhost:8081:/nexus/respositoeries'
            getCredentials{
                username = 'amdin'
                password = '123'
            }
        }*/

    }

    //配置工程中插件的依賴地址
    scriptHandler.dependencies { DependencyHandler dependencyHandler ->
            dependencyHandler. classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

    
    }
    

依賴沖突


    compile "com.android.support:support-v4:${SUPPORT_LIB_VERSION}"{
        exclude module:'support-v4'// 排除依賴
        transitive false //禁止傳遞依賴
        changing =true //每次都會從服務(wù)器拉取
    }
    //compile //資源和類,都會被打進jar, 或者aar包中
    //provided //編譯的時候會引入,但是不會將這個包打入.
    // 比如1.類的生成器(只在編譯器起作用,不在運行時起作用).
    //    2. 如果當前工程是類庫,而且該工程的類庫和 主工程有重復(fù),則可以用這種方式.


執(zhí)行外部命令

可以執(zhí)行 bash等命令

task(name:'apkcopy'){

    doLast{
        //執(zhí)行外部的命令,比如bash命令
        //將 apk copy到制定目錄
        def sourcePath =this.buildDir.path+"/outputs/apk"
        def desationPath="/Users/chenchangjun/Downloads/"

        def copycommand ="mv -f ${sourcePath} ${desationPath}"

        exec {ExecSpec execSpec->

            try {
                execSpec.executable('bash')
                args('-c',copycommand)
                println 'copycommand is execute success!'
            }catch (GradleException e){
                println 'copycommand is execute failed'+e.printStackTrace()


            }

        }

    }


}

Task

image.png

//直接通過task函數(shù)去創(chuàng)建
//group 組名,可以在右側(cè)gralde面板中 見到group分組
//description 就是描述,類似于注釋
task helloTask(group:'ccj',description:'task helloTask'){
    println 'i am helloTask'

}

//容器創(chuàng)建
this.tasks.create(name:'hello2'){
    setGroup('ccj')
    setDescription('task hello')
    println "i am hello2 "

}

//為什么 只執(zhí)行了 helloTask,卻連hello2也會被執(zhí)行呢?
// 因為上述task 是在 配置階段進行的, 而配置階段,gralde中的代碼都會執(zhí)行.


//task 的方法

task helloExecuteTask(group:'ccj',description:'task helloExecuteTask'){
    println 'i am helloExecuteTask'
    doFirst{
        println 'i am helloExecuteTask>>doFirst'

    }
    doLast{
        println 'i am helloExecuteTask>>doLast'
    }

}


helloExecuteTask.doFirst{
    println 'i am helloExecuteTask.doFirst'

}

//計算build的執(zhí)行時間

def startBuildTime,endBuildTime

this.afterEvaluate {Project project->
    //保證要找的task 已經(jīng)配置完畢
    def preBuildTask=project.tasks.getByName('preBuild')
    preBuildTask.doFirst {
        println 'preBuildTask.doFirst>>>>>>>>'
        startBuildTime=System.currentTimeMillis()

    }
    def buildTask=project.tasks.getByName('build')
    buildTask.doLast {
        endBuildTime=System.currentTimeMillis()
        println "the buildTask time is >>>>>>>>>>>${endBuildTime-startBuildTime}"

    }
}

task 依賴dependsOn

//task 依賴

task taskDepend1{

    doLast{
        println "taskDepend1"
    }


}

task taskDepend2{

    doLast{
        println "taskDepend2"
    }


}


task taskDepend3(dependsOn:[taskDepend1,taskDepend2]){

    doLast{
        println "taskDepend3"
    }


}


task handleFile {

    def srcFile = file('testdepends.xml')
    def desFile = new File(this.buildDir.path + "generated/release/result.text")
    println "build文件目錄:"+this.buildDir.path
    doLast {

        println '開始解析對應(yīng)的xml文件'

        if (!desFile.exists()) {
            desFile.createNewFile()
        }
        def releases = new XmlParser().parse(srcFile) //得到根節(jié)點
        releases.children().each { Node node ->

            def value = node.text()
            println value

            desFile.withWriter { writer ->
                writer.write(value)

            }

        }

    }


}

task testHandleFile(dependsOn: handleFile) {
    println '解析完成'

}


Task 傳遞

image.png

/*TaskOutputs outputs
TaskInputs taskInputs*/

task must1{

    doLast{
        println 'must1.doLast'

    }
}


task must2{
    mustRunAfter must1
    //shouldRunAfter
    doLast{
        println 'must2.doLast'

    }
}

task must3{
    mustRunAfter must2
    doLast{
        println 'must3.doLast'

    }
}

/*
*
* gradle must2 must3 must1
*
> Task :zdm_router_register:must1
must1.doLast

> Task :zdm_router_register:must2
must2.doLast

> Task :zdm_router_register:must3
must3.doLast

*/


task的方法

gradle 約定大于配置, 有很多默認的配置,不改變也會安裝默認的執(zhí)行

Settings即 settings.gradle gralde初始化會調(diào)用.

SourceSet

可以在android{}閉包下這樣寫

 sourceSets{
       main{
          // jniLibs.src=['libs'] //修改so庫的存放位置
            res.srcDirs=['src/main/res', //可以用來對資源進行分包,以后便于維護,超級好用
                    'src/main/res-ad',
                    'src/main/res-player'
            ]
       }
    }

也可以在project根節(jié)點下這樣寫

this.android.sourceSets{
    main{
        // jniLibs.src=['libs'] //修改so庫的存放位置
        res.srcDirs=['src/main/res', //可以用來對資源進行分包,以后便于維護
                     'src/main/res-ad',
                     'src/main/res-player'
        ]
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末径玖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子颤介,更是在濱河造成了極大的恐慌梳星,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滚朵,死亡現(xiàn)場離奇詭異冤灾,居然都是意外死亡,警方通過查閱死者的電腦和手機辕近,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門韵吨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人移宅,你說我怎么就攤上這事归粉。” “怎么了漏峰?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵糠悼,是天一觀的道長。 經(jīng)常有香客問我浅乔,道長倔喂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任靖苇,我火速辦了婚禮滴劲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘顾复。我一直安慰自己班挖,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布芯砸。 她就那樣靜靜地躺著萧芙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪假丧。 梳的紋絲不亂的頭發(fā)上双揪,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音包帚,去河邊找鬼渔期。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的疯趟。 我是一名探鬼主播拘哨,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼信峻!你這毒婦竟也來了倦青?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤盹舞,失蹤者是張志新(化名)和其女友劉穎产镐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踢步,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡癣亚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了获印。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片述雾。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蓬豁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菇肃,我是刑警寧澤地粪,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站琐谤,受9級特大地震影響蟆技,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斗忌,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一质礼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧织阳,春花似錦眶蕉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽撑教。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哨啃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工袁铐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杨伙,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像乾忱,于是被迫代替她去往敵國和親讥珍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理饭耳,服務(wù)發(fā)現(xiàn)串述,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • 說明 本文主要從實現(xiàn)原理和代碼層面介紹Gradle開發(fā)相關(guān)知識寞肖。關(guān)于本文中提到的纲酗、Gradle中的基本概念等內(nèi)容,...
    jzj1993閱讀 7,882評論 1 33
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 10,979評論 0 6
  • 說明 本文主要介紹和Gradle關(guān)系密切新蟆、相對不容易理解的配置觅赊,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,573評論 1 62