Gradle

Gradle

初識(shí)Gradle

在用AndroidStudio創(chuàng)建一個(gè)工程的時(shí)候,會(huì)發(fā)現(xiàn)工程目錄中除了必須的工程代碼以及各種資源文件外奕删,還有一些后綴為.gradle的文件俺泣,這些就是gradle的配置文件,是基于gradle的構(gòu)建腳本。

什么是Gradle

Gradle是一種項(xiàng)目自動(dòng)化建構(gòu)工具完残,基于Groovy語(yǔ)言伏钠,面向Java應(yīng)用為主,它拋棄了基于XML的各種繁瑣配置谨设,取而代之的是一種基于Groovy的內(nèi)部領(lǐng)域特定(DSL)語(yǔ)言熟掂, 而Groovy語(yǔ)言是一種基于jvm的動(dòng)態(tài)語(yǔ)言。

Project和tasks

在grade中的兩大重要的概念扎拣,分別是project和tasks赴肚。

Android studio中的project和Gradle中的project不是一個(gè)概念素跺。

每一次構(gòu)建都是有至少一個(gè)project來完成,每個(gè)project有至少一個(gè)tasks誉券。每一個(gè)build.grade文件代表著一個(gè)project指厌。tasks在build.gradle中定義,很像Java中的方法踊跟。在構(gòu)建過程中踩验,不同的Task各司其職。每個(gè)Task相當(dāng)于一個(gè)Project對(duì)象的函數(shù)商玫,專門用來干一件事箕憾。

不同的Task之間可以增加依賴,比如Task A依賴于B拳昌,那么要執(zhí)行A首先會(huì)執(zhí)行B袭异。而一個(gè)任務(wù)可以依賴的任務(wù)不止一個(gè)。在每一個(gè)Project中都必須有一個(gè)build.gradle文件地回,這是一個(gè)構(gòu)建腳本扁远,類似于makefile俊鱼,這個(gè)文件是整個(gè)Project構(gòu)建的入口刻像,可以在其中做一些配置,比如版本并闲、插件细睡、依賴等。

工作流程/生命周期

簡(jiǎn)單來說帝火,Gradle的工作過程分為三個(gè)階段:Initialization階段溜徙、Configuration階段以及Execution階段。

  1. 初始化階段:project實(shí)例在這兒創(chuàng)建犀填,如果有多個(gè)模塊蠢壹,即有多個(gè)build.gradle文件,多個(gè)project將會(huì)被創(chuàng)建九巡。

  2. 配置階段:在該階段图贸,build.gradle腳本將會(huì)執(zhí)行,為每個(gè)project創(chuàng)建和配置所有的tasks,會(huì)為所有的Task根據(jù)其依賴關(guān)系而建立一個(gè)有向圖冕广。

  3. 執(zhí)行階段:這一階段疏日,gradle會(huì)決定哪一個(gè)tasks會(huì)被執(zhí)行,哪一個(gè)tasks會(huì)被執(zhí)行完全依賴開始構(gòu)建時(shí)傳入的參數(shù)和當(dāng)前所在的文件夾位置有關(guān)撒汉。

一旦一個(gè)tasks被執(zhí)行沟优,那么它不會(huì)再次執(zhí)行了,不包含依賴的Tasks總是優(yōu)先執(zhí)行

為什么要選擇Gradle

假如你是一個(gè)開發(fā)者睬辐,項(xiàng)目自動(dòng)構(gòu)建是你每天工作的一部分挠阁,難道你就不想讓你的構(gòu)建代碼和你寫的源代碼一樣可以擴(kuò)展宾肺、測(cè)試和維護(hù)?Gradle的構(gòu)建腳本是聲明式的鹃唯、可讀的爱榕,可以清晰的表達(dá)意圖。使用Groovy代替XML來寫代碼大大減少了構(gòu)建代碼的大小坡慌。更重要的是黔酥,Gradle集成了其他構(gòu)建工具,比如Ant和Maven洪橘,使得原來的項(xiàng)目很容易遷徙到Gradle跪者。

Gradle for Android

看看實(shí)際的Android工程中g(shù)radle是如何使用

配置

基于grade構(gòu)建的項(xiàng)目通常至少有一個(gè)build.gradle,看看Android Studio默認(rèn)的配置:


圖片名稱

Android工程中常用到的配置文件有:

  1. gradle-wrapper.properties文件

工程配置gradle熄求,distributionUrl是指定你的gradle版本渣玲,你可以改變?cè)搖rl來改變你的gradle版本。

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
  1. setting.gradle文件

