Gradle全解

我們Android項(xiàng)目里會(huì)有Java/Kotlin代碼,Xml文件禀忆,各種圖片音視頻資源文件等蒋情,那么Gradle 就是來(lái)幫我們打包生成 apk 的一個(gè)程序。

Gradle中暂刘,每一個(gè)待編譯的工程都叫一個(gè)Project。每一個(gè)Project在構(gòu)建的時(shí)候都包含一系列的Task。比如一個(gè)Android APK的編譯可能包含:Java源碼編譯Task厚宰、資源編譯Task、JNI編譯Task遂填、lint檢查Task铲觉、打包生成APK的Task、簽名Task等吓坚。一個(gè)Project到底包含多少個(gè)Task撵幽,其實(shí)是由編譯腳本指定的插件決定。插件是什么呢礁击?插件就是用來(lái)定義Task盐杂,并具體執(zhí)行這些Task的東西。

Gradle與前身構(gòu)建工具M(jìn)aven

Gradle拋棄了Maven的基于XML的繁瑣配置哆窿,眾所周知XML的閱讀體驗(yàn)比較差链烈,對(duì)于機(jī)器來(lái)說(shuō)雖然容易識(shí)別,但畢竟是由人去維護(hù)的更耻。取而代之的是Gradle采用了領(lǐng)域特定語(yǔ)言Groovy的配置测垛,大大簡(jiǎn)化了構(gòu)建代碼的行數(shù)。

Gradle 是個(gè)程序秧均、Groovy 是特定領(lǐng)域 DSL 語(yǔ)言

Gradle 是運(yùn)行在 JVM 實(shí)例上的一個(gè)程序食侮,內(nèi)部使用 Groovy 語(yǔ)言
Groovy 是一種 JVM 上的腳本語(yǔ)言,基于 java 擴(kuò)展的動(dòng)態(tài)語(yǔ)言

gradle的生命周期

  1. initalization初始化階段: 解析整個(gè)工程中所有Project,構(gòu)建所有的Project對(duì)應(yīng)的project對(duì)象目胡,這個(gè)階段主要就是解析setting.gradle文件
  2. Configuration配置階段:解析所有的projects對(duì)象中的task锯七,構(gòu)建好所有的task拓?fù)鋱D,主要解析各個(gè)project下的build.gradle文件
  3. Execution執(zhí)行階段:執(zhí)行具體的的task及其依賴task

在項(xiàng)目的build.gradle中監(jiān)聽gradle的生命周期回調(diào):

beforeEvaluate {
    println '配置階段開始前的監(jiān)聽回調(diào)'
}

afterEvaluate {
    println '配置階段完成以后的回調(diào)'
}

gradle.buildStarted {
    println 'build開始的回調(diào)監(jiān)聽'
}

gradle.buildFinished {
    println 'build完畢后的回調(diào)監(jiān)聽'
}

gradle.beforeProject {
    println 'gradle執(zhí)行前的回調(diào)監(jiān)聽'
}

gradle.afterProject {
    println 'gradle執(zhí)行前的回調(diào)監(jiān)聽'
}
gradle方法:
/**
 * 獲取所有Project
 */
getAllprojects().eachWithIndex { Project entry, int i ->
}

/**
 * 獲取所有子Project
 */
getSubprojects().eachWithIndex { Project entry, int i ->
}

/**
 * 配置subproject的所有project(module)
 */
subprojects {

}

/**
 * 獲取根Project
 */
getRootProject()
gradle.properties聲明誉己,可在gradle中引用該配置
#dev          開發(fā)環(huán)境
#beta         測(cè)試環(huán)境
#release      正式上線環(huán)境
NET_TYPE=dev
android.useAndroidX=true
android.enableJetifier=true
android.injected.testOnly=false
kotlin.code.style=official
  • gradle倉(cāng)庫(kù)

在項(xiàng)目的根build.gradle文件中眉尸,配置需要從哪里的倉(cāng)庫(kù)下載jar包

