Gradle定義:Gradle是以Groovy語言爲基礎,面向Java應用爲主,基於DSL(領域特定語言)語法的自動化構建工具
Gradle構建流程(生命週期):初始化(加載settings腳本,創建Project對象,建立projects層級結構)、配置(根據gradle腳本配置各個Project,並生成TaskGraph),配置結束後,會調用Project的afterEvaluate方法、執行(根據Gradle命令執行Task)
Gradle依賴管理:聲明依賴有三種方式:compile Maven庫的地址、compile files、compile本地工程,依賴管理還涉及資源、清單條目、ProGuard 排除規則和自定義 Lint 規則等的合併
// rootModule
buildscript {
repositories {
maven {
url 'http://maven.byted.org/repository/android_public/'
}
maven {
url "http://maven.byted.org/nexus/content/repositories/ttplayer/"
}
}
dependencies {
classpath 'com.squareup.wire:wire-compiler:3.1.0-ec.5-SNAPSHOT'
classpath "com.edu.classroom:pb-process-plugin:0.3.0-alpha.3"
// 此處不能配置project依賴
}
}
allprojects {
repositories {
maven {
url 'http://maven.byted.org/repository/android_public/'
}
}
}
// subModule
dependencies {
api project(':classroom:base')
implementation project(':classroom:courseware-api')
kapt STRING_TYPE_ADAPTER_AP
}
Gradle依賴類型:implementation、api、compileOnly、runtimeOnly
傳遞依賴:可以採用指定 transitive = false 的方式來關閉依賴傳遞特性
排除依賴:可以採用exclude的方式來排除指定的引用
Gradle構建變體:BuildVariant(productFlavor、BuildType)
productFlavors {
branchOne {
applicationId "com.example.branchOne"
buildConfigField "String", "CONFIG_ENDPOINT", "http://branchOne.com/android"
}
branchTwo {
applicationId "com.example.branchTwo"
buildConfigField "String", "CONFIG_ENDPOINT", "http://branchTwo.org"
}
}
你可以在代碼中使用它們:BuildConfig.FIELD_NAME(上面的的例子就是BuildConfig.CONFIG_ENDPOINT)
一個有用的技巧:你可以單獨只爲某一個variants添加一些依賴,只需要在Compile加上對應的variant名字前綴就可以了
dependencies {
compile 'com.android.support:support-v4:22.2.0'
branchOneCompile 'com.android.support:appcompat-v7:22.2.0'//只爲branchOne添加這個依賴
}
和productFlavors類似,還有buildTypes(debug和release是默認的),它們都也可以爲你的應用程序生成variants,合併一起形成buildVariant,brancheOne和debug會生成branchOneDebug
差別在於改變buildType不會改變應用程序的代碼,它們只是處理的東西不同,你可以通過buildType來獲取更多的技術細節(例如:build optimization,log level等),但是app的內容不會改變,相反的,使用productFlavor配置可以改變app的內容(ps:內容可以設想成package理解,buildType沒法改applicationId)
配置階段:可以定義Task任務(默認繼承Default Task),定義並執行Gradle插件,通過ext關鍵字定義Property,聲明Extension
基本語法:Groovy語句可以不用分號結尾,Groovy中支持動態類型,即定義變量的時候可以不指定其類型,groovy最後一行代碼的執行結果就是本函數的返回值,Groovy對字符串支持相當強大,單引號''中的內容嚴格對應Java中的String,雙引號""的內容則和腳本語言的處理有點像,如果字符中有$號的話,則它會$表達式先求值,三個引號'''xxx'''中的字符串支持隨意換行,Groovy中函數調用的時候可以不加括號,Groovy是無類型的Java,閉包,bean概念(getter、setter),delegate機制(可以設置閉包執行的對象),Task增量構建
// TODO 熟悉Android插件各種配置
Gradle自定義Task:繼承DefaultTask,執行函數需要通過TaskAction標註
Gradle自定義Plugin:在src/main/groovy中實現Plugin接口,在目錄plugin/src/main/resources/META-INF/gradle-plugins/下創建properties文件用來指定插件實現類。在apply方法裏,我們可以通過project.extensions.create和project.tasks.create創建extension和task
Gradle創建Task的幾種方式:通過Project的task方法、通過TaskContainer的create方法
Android構建流程:aapt生成arsc文件和R文件、aidl文件生成對應的Java文件、Javac編譯、Annotation Processor處理、Dex生成、打包apk、jarSign、ZipAlign
productFlavors:風味維度:風味類型;
buildTypes:構建類型
風味類型 + 構建類型 = 構建變體
https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration?
應用和庫之前的關係:對於應用中存在,庫中不存在的風味類型和構建類型,使用matchingFallbacks來指定替代的類型(順序排列);對於應用中沒有,庫中存在的風味維度,使用missingDimensionStrategy來指定默認的類型(順序排列)