setting.gradle文件將會(huì)在初始化時(shí)期執(zhí)行弟晚,并且定義了哪一個(gè)模塊將會(huì)被構(gòu)建忘衍。

Android中一個(gè)項(xiàng)目中可以構(gòu)建多個(gè)Module,會(huì)在setting.gradle文件中會(huì)有如下代碼:(每構(gòu)建一個(gè)module就要在這里配置一下卿城,Android Studio會(huì)自動(dòng)幫我們配好了)

include ':app', ':mylibrary'
  1. 圖中框起來的兩個(gè)build.gradle文件

根目錄下的build.gradle文件是定義在這個(gè)工程下的所有模塊的公共屬性:

//這個(gè)就是實(shí)際構(gòu)建開始的地方
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'

    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

該文件主要包含了兩個(gè)方面:在倉(cāng)庫(kù)地址中枚钓,我們使用了jcenter,jcenter可以理解成是一個(gè)中央遠(yuǎn)程倉(cāng)庫(kù),一個(gè)倉(cāng)庫(kù)代表著你的依賴包的來源瑟押,兼容maven中心倉(cāng)庫(kù)搀捷。構(gòu)建腳本也定義了一個(gè)Android構(gòu)建工具,聲明了android gradle plugin的版本。

app目錄下的build.gradle:

//構(gòu)建腳本也定義了一個(gè)Android構(gòu)建工具多望,Android plugin提供了所有需要去構(gòu)建和測(cè)試的應(yīng)用嫩舟。每個(gè)Android應(yīng)用都需要這么一個(gè)插件:
apply plugin: 'com.android.application'