repositories {
        //構(gòu)建項(xiàng)目時(shí)會(huì)拉取gradle資源,而goole和jcenter在國(guó)內(nèi)的網(wǎng)絡(luò)環(huán)境并不好,容易出現(xiàn)包拉取失敗的問(wèn)題噪猾,那么就可以使用國(guó)內(nèi)阿里的鏡像霉祸。
        //repositories里倉(cāng)庫(kù)具有從上到下先后獲取順序
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
        google()
        jcenter()
}
Gradle文件配置層級(jí):
  • 一個(gè)工程包含一個(gè)setting.gradle文件和一個(gè)build.gradle文件「だ可能有多個(gè)Module丝蹭,每個(gè)Module有自己的一個(gè)build.gradle。
  • setting.gradle: setting文件定義哪些module需要加入到編譯過(guò)程
  • 工程的build.gradle:該build文件最終會(huì)被應(yīng)用到所有Module中
  • Gradle Wrapper: 對(duì)Gradle一層包裝坪蚁,便于使用統(tǒng)一Gradle構(gòu)建

gradle-wrapper.jar:具體業(yè)務(wù)邏輯實(shí)現(xiàn)的jar包
gradle-wrapper.properties:配置文件奔穿,包含篇配置信息如下圖:


gradle文件配置示例:

apply plugin: 'com.android.application'

