構(gòu)建工具(五):Android項目中的Gradle文件

一開始先進行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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躏吊,一起剝皮案震驚了整個濱河市氛改,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌比伏,老刑警劉巖胜卤,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赁项,居然都是意外死亡葛躏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門悠菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舰攒,“玉大人,你說我怎么就攤上這事悔醋∧η裕” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵芬骄,是天一觀的道長偶芍。 經(jīng)常有香客問我,道長德玫,這世上最難降的妖魔是什么匪蟀? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宰僧,結(jié)果婚禮上材彪,老公的妹妹穿的比我還像新娘。我一直安慰自己琴儿,他們只是感情好段化,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著造成,像睡著了一般显熏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晒屎,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天喘蟆,我揣著相機與錄音,去河邊找鬼鼓鲁。 笑死蕴轨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的骇吭。 我是一名探鬼主播橙弱,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棘脐?” 一聲冷哼從身側(cè)響起斜筐,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛀缝,沒想到半個月后顷链,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡内斯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年蕴潦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俘闯。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡潭苞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出真朗,到底是詐尸還是另有隱情此疹,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布遮婶,位于F島的核電站蝗碎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旗扑。R本人自食惡果不足惜蹦骑,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臀防。 院中可真熱鬧眠菇,春花似錦、人聲如沸袱衷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽致燥。三九已至登疗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫌蚤,已是汗流浹背辐益。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搬葬,地道東北人荷腊。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像急凰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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