//當(dāng)使用Android 插件的時(shí)候,Android標(biāo)簽將可以被使用
android {
    //編譯該app時(shí)候怀偷,你想使用到的api版本
    compileSdkVersion 24
    //構(gòu)建工具的版本號(hào)
    buildToolsVersion "25.0.2"
    
    //defaultConfig方法包含了該app的核心屬性家厌,該屬性會(huì)重寫在AndroidManifest.xml中的對(duì)應(yīng)屬性。
    defaultConfig {
        //app包名
        applicationId "com.lipy.gradledemo"
        //sdk相關(guān)配置
        minSdkVersion 22
        targetSdkVersion 24
        //版本相關(guān)配置
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    
    //構(gòu)建相關(guān)設(shè)置,用于構(gòu)建不同版本的app
    buildTypes {
        release {
            //是否開啟混淆
            minifyEnabled false
            //混淆文件位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//依賴
dependencies {
    //將libs文件夾中所有的jar文件視為依賴包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //聲明依賴庫(kù)
    compile 'com.android.support:appcompat-v7:24.2.1'
}

以上配置是在android studio創(chuàng)建android項(xiàng)目的時(shí)候默認(rèn)配置好的椎工。

我們還可以自定義配置:

  1. 全局設(shè)置
    多模塊在一個(gè)工程下饭于,可以這樣定義:
allprojects {
       apply plugin: 'com.android.application'
       android {
           compileSdkVersion 24
           buildToolsVersion "25.0.2"
       }
 }
 

如果model不是application的話,可以這樣:
在跟gradle.build中添加

ext {
    allprojectCompileSdkVersion=24
    allprojectBuildToolsVersion="25.0.2"
}

然后在具體的model中引用:

android {
    compileSdkVersion allprojectCompileSdkVersion
    buildToolsVersion allprojectBuildToolsVersion
}
  1. 配置應(yīng)用簽名信息
android {
       buildTypes {

        debug {
            signingConfig signingConfigs.debug
        }
    }

    signingConfigs {
        debug {
            storeFile file('debug.keystore')//簽名證書文件
            keyAlias 'debug.keystore'//別名
            storePassword "123456789"http://證書的密碼
            keyPassword "123456789"http://key的密碼
        }
    }

  1. 依賴

依賴配置的關(guān)鍵字:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:24.2.1'
    compile project(':mylibrary')
    provided 'com.google.code.gson:gson:2.2.4'
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
}
  • compile //包含所有的依賴包,都會(huì)寫入apk
  • provided//提供編譯支持晋渺,但是不會(huì)寫入apk
  • apk//apk中存在镰绎,但是不會(huì)加入編譯中
  • testCompile//添加額外的library支持針對(duì)測(cè)試
  • androidTestCompile//添加額外的library支持針對(duì)測(cè)試

在Gradle中添加依賴,僅僅只需添加一行代碼在你的build文件木西,Gradle會(huì)自動(dòng)從遠(yuǎn)程倉(cāng)庫(kù)為你下載相關(guān)的jar包畴栖。依賴包會(huì)在你執(zhí)行build構(gòu)建的時(shí)候從這些遠(yuǎn)程倉(cāng)庫(kù)下載,然后會(huì)在本地保留緩存八千。

Gradle會(huì)默認(rèn)定義三個(gè)maven倉(cāng)庫(kù):Jcenter和mavenCentral以及本地maven倉(cāng)庫(kù)

repositories {
       mavenCentral()
       jcenter()
       mavenLocal()
   }

我們也可以使用Jcenter和mavenCentral之外的遠(yuǎn)程倉(cāng)庫(kù):

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
       }
}

如果有密碼:

repositories {
       maven {
           url "http://repo.acmecorp.com/maven2"
           
           credentials {
               username 'user'
               password 'secretpassword'
           }
       }
}

使用aar文件:
在構(gòu)建library項(xiàng)目時(shí)吗讶,會(huì)在 build/output/aar/下生成aar文件燎猛。創(chuàng)建一個(gè)文件夾aars文件夾,把它拷貝到該文件夾里照皆,然后依賴:

repositories {
    flatDir {
        dirs 'aars' 
    }
}

也可以單獨(dú)依賴某個(gè)

dependencies {
       compile(name:'libraryname', ext:'aar')
}

使用基本的構(gòu)建命令

使用命令行重绷,導(dǎo)航到你的項(xiàng)目,然后輸入:

gradle tasks

這一命令將會(huì)列出所以可運(yùn)行的tasks

在開發(fā)的時(shí)候膜毁,構(gòu)建項(xiàng)目昭卓,你需要運(yùn)行

gradle assembleRelease

通過debug配置,該任務(wù)將會(huì)創(chuàng)建一個(gè)debug版本的app,同時(shí)會(huì)將其保存在./app/build/outputs/apk目錄下。

其他常用命令:

gradle clean //清除....../app目錄下的build文件夾

gradle build //檢查依賴并編譯打包瘟滨,會(huì)把debug候醒、release環(huán)境的包都打出來

gradle assembleRelease //編譯并打Release的包

gradle installRelease //Release模式打包并安裝

gradle installDebug//Debug模式打包并安裝

gradle uninstallRelease //卸載Release模式包

我們也可以不使用命令行,Android studio有其對(duì)應(yīng)的工具:

圖片名稱
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杂瘸,一起剝皮案震驚了整個(gè)濱河市倒淫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌败玉,老刑警劉巖敌土,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異运翼,居然都是意外死亡返干,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門南蹂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬金,“玉大人念恍,你說我怎么就攤上這事六剥。” “怎么了峰伙?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵疗疟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我瞳氓,道長(zhǎng)策彤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任匣摘,我火速辦了婚禮店诗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘音榜。我一直安慰自己庞瘸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布赠叼。 她就那樣靜靜地躺著擦囊,像睡著了一般违霞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞬场,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天买鸽,我揣著相機(jī)與錄音,去河邊找鬼贯被。 笑死眼五,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彤灶。 我是一名探鬼主播弹砚,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼枢希!你這毒婦竟也來了桌吃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤苞轿,失蹤者是張志新(化名)和其女友劉穎茅诱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搬卒,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑟俭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了契邀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摆寄。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坯门,靈堂內(nèi)的尸體忽然破棺而出微饥,到底是詐尸還是另有隱情,我是刑警寧澤古戴,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布欠橘,位于F島的核電站,受9級(jí)特大地震影響现恼,放射性物質(zhì)發(fā)生泄漏肃续。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一叉袍、第九天 我趴在偏房一處隱蔽的房頂上張望始锚。 院中可真熱鬧,春花似錦喳逛、人聲如沸瞧捌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)察郁。三九已至衍慎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皮钠,已是汗流浹背稳捆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留麦轰,地道東北人乔夯。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像款侵,于是被迫代替她去往敵國(guó)和親末荐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,501評(píng)論 0 4
  • 1.介紹 如果你正在查閱build.gradle文件的所有可選項(xiàng)新锈,請(qǐng)點(diǎn)擊這里進(jìn)行查閱:DSL參考 1.1新構(gòu)建系統(tǒng)...
    Chuckiefan閱讀 12,118評(píng)論 8 72
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評(píng)論 25 707
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 10,979評(píng)論 0 6
  • 今天要和大家分享的一本書是——《富爸爸窮爸爸》甲脏。 這本書的作者有兩位,一位被譽(yù)為“百萬富翁的教父”和“金錢教練”的...
    阿超有話說閱讀 1,221評(píng)論 8 50