Gradle 學習

Gradle 學習

Gradle是一個基于Apache AntApache Maven概念的項目自動化構建工具误算。它使用一種基于Groovy特定領域語言(DSL, domain-specific language )來聲明項目設置急凰,而不是傳統(tǒng)的XML瘟芝。

gradle是一個自動化工具碉碉。配置gradle時,使用的是Groovy語言锹淌。Groovy的語法與Java類似影所。

Gradle可以構建多個project,一個build.gradle代表一個project赶袄,每個project包含多個task揽涮。每個task里面可以包含多個action。

構建過程分為三步:

  • 初始化階段:創(chuàng)建 Project 對象饿肺,如果有多個build.gradle蒋困,也會創(chuàng)建多個project.
  • 配置階段:在這個階段,會執(zhí)行所有的編譯腳本敬辣,同時還會創(chuàng)建project的所有的task雪标,為后一個階段做準備。
  • 執(zhí)行階段:在這個階段溉跃,gradle 會根據(jù)傳入的參數(shù)決定如何執(zhí)行這些task,真正action的執(zhí)行代碼就在這里.

Groovy語法

在一些情況下村刨,可能需要我們自己定義task。而Gradle其實使用的是groovy語言撰茎,因此嵌牺,在定義task之前需要先了解groovy語法。而groovy與Scala、Kotlin語言一樣逆粹,都是一種JVM語言募疮。

閉包

閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數(shù)閉包(function closures)僻弹,是引用了自由變量的函數(shù)阿浓。這個被引用的自由變量將和這個函數(shù)一同存在,即使已經(jīng)離開了創(chuàng)造它的環(huán)境也不例外蹋绽。

使用閉包的groovy代碼

def hash = ["name":"Andy", "age":25]
    hash.each{ key, value ->
        println "${key} : ${value}"
    }

沒用閉包的Java代碼

Map<String, String>map = new HashMap<String, String>();
map.put("name", "Andy");
map.put("age","20");
               
for(Iterator iter = map.entrySet().iterator(); iter.hasNext();){
    Map.Entry entry = (Map.Entry)iter.next();
    System.out.println(entry.getKey() + " : " +     entry.getValue());
}

雖然在迭代上使用閉包的機會最多芭毙,但閉包確實還有其他用途。因為閉包是一個代碼塊蟋字,所以能夠作為參數(shù)進行傳遞(Groovy 中的函數(shù)或方法不能這樣做)稿蹲。

Groovy 中可以像在 Java 代碼中一樣定義類扭勉。不過不需要使用 public 修改符鹊奖,而且還可以省略方法參數(shù)的類型。

例如涂炎,我們可以創(chuàng)建一個User類忠聚,它有姓名和年齡屬性。

class User{
    def name
    def age
}

與java不同的是唱捣,groovy會自動生成User類的getter和setter方法两蟀。

Groovy in Gradle

在配置文件中的apply plugin: 'com.android.application'轉化為groovy語法為:

project.apply([plugin: 'com.android.application'])

apply()是Project類的方法,參數(shù)是map集合震缭。

build.gradle文件中的依賴配置赂毯。

dependencies {
    compile 'com.google.code.gson:gson:2.3'
}

轉化為groovy語法為:

project.dependencies({
    add('compile', 'com.google.code.gson:gson:2.3', {
        // Configuration statements
    })
})

構建Android項目

Android應用構建流程.PNG

Gradle 和 Android 插件可以完成以下方面的構建配置:

  • buildTypes:在模塊級 build.gradle 文件的 android {} 代碼塊內(nèi)部創(chuàng)建和配置buildTypes。
android {
    ...
    defaultConfig {...}
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            applicationIdSuffix ".debug"
        }

        /**
         * The 'initWith' property allows you to copy configurations from other build types,
         * so you don't have to configure one from the beginning. You can then configure
         * just the settings you want to change. The following line initializes
         * 'jnidebug' using the debug build type, and changes only the
         * applicationIdSuffix and versionNameSuffix settings.
         */

        jnidebug {

            // This copies the debuggable attribute and debug signing configurations.
            initWith debug

            applicationIdSuffix ".jnidebug"
            jniDebuggable true
        }
    }
}
  • productFlavors:與配置buildTypes類似拣宰,將配置添加到productFlavors {}代碼塊中党涕。
android {
    ...
    defaultConfig {...}
    buildTypes {...}
    productFlavors {
        demo {
            applicationIdSuffix ".demo"
            versionNameSuffix "-demo"
        }
        full {
            applicationIdSuffix ".full"
            versionNameSuffix "-full"
        }
    }
}

Gradle 創(chuàng)建的Build Variants數(shù)量等于每個productFlavors中的Flavor數(shù)量與配置的buildTypes數(shù)量的乘積。

  • dependencies:
dependencies {
    // The 'compile' configuration tells Gradle to add the dependency to the
    // compilation classpath and include it in the final package.

    // Dependency on the "mylibrary" module from this project
    compile project(":mylibrary")

    // 遠程二進制依賴
    compile 'com.android.support:appcompat-v7:27.1.1'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Gradle 與Android Gradle Plugin

Gradle作為一個異常強大的構建工具巡社,為了滿足不同平臺的需求膛堤,比如:Java平臺有Java構建邏輯,Android平臺有Android構建邏輯晌该。Gradle務必是要支持自定義構建的肥荔,這個功能正是由Gradle Plugin提供,而對應于Android工程的構建邏輯就是由Android Gradle Plugin實現(xiàn)的了朝群。

自定義Gradle插件

自定義插件的目錄結構

plugin
└── src
    └── main
    |   ├── groovy
    |   |   └── com
    |   |          └── package
    |   |               └── name
    |   └── resources
    |       └── META-INF
    |           └── gradle-plugins
    |_ build.gradle

由上述插件結構可知燕耿,自定義插件大致可分為三個部分。groovy目錄姜胖,resources目錄和build.gradle配置文件誉帅。

build.gradle

apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

META-INF/gradle-plugins

在META-INF/gradle-plugins 目錄下添加一個屬性文件,主要用來使得Gradle找到該插件。

implementation-class=com.nxiangbo.plugin.main.CustomPlugin

Groovy 目錄

為了創(chuàng)建Gradle插件堵第,我們必須創(chuàng)建一個實現(xiàn)Plugin接口的類吧凉。當我們將自定義的插件應用到項目時,Gradle就會創(chuàng)建這個類的實例踏志,并調用這個類的apply()方法阀捅。而project作為該方法的參數(shù),因此插件可以使用project的配置针余。下面我們在groovy目錄下創(chuàng)建CustomPlugin.groovy饲鄙。

 class CustomPlugin implements Plugin<Project> {
    @Override
    void apply(Project project) {
        def extension = project.extensions.create("customPlugin", CustomExtension)
        project.task("demo"){
            project.afterEvaluate{
       
                    println("versionName=${extension.versionName}   versionCode=${extension.versionCode}")
            }
        }


    }
}
class CustomExtension {
    String versionName
    String versionCode

}

發(fā)布插件

只需要在build.gradle文件中添加uploadArchives task就可以將插件發(fā)布到本地。

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                repository(url: uri('D:/repo'))
            }
        }
    }
}

應用插件

在需要使用該插件的項目中的build.gradle 文件中圆雁,添加如下代碼

apply plugin: 'customplugin'

customPlugin {
    versionName='version'
    versionCode='1.1.0'
}

Gradle插件調試

首先忍级,在Android Studio 中設置Edit Configurations -> +號 -> Remote -> 填寫Host和端口號

gradle調試.png

然后,運行gradle :app:clean -Dorg.gradle.debug=true --no-daemon

最后伪朽,點擊調試按鈕即可轴咱。
gradle調試02.png
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市烈涮,隨后出現(xiàn)的幾起案子朴肺,更是在濱河造成了極大的恐慌,老刑警劉巖坚洽,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戈稿,死亡現(xiàn)場離奇詭異,居然都是意外死亡讶舰,警方通過查閱死者的電腦和手機鞍盗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跳昼,“玉大人般甲,你說我怎么就攤上這事÷郏” “怎么了欣除?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挪略。 經(jīng)常有香客問我历帚,道長,這世上最難降的妖魔是什么杠娱? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任挽牢,我火速辦了婚禮,結果婚禮上摊求,老公的妹妹穿的比我還像新娘禽拔。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布睹栖。 她就那樣靜靜地躺著硫惕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪野来。 梳的紋絲不亂的頭發(fā)上恼除,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音曼氛,去河邊找鬼豁辉。 笑死,一個胖子當著我的面吹牛舀患,可吹牛的內(nèi)容都是我干的徽级。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼聊浅,長吁一口氣:“原來是場噩夢啊……” “哼餐抢!你這毒婦竟也來了?” 一聲冷哼從身側響起狗超,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弹澎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后努咐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡殴胧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年渗稍,在試婚紗的時候發(fā)現(xiàn)自己被綠了脑融。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片届囚。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妇穴,靈堂內(nèi)的尸體忽然破棺而出灸姊,到底是詐尸還是另有隱情拱燃,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布力惯,位于F島的核電站碗誉,受9級特大地震影響,放射性物質發(fā)生泄漏父晶。R本人自食惡果不足惜哮缺,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甲喝。 院中可真熱鬧尝苇,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至非竿,卻和暖如春凯肋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背汽馋。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工侮东, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豹芯。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓悄雅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铁蹈。 傳聞我的和親對象是個殘疾皇子宽闲,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

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

  • Gradle 是一款構建系統(tǒng)工具,它的 DSL 基于 Groovy 實現(xiàn)握牧。Gradle 構建的大部分功能都是通過插...
    任教主來也閱讀 3,058評論 3 6
  • 本篇主要是個人學習gradle的筆記總結 一.開始之前 1. 為什么學習Gradle 采用DSL(Doma...
    zyq_neuq閱讀 1,506評論 2 12
  • 用過android studio的對gradle應該都不陌生了容诬,gradle文件的基本配置大同小異,略做了解使用應...
    微涼一季閱讀 27,436評論 18 185
  • 什么是Gradle Gradle 是新一代的自動化構建工具沿腰,它是一個獨立的項目览徒,跟 AS、Android 無關颂龙,類...
    Mr槑閱讀 572評論 0 2
  • Android默認使用Gradle[https://www.gradle.org/]作為構建工具习蓬。 Why Gra...
    goodl閱讀 949評論 0 1