Gradle
首先介紹一下 Gradle。
Gradle 是一個基于JVM的構(gòu)建工具,這種工具使用的語言是 Groovy,即 build.gradle 里使用的語言。Gradle 能夠配置一些編譯的選項,也能添加一些開源庫的引用。
扔一段維基的介紹:
Gradle 是一個基于 Apache Ant 和 Apache Maven 概念的項目自動化建構(gòu)工具。它使用一種基于 Groovy 的特定領(lǐng)域語言來聲明項目設(shè)置,而不是傳統(tǒng)的XML。
當(dāng)前其支持的語言限于Java、Groovy 和 Scala,計劃未來將支持更多的語言。
Gradle Files 分析
當(dāng)我們要創(chuàng)建一個android項目時,我們會打開Android Studio,新建一個 Project,然后會看到如下的目錄結(jié)構(gòu):

黃色框住的區(qū)域是gradle相關(guān)的配置文件,本文就簡單介紹一下剩下的 Gradle 相關(guān)的內(nèi)容。
Gradle 有幾個重要的文件,頂層的setting.gradle、build.gradle文件、每個 Module 自己的build.gradle文件,gradle.properties文件,local.properties文件,gradle目錄。
為了以后的和諧相處,下面依次認(rèn)識一下這幾位 Gradle 家族成員:
1. setting.gradle:
include ':app'
這個 setting 文件定義了哪些 module 應(yīng)該被加入到編譯過程,對于 multi module 的項目我們需要這個文件,它告訴 gradle 要加載哪些 module。
對于一個新建的純凈項目,里面只定義了默認(rèn)的 appmodule,后續(xù)有新的 module 的話都會自動在此處添加,當(dāng)然也可以手動刪掉。
* setting.gradle里也可以用 Groovy 語言寫一些方法,這些方法在初始化項目時就被執(zhí)行,做一些編譯前的處理。
2. 頂層的build.gradle:
buildscript {
repositories {
jcenter()
maven { url 'https://dl.google.com/dl/android/maven2/' }
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
}
}
- buildscript:
repositories引用了一些代碼倉庫,比如jcenter()就是一個著名的 Maven 倉庫,也可以用自定義的 url 來引用一些其他的倉庫。dependencies引用了一些 Android 插件,此處是 gradle 插件。 - allprojects:其中定義的屬性會被應(yīng)用到所有的 module 中。
3. module里的的build.gradle:
apply plugin: 'com.android.application'
#apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
applicationId "com.morning.android.glory"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
-
apply plugin: 這一行代碼應(yīng)用了一些 android 應(yīng)用的插件,此處的
'com.android.application'表示這個 module 是主工程,對于子工程,對應(yīng)要用'com.android.library' -
android 代碼塊:這里有對此 module 的所有配置,例如版本號,應(yīng)用id,編譯配置等。
-
defaultConfig:就是程序的默認(rèn)配置,注意,如果在AndroidMainfest.xml里面定義了與這里相同的屬性,會以這里的為主。
特別說明一下,applicationId定義了包名,這里的定義只作為程序的唯一識別 ID。而AndroidManifest.xml中定義的package="com.morning.android.glory"才會影響R文件的路徑名。 - buildTypes:定義了編譯類型,針對每個類型我們可以有不同的編譯配置。默認(rèn)的有debug、release 的類型。
-
defaultConfig:就是程序的默認(rèn)配置,注意,如果在AndroidMainfest.xml里面定義了與這里相同的屬性,會以這里的為主。
-
dependencies:屬于gradle 的依賴配置。它定義了當(dāng)前項目需要依賴的其他庫。一般我們在 github 上遇到喜歡的庫想用到項目中,就可以在這里添加引用了。
這里特別說一下引用庫的版本號,一般不要用26.+這種版本號的寫法,因為‘+‘號會導(dǎo)致每次編譯時都會查詢有沒有更新版本,導(dǎo)致編譯速度變慢,而且會用到一些不穩(wěn)定的 beta 版。對于公司的正經(jīng)項目,就還是不要去冒這個險了,需要升級的話手動升級就可以。
4. gradle.properties:
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4608m -XX:MaxPermSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:-UseParNewGC -XX:-UseConcMarkSweepGC -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC
COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
SUPPORT_LIBS_VERSION=26.0.1
這個里面可以配置參數(shù),然后在其他build.gradle中引用
5. local.properties:
sdk.dir=/Users/zhouying/Library/Android/sdk
這里主要定義了sdk和ndk的路徑,這個文件一般不會提交到公共倉庫中,可以保留一些本地的配置。
6. gradle 目錄
在講 gradle 目錄之前,我們需要先了解一下 Gradle Wrapper 的概念。如下。
Gradle Wrapper
Gradle 可以在沒有安裝 Gradle 的情況下使用,這時候就需要 Gradle Wrapper 了。Gradle Wrapper 其實就是一個腳本文件,它會在沒有安裝 Gradle 的情況下為我們下載Gradle,之后我們就可以使用 gradlew 命令了。
創(chuàng)建 Gradle Wrapper 文件
使用 gradle wrapper 來創(chuàng)建一組 Wrapper 文件。Gradle 官方建議我們在所有 Gradle 項目中都創(chuàng)建 Wrapper 文件,方便沒有安裝 Gradle 的用戶使用。創(chuàng)建完畢之后,會發(fā)現(xiàn)我們的項目中多了如下一些文件:
gradlew (Unix Shell 腳本)
gradlew.bat (Windows批處理文件)
gradle/wrapper/gradle-wrapper.jar (Wrapper JAR文件)
gradle/wrapper/gradle-wrapper.properties (Wrapper屬性文件)
然后,我們就可以像使用 gradle 命令一樣使用 gradlew 了。Gradle Wrapper會自動為我們下載合適的 Gradle 版本。
Andorid Studio 創(chuàng)建項目時,已經(jīng)替我們做了這一步,即生成了最上圖黃色框中的 6. gradle 目錄,所以我們不需要自己運行命令來創(chuàng)建 graldle wrapper 文件。
設(shè)置 Wrapper版本
使用 gradle wrapper --gradle-version 3.2.1 來設(shè)置Wrapper的版本?;蛘咭部梢灾苯泳庉?gradle/wrapper/gradle-wrapper.properties 文件來修改版本。
文件內(nèi)容如下,可以修改最后面的 "gradle-3.5-bin.zip" 來配置版本。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip
小結(jié)
Gradle 的存在就是為了構(gòu)建。我們知道 java 代碼需要經(jīng)過編譯生成 ·class 文件,然后打包成 dex,最后得到一個可以安裝的 apk 包。Gradle 就是執(zhí)行這一過程的構(gòu)建工具。
除了構(gòu)建,Gradle 還有一些其他“副業(yè)”,比如對于項目各種打包選項的配置,是生成 debug 包還是 release 包,對于各 Module 的管理,使用一些 jcenter 或 maven 的開源項目等。這些功能都使 Gradle 變得更加豐富,也為開發(fā)者提供了更多便利。