一開始先進行Gradle和Maven的對比吩蔑,然后斯够,對Gradle,Gradle Wrapper坑雅,Android Plugin for Gradle的一些概念進行區(qū)分,最后通過分析Android項目中的各個Gradle文件衬横。
Gradle文件介紹
主角Gradle終于上場了裹粤,在Google發(fā)布的Android Studio開發(fā)工具中,Gradle替換Eclipse鎖使用的ant作為默認(rèn)的Android構(gòu)建工具蜂林,其吸納了ant和Maven的優(yōu)點∫K撸現(xiàn)在ant幾乎銷聲匿跡,Maven也日薄西山噪叙,而Gradle的發(fā)展卻如日中天矮锈。感覺大多數(shù)場景,Gradle替換Maven的趨勢睁蕾,指日可待了苞笨。
Gradle與Maven對比
那為啥前面還要花了幾章簡述Maven?
- 通過Maven介紹一下,什么是構(gòu)建工具惫霸,有什么作用猫缭。
- Gradle是在Maven上發(fā)展起來的,兼容Maven壹店,只有知己知彼猜丹,才能更好體驗Gradle的優(yōu)勢
- 一些非Android項目或者老的項目還使用到Maven。
Maven和Gradl直觀上最大的區(qū)別硅卢,就是依賴管理的寫法射窒,由于Gradle本身是基于Groovy腳本語音進行構(gòu)建的藏杖,并通過DSL進行描述和控制構(gòu)建邏輯,書寫起來更加自由脉顿。拋棄了Maven的xml格式的繁瑣寫法蝌麸。
<?xml version="1.0" encoding="UTF-8"?>
<dependencies>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>appcompat-v7</artifactId>
<version>26.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
dependencies {
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.11'
}
Gradle比Maven不僅僅只是語法上的改變,還有
- 性能方面得到很大提升
- 構(gòu)建周期沒有限制太死艾疟,比較靈活
- 依賴范圍被簡化
- 支持版本號后面使用+號實現(xiàn)動態(tài)的版本管理
- 解決沖突更加明確
- ......
詳細(xì)區(qū)別来吩,可以參考最后的參考資料
Android項目中的Gradle文件
Gradle,Gradle Wrapper蔽莱,Android Plugin for Gradle區(qū)別
在對Android Studio項目中關(guān)于gradle文件的介紹之前弟疆,先對幾個概念進行介紹,在開發(fā)中盗冷,經(jīng)常會遇到怠苔,尤其是更新Android Studio的時候。
Gradle
與Maven一樣仪糖,是項目管理工具柑司,上幾篇文章對其與Maven都做了簡單介紹。
Gradle Wrapper
翻譯過來名稱是Gradle的包裝锅劝,其實就是對Gradle進行封裝攒驰,簡化了Gradle本身的安裝,部署鸠天。不同的開發(fā)者讼育,不同的項目帐姻,有可能會采用不同版本的Gradle稠集,如果每次切換一個項目,都要手動部署一下對應(yīng)版本的Gradle饥瓷,這種麻煩的事肯定不適合程序員剥纷,于是就通過Gradle Wrapper實現(xiàn),就算本地原來沒有安裝部署Gradle的環(huán)境呢铆,也可以直接使用晦鞋。
查看Gradle版本
在項目路徑下,通過./gradlew -v
可以查看當(dāng)前項目的Gradle版本棺克,取決于gradle-wrpper.properties
中的值悠垛。
? StudyTest ./gradlew -v
------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------
Build time: 2017-08-07 14:38:48 UTC
Revision: 941559e020f6c357ebb08d5c67acdb858a3defc2
Groovy: 2.4.11
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_112 (Oracle Corporation 25.112-b16)
OS: Mac OS X 10.13.3 x86_64
Android Plugin for Gradle
Android項目針對Gradle的插件,通過它就可以在Android項目中使用Gradle了娜谊。Android官方也對其進行了說明
The Android Studio build system is based on Gradle, and the Android plugin for Gradle adds several features that are specific to building Android apps. Although the Android plugin is typically updated in lock-step with Android Studio, the plugin (and the rest of the Gradle system) can run independent of Android Studio and be updated separately.
大體的意思就是:Android Plugin for Gradle插件添加了構(gòu)建Android項目的幾項功能确买,雖然其通常與Anroid Studio鎖定更新,但是可以獨立于Android Studio運行并且單獨更新纱皆。
Gradle插件版本與Gradle版本
Android Plugin for Gradle版本湾趾,Android Studio版本與Gradle版本是有聯(lián)系的芭商。如果你升級了Android Studio的時候,有可能會收到提示對其進行更新搀缠。盡量升級到最新版本铛楣,性能更好。目前Plugin和Gradle的版本搭配如下艺普,可以通過Android官網(wǎng)Gradle Plugin介紹進行查詢
查看Gradle插件版本
Android Studio 3.0 之前:jcenter倉庫
Android Studio 3.0 之后:Google倉庫
Android項目中的Gradle
創(chuàng)建一個新的Android項目簸州,可以看到這里有4處關(guān)于gradle的配置文件
app/build.gradle
app的gradle配置文件,關(guān)于該應(yīng)用的配置幾乎都在這個文件中歧譬,平時關(guān)注最多的也是這個文件勿侯。包含編譯的SDK版本,不同編譯類型的配置缴罗,項目依賴等助琐。
// 描述Gradle所引入的插件類型,表示是一個Android Application
apply plugin: 'com.android.application'
// 描述這個是Android module構(gòu)建過程中的各個參數(shù)
android {
// 編譯構(gòu)建工具SDK版本
compileSdkVersion 26
// 當(dāng)前module的坐標(biāo)
defaultConfig {
// 在這里定義了項目的包名面氓,之前在Eclipse中兵钮,是在AndroidManifest中的,現(xiàn)在改在該文件中舌界。
applicationId "com.guidongyuan.studytest"
// 支持最小SDK版本掘譬,則表示編譯完成好的app,在SDK 15以下不能運行呻拌。
minSdkVersion 15
// 目標(biāo)SDK版本(建議版本)
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 編譯類型葱轩,可以在此處,對不同編譯類型藐握,如release(正式版)靴拱,debug(測試版)進行配置
buildTypes {
release {
// 是否混淆(false:不混淆)
minifyEnabled false
// 混淆規(guī)則的配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
// 項目的所有依賴庫
dependencies {
// 本地依賴聲明,包含libs文件下的所有jar文件
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 遠(yuǎn)程依賴聲明
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}
gralde/wrapper/gradle-wrapper.properties
定義Gradle Wrapper的一些信息猾普,請求下載的路徑袜炕,版本號,以及本地存放的位置初家。
#Mon Apr 30 08:59:50 CST 2018
// 解壓gradle-xxx.zip文件后的存放地址偎窘,distributionPath是distributionBase的子目錄
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
// 下載的gradle-xxx.zip文件的存放地址,zipStorePath是zipStoreBase的子目錄
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
// gradle下載的路徑以及版本號
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
GRADLE_USER_HOME:用戶的gradle目錄溜在,mac下的路徑如下/Users/guidongyuan/.gradle
陌知,window下的路徑為C:\User\用戶名\.gradle
另外,Android Studio默認(rèn)也帶有g(shù)radle掖肋,路徑為/Applications/Android Studio.app/Contents/gradle/gradle-4.1
仆葡。
離線導(dǎo)入gradle wrapper
以前開始接觸Android Studio最常遇到的問題,導(dǎo)入項目卡在下載Gradle Wrapper培遵,解決辦法:
修改項目的gralde-wrapper版本為本地已經(jīng)有的浙芙。
自行在Gradle Wrapper官網(wǎng)下載放進去登刺,先運行一下,然后會生成指定目錄嗡呼,直接放在該路徑就可以了纸俭。
下圖為把gradle-wrapper改為4.7生成的文件夾,直接把下載好的文件放到4cret……文件夾內(nèi)(根據(jù)distribution url路徑字符串計算md5值得來的)就可以了南窗。
使用本地Gradle Wrapper
Project-level settings
- Use Default gradle wrapper
如果使用Use Default gradle wrapper則會使用gradl-wrapper.properties中定義的版本揍很。 - Use local gradle distribution
使用上面的配置,如果導(dǎo)入不同的項目可能會導(dǎo)入不同的grald版本万伤,本地沒有對應(yīng)的版本窒悔,則需要通過網(wǎng)絡(luò)下載。所以敌买,在實際開發(fā)中简珠,一般勾選Use local gradle distribution使用本地的,一般會選擇Android Studio中自帶的gralde版本虹钮,如/Applications/Android Studio.app/Contents/gradle/gradle-4.4
聋庵。
Global Gradle settings
Offline work
離線模式,如果gralde都已經(jīng)下載到本地芙粱,尤其是勾選Use local gradle distributio祭玉,選中它可以提高編譯速度。Service directory path
設(shè)置依賴庫下載的保存地址春畔,測試了一下脱货,發(fā)現(xiàn),加入新的第三方庫或者使用Use Default gradle wrapper選擇然后修改gradle版本律姨,會保存到該路徑下振峻。
該路徑可以理解為,本地gradle的總倉庫线召,會緩存所有的內(nèi)容铺韧。
build.gradle
整個項目的gradle配置文件,定義依賴倉庫的地址
buildscript {
// 倉庫
repositories {
google()
jcenter()
}
// 依賴庫
dependencies {
// 聲明gradle插件的版本
classpath 'com.android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
// gradle的一個task缓淹,執(zhí)行clean的時候,會刪除編譯路徑下的文件
task clean(type: Delete) {
delete rootProject.buildDir
}
修改gradle插件的版本的時候塔逃,會保存到Android Studio應(yīng)用內(nèi)的m2repository倉庫中讯壶。
gradle.properties
在該文件夾定義設(shè)計gradle相關(guān)的一些屬性。在使用gradle的task時候湾盗,經(jīng)常會在此定義一些全局變量伏蚊,然后直接去調(diào)用。
settings.gradle
聲明整個項目中需要gralde的module
include ':app'
參考資料
Maven與Gradle對比
Android
- Android官網(wǎng)Gradle Plugin介紹
- 給 ANDROID 初學(xué)者的 GRADLE 知識普及
- gradle-wrapper.properties中各屬性的含義
- 徹底搞懂Gradle格粪、Gradle Wrapper與Android Plugin for Gradle的區(qū)別和聯(lián)系