android {

    signingConfigs {
        config {
            keyAlias ''
            keyPassword ''
            storeFile file('keystore.jks')
            storePassword ''
        }
    }

    compileSdkVersion 27
    defaultConfig {
        applicationId ""
        minSdkVersion 21
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        flavorDimensions "versionCode"

        renderscriptTargetApi 19
        renderscriptSupportModeEnabled true

        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
            }
        }

        ndk {
            abiFilters 'armeabi-v7a'
        }

        lintOptions {
            abortOnError false
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

    buildTypes {
        release {
            minifyEnabled true   
            shrinkResources true   
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
        debug {
            minifyEnabled false
            signingConfig signingConfigs.config
        }
    }

    flavorDimensions "tier" 
    productFlavors {
        yingyongbao { dimension "tier" }
    }

    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

android.lintOptions {   //忽略中英文大小寫
    checkReleaseBuilds false
    abortOnError false
}

allprojects {
    repositories {
        mavenCentral()
    }
}

repositories {
    flatDir {
        dir 'libs'

    }
}

dependencies {
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.jakewharton:butterknife:7.0.1'
}

配置說(shuō)明:

apply plugin:

表明應(yīng)用的插件的類型,工程項(xiàng)目是com.android.application類型敏晤,而Module則是com.android.library

android

這是編譯文件中最大的代碼塊贱田,關(guān)于android 的所有特殊配置都在這里

defaultConfig

程序的默認(rèn)配置

externalNativeBuild

native編譯支持
常用屬性
1.cmake:CMake工具編譯選項(xiàng)。
2.ndkBuild:ndk-build選項(xiàng)嘴脾。

buildTypes

分為release版本和debug版本
常用屬性:

minifyEnabled 是否開啟混淆
shrinkResources 是否去除無(wú)用資源
signingConfigs 簽名配置信息
name:build type的名字
proguardFiles:混淆文件

lintOptions

Lint工具可選項(xiàng)參數(shù)
常用屬性
abortOnError false如果發(fā)現(xiàn)錯(cuò)誤男摧,lint工具是否應(yīng)該退出這個(gè)程序。true表示退出统阿。

productFlavors

項(xiàng)目打包變體配置

flavorDimensions "tier" 
productFlavors {
        yingyongbao { dimension "tier" }
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
signingConfig

簽名配置信息

signingConfigs {
        config {
            keyAlias ''
            keyPassword ''
            storeFile file('keystore.jks')
            storePassword ''
        }
    }

keyAlias 簽名key的別名
keyPassword 簽名key的密碼
storeFile file 簽名key的路徑
storePassword store簽名密碼
v1SigningEnabled:是否使用jar簽名(又名v1簽名)
v2SigningEnabled:是否使用apk簽名(又名v2簽名)

repositories

代碼倉(cāng)庫(kù):Gradle支持從maven中央倉(cāng)庫(kù)和JCenter上獲取構(gòu)件

dependencies

dependencies屬于gradle 的依賴配置彩倚。它定義了當(dāng)前項(xiàng)目需要依賴的其他庫(kù)筹我。
我們?cè)谝脦?kù)的時(shí)候扶平,每個(gè)庫(kù)名稱包含三個(gè)元素:發(fā)布者標(biāo)識(shí):庫(kù)名:版本號(hào)
例如:

implementation 'com.alibaba:fastjson:1.2.8'

如果為implementation 'com.alibaba:fastjson:1.2.+'表示會(huì)使用庫(kù)的最新版本。但是每次編譯都要去做網(wǎng)絡(luò)請(qǐng)求查看是否有新版本導(dǎo)致編譯減慢蔬蕊。

gradle.properties配置
  • 加大可用編譯內(nèi)存:
    org.gradle.jvmargs=-Xmx1024m

  • 開啟編譯守護(hù)進(jìn)程
    org.gradle.daemon=true

  • 開啟并行編譯
    org.gradle.parallel=true

Gradle Plugin

Gradle是一個(gè)框架结澄,作為框架,它負(fù)責(zé)定義流程和規(guī)則岸夯。而具體的編譯工作則是通過(guò)插件的方式來(lái)完成的麻献。比如編譯Java有Java插件,編譯Groovy有Groovy插件猜扮,編譯Android APP有Android APP插件勉吻,編譯Android Library有Android Library插件。

  • 自定義task
task taskName {
    //do some things
 }

gradle中創(chuàng)建task的兩種方式

task myTask {
    println '執(zhí)行myTask'
}

tasks.create(name: 'myTask') {
    println '執(zhí)行myTask'
}

定義簡(jiǎn)單task

//定義 task , 名字 hello
task hello {
    println "hello world"
}

//定義 task旅赢,名字 hello
task(hello2) {
    println "hello world2"
}

//定義 task齿桃,名字 hello3
task ('hello3') {
    println "hello world3"
}

task 本質(zhì)上又是由一組被順序執(zhí)行的 Action 對(duì)象構(gòu)成,Action其實(shí)是一段代碼塊煮盼,類似于Java中的方法短纵。

task actionUse {
    //在Action 隊(duì)列頭部添加Action
    doFirst {

    }
    //在Action 隊(duì)列尾部添加Action
    doLast {

    }
    //創(chuàng)建一個(gè) Action , 添加到 Action 列表的頭部
    doFirst(new Action<Task>() {
        @Override
        void execute(Task task) {

        }
    })
}
參考

https://mp.weixin.qq.com/s/UlnHuM2-Dqad3MXE77xJyg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市僵控,隨后出現(xiàn)的幾起案子香到,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悠就,死亡現(xiàn)場(chǎng)離奇詭異千绪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梗脾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門翘紊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人藐唠,你說(shuō)我怎么就攤上這事帆疟。” “怎么了宇立?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵踪宠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我妈嘹,道長(zhǎng)柳琢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任润脸,我火速辦了婚禮柬脸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毙驯。我一直安慰自己倒堕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布爆价。 她就那樣靜靜地躺著垦巴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铭段。 梳的紋絲不亂的頭發(fā)上骤宣,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音序愚,去河邊找鬼憔披。 笑死,一個(gè)胖子當(dāng)著我的面吹牛爸吮,可吹牛的內(nèi)容都是我干的芬膝。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼拗胜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔗候!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起埂软,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锈遥,失蹤者是張志新(化名)和其女友劉穎纫事,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所灸,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡丽惶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爬立。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钾唬。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侠驯,靈堂內(nèi)的尸體忽然破棺而出抡秆,到底是詐尸還是另有隱情,我是刑警寧澤吟策,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布儒士,位于F島的核電站,受9級(jí)特大地震影響檩坚,放射性物質(zhì)發(fā)生泄漏着撩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一匾委、第九天 我趴在偏房一處隱蔽的房頂上張望拖叙。 院中可真熱鬧,春花似錦赂乐、人聲如沸薯鳍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辐啄。三九已至,卻和暖如春运嗜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悯舟。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工担租, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抵怎。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓奋救,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親反惕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尝艘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,813評(píng)論 25 707
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料姿染? 從這篇文章中你...
    hw1212閱讀 12,704評(píng)論 2 59
  • 說(shuō)明 本文主要介紹和Gradle關(guān)系密切背亥、相對(duì)不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    jzj1993閱讀 15,604評(píng)論 1 62
  • 在 Android Studio 構(gòu)建的項(xiàng)目中狡汉,基于 Gradle 進(jìn)行項(xiàng)目的構(gòu)建娄徊,同時(shí)使用 Android DS...
    Ant_way閱讀 7,331評(píng)論 0 16
  • 3. By落花水留痕 “老師?” 在一片黑暗中默默垂淚的柏木盾戴,被一聲怯怯的呼喚嚇的怔住了寄锐。她不想讓人看見自己現(xiàn)在的...
    紅白的書籤閱讀 401評(píng)論 0 1