Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建開源工具,支持maven、 Ivy倉庫,支持傳遞性依賴管理,而不須要遠程倉庫或者是pom.xml和ivy.xml配置文件。 Gradle使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,目前也增長了基於Kotlin語言的kotlin-based DSL,拋棄了基於XML的各類繁瑣配置。html
當前,Gradle其支持的語言有Java、Kotlin、Groovy 和 Scala,將來將支持更多的語言。在平時Android開發中,Android項目就是使用Gradle來構建的,以下所示。java
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.xzh.gradleplugin"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
複製代碼
同時,Android Studio也集成了Gradle的構建工具,例以下面是咱們項目構建的常見場景。 android
命令 | 說明 |
---|---|
-v, --version | 查看當前 Gradle 版本信息 |
-h: | 查看幫助信息 |
-s, --stacktrace / -S, --full-stacktrace | 若是發生異常則輸出異常棧信息 |
-i, --info / -d, --debug | 控制日誌級別 |
--stop | 中止正在運行的 Daemon |
-D, --system-prop / -P, --project-prop | 傳入特定參數 |
-m, --dry-run / -x, --exclude-task | 運行構建,但不執行任務的實際操做 |
--offline / --refresh-dependencies | 離線模式構建,強制刷新依賴構建 |
b, --build-file / -c, --settings-file | 指定 build 腳本,指定 settings 腳本 |
Ctrl + c | 終止當前運行 |
./gradlew aFR > log.txt 2>&1 | 輸出全部內容到 log.txt |
Gradle Wrapper的做用是簡化Gradle自己的安裝、部署。不一樣版本的項目可能須要不一樣版本的Gradle,手工部署的話比較麻煩,並且可能產生衝突,因此須要Gradle Wrapper幫你搞定這些事情。Gradle Wrapper是Gradle項目的一部分。bash
在Android應用開發中,咱們常常會看到以下一段代碼:服務器
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
複製代碼
它的做用就是爲了簡化Gradle的配置。具體能夠參考:完全搞懂Gradle、Gradle Wrapper與Android Plugin for Gradle的聯繫閉包
在Android打包和apk構建時,常常會用到Gradle的Task命令,常見的有以下一些。併發
命令 | 說明 |
---|---|
tasks [--all] | 列出全部可運行的 task |
help --task <task> |
查看指定 task 的幫助信息 |
androidDependencies | 查看當前 project 的 android 依賴樹 |
dependencies --configuration <config> |
查看 configuration 的 依賴樹 |
clean | 清除構建產出物 |
assemble, assemble{BuildVariant} | 構建 apk,構建指定 Variant 的 apk |
install | 構建 apk 並安裝 |
uploadArchives | 構建 aar 並上傳到指定依賴管理服務器 |
在一次Android項目構建過程當中,assembleRelease依賴了許多task,以下是一些比較關鍵的task。app
命令 | 說明 |
---|---|
compileReleaseJavaWithJavac | 編譯Java文件 |
mergeReleaseAssets | 收集全部的assets |
mergeReleaseResources | 收集全部的resources |
processReleaseManifest | 生成最終的AndroidManif.xml文件 |
transformClassesAndResourcesWithPro guardForRelease | 混淆 |
transformClassesWithDexForRelease | 生成dex |
packageRelease | 打包生成apk |
根據Build phases 文檔 和 Settings file 文檔能夠知道,Gradle 構建週期能夠分爲:初始化(Initialization)、配置(Configuration)和執行(Execution)。maven
初始化(Initialization) Gradle能夠構建一個和多個項目。在初始化階段,Gradle會肯定哪些項目參與構建,而且爲這些項目建立一個Project實例。ide
配置(Configuration) 在這個階段,會配置project對象。將執行構建的全部項目的構建腳本。也就是說,會執行每一個項目的build.gradle文件。
執行(Execution) Gradle肯定要在執行期間建立和配置的任務子集。子集由傳遞給gradle命令和當前目錄的任務名稱參數肯定。 Gradle而後執行每一個選定的任務。
大概分爲如下幾個步驟 一、使用aapt工具將res資源文件生成R.java文件 二、使用aidl工具將aidl文件生成對應java文件 三、使用javac命令編譯工程源代碼和上面兩步生成的文件,生成class文件 四、經過dex工具將class文件和第三方jar包打成dex文件 五、用aapt工具將res下的資源文件編譯成二進制文件,而後將其和上一步中的dex文件以及assets中的文件經過apkbuilder工具打包成apk文件 六、經過jarsigner對apk進行簽名 七、利用zipalign工具對apk進行字節對齊優化操做
能夠用下面的圖來描述Android apk的構建過程,以下所示。
建立Gradle插件項目比較簡單,若是你是macOS,能夠先安裝gradle插件,安裝的命令以下:
brew install gradle
複製代碼
安裝完成以後,新建一個空的項目工程,而後在項目目錄下使用gradle init便可建立項目,建立時會讓你選擇不少的東西,以下圖。
public class GradlePlugin implements Plugin<Project> {
public void apply(Project project) {
// Register a task
project.tasks.register("greeting") {
doLast {
println("Hello from plugin 'xzh.plugin.greeting'")
}
}
}
}
複製代碼
該命令會向Gradle註冊GradlePlugin插件,代碼以下:
gradlePlugin {
// Define the plugin
plugins {
greeting {
id = 'xzh.plugin.greeting'
implementationClass = 'xzh.plugin.GradlePlugin'
}
}
}
複製代碼
而後,在命令行中執行gradle copy命令,該命令對應的代碼爲:
task copy(type: Copy, group:"Custom", description:"task description") {
from "src"
into "dest"
}
複製代碼
上面的代碼做用是將src的文件拷貝到dest目錄。
有時候,咱們須要開發一些Gradle插件,並將插件發佈到Maven或者Jcenter倉庫,給其餘人使用。此處爲了方便,咱們先發到本地,而後拉取時也拉取本地的插件。
假如咱們已經開發好了一個插件項目,如今想將它發佈到本地倉庫(遠端Maven倉庫),以下圖所示。
apply plugin: 'maven'
uploadArchives{
repositories.mavenDeployer{
// 配置本地倉庫路徑,項目根目錄下的repository目錄中
repository(url: uri('/Users/xiangzhihong/Maven/repository'))
pom.groupId = "com.xzh.viewlib"// 惟一標識(一般爲模塊包名,也能夠任意)
pom.artifactId = "OXViewLib" // 項目名稱(一般爲類庫模塊名稱,也能夠任意)
pom.version = "1.0.0" // 版本號
}
}
複製代碼
配置完成後點擊【Sync Now】從新構建項目,而後在Gradle projects窗口會多出一個upload目錄,裏面就有一個名爲uploadArchives的task,這個uploadArchives就是將類庫發佈到倉庫的task。
allprojects {
repositories {
google()
jcenter()
//本地Maven倉庫地址
maven {
url'/Users/xiangzhihong/Maven/repository'
}
}
}
複製代碼
而後,在app下build.script中添加依賴便可。
implementation 'com.xzh.viewlib:OXViewLib:1.0.0'
複製代碼
而後點擊【Sync Now】從新構建項目,接下來能夠在Android項目中使用Gradle插件的代碼了。固然,若是要發佈到遠端的Maven倉庫,還須要進行Maven倉庫的配置,不過流程都差很少。