Gradle實(shí)戰(zhàn)及學(xué)習(xí)建議

前言

相信不少使用Android Studio開發(fā)Android的朋友都在為Gradle中的一些配置疑惑买窟,今天來介紹一下我在學(xué)習(xí)Gradle的一些經(jīng)驗(yàn)和總結(jié)春宣,希望能對(duì)大家有所幫助院峡。先大致的看一張Gradle學(xué)習(xí)的結(jié)構(gòu)圖卑雁,對(duì)正片文章有個(gè)大致的了解跌榔,其次逐一說明一些Android Gradle 插件中的一些變量的含義及用法實(shí)例地熄。

Gradle學(xué)習(xí)框架圖

Groovy簡(jiǎn)介

由于Gradle使用Groovy作為默認(rèn)的編譯語言叉讥,所以在學(xué)習(xí)Gradle之前窘行,可以簡(jiǎn)單的了解一下Groovy的一些簡(jiǎn)單語法會(huì)事半功倍。

Groovy特點(diǎn)

  1. Groovy和Java一樣节吮,源碼都會(huì)被編譯成class字節(jié)碼文件然后可以在JVM中運(yùn)行抽高;
  2. Groovy兼容所有的Java語法,也就是說透绩,你可以在.groovy中直接寫Java代碼翘骂,編譯運(yùn)行壁熄;
  3. Groovy中自定義變量和方法都使用關(guān)鍵字 def 來定義;
  4. 閉包(注意碳竟,這將是在Gradle配置中經(jīng)常使用的)

關(guān)于Groovy的語法學(xué)習(xí)教程很多草丧,這里篇幅原因,就不詳細(xì)解釋了莹桅〔矗可以參看簡(jiǎn)書的另一篇博文:《Groovy語法》

Gradle語法介紹

這里就具體的Gradle語法進(jìn)行介紹,如果要詳細(xì)介紹可能需要一本書才能講完诈泼。本文僅結(jié)合具體的項(xiàng)目來介紹一些關(guān)鍵的知識(shí)點(diǎn)懂拾。
在Gradle中,每個(gè)Project都對(duì)應(yīng)一個(gè)build.gradle文件铐达,而buidl.gralde中定義了每個(gè)Project所需要執(zhí)行的Task岖赋,而這些Task是由具體的插件(Plugin)決定的。
比如Java Project的Gradle插件在build.gradle中配置如下:

group 'Sample'
version '1.0-SNAPSHOT'
//配置java插件
apply plugin: 'java'
//編譯源文件時(shí)使用的Java版本
sourceCompatibility = 1.5
repositories {    
    mavenCentral()
}
dependencies {    
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

以上是我基于IDEA新建的一個(gè)簡(jiǎn)單的Java工程瓮孙,build.gralde為自動(dòng)生成文件唐断。由于項(xiàng)目為Java工程,所以需要使用Gradle的Java插件來定義編譯規(guī)則杭抠。
同理脸甘,我們?cè)谑褂肁ndroidStudio 新建一個(gè)Android項(xiàng)目時(shí),也會(huì)生成對(duì)應(yīng)的build.gradle文件偏灿。以新建一個(gè)Sample工程為例:
/app/build.gradle如下(注釋詳解):

//使用Gradle Android插件
//DSL語法網(wǎng)址:http://google.github.io/android-gradle-dsl/current/index.html
apply plugin: 'com.android.application'
//android{...} 表示插件的 dsl 入口丹诀,凡是在DSL中定義的都只在此閉包中生效
android {    
    //編譯的sdk版本(必填)
    compileSdkVersion 23  
    //構(gòu)建工具版本  (必填)
    buildToolsVersion "23.0.2" 
    //默認(rèn)配置   
    defaultConfig {        
            //應(yīng)用標(biāo)識(shí)
            applicationId "com.mrljdx.sample" 
            //最小sdk版本       
            minSdkVersion 9      
            //編譯sdk版本  
            targetSdkVersion 23  
            //版本號(hào)      
            versionCode 1        
            //版本名稱
            versionName "1.0"    
      }   
      //編譯類型,在構(gòu)建編譯變種時(shí)菩混,可以在此定義 
      buildTypes {        
             release {            
                    minifyEnabled false            
                    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        
             }    
       }
//android dsl 結(jié)束
}

dependencies {    
         compile fileTree(dir: 'libs', include: ['*.jar'])    
         testCompile 'junit:junit:4.12'    
         compile 'com.android.support:appcompat-v7:23.2.0'    
         compile 'com.android.support:design:23.2.0'
 }

Gradle Android Plugin 工程目錄結(jié)構(gòu)約定如下:

Android工程目錄結(jié)構(gòu).png

其中說明一下jniLibs目錄忿墅,它主要存放.so庫文件。在jni文件夾下存放ndk編譯相關(guān)的c/c++文件沮峡,編譯后生成的文件會(huì)在jniLibs中疚脐,Gradle默認(rèn)讀取jniLibs目錄下的.so庫文件,所以一般習(xí)慣于Eclipse的為了改變文件目錄邢疙,會(huì)使用Android Plugin 的 DSL 語法 sourceSet來重新定義文件目錄棍弄,如下:

sourceSets {    
      main {     
          //將jniLibs下的文件/子文件目錄 定義到與'src'同級(jí)的'libs'目錄下 
          jniLibs.srcDirs = ['libs']   
      }
}

對(duì)比Eclipse目錄結(jié)構(gòu)和Android Studio的目錄結(jié)構(gòu)

Eclipse.png
AndroidStudio.png

可以發(fā)現(xiàn)在Android Studio中,會(huì)默認(rèn)識(shí)別Gradle Android Plugin 預(yù)先約定的工程目錄結(jié)構(gòu)疟游,有些文件夾會(huì)變成藍(lán)色呼畸,表示源碼目錄,而帶有數(shù)據(jù)表示的文件夾颁虐,則表示存放資源文件蛮原。這點(diǎn)比起Eclipse要好很多。
那么問題來了另绩,如何通過配置build.gralde來適配Eclipse工程導(dǎo)出的文件目錄結(jié)構(gòu)呢儒陨?其實(shí)不難花嘶,如下配置即可:

sourceSets {    
        main {        
              manifest.srcFile 'AndroidManifest.xml'        
              java.srcDirs = ['src']        
              resources.srcDirs = ['src']        
              aidl.srcDirs = ['src']        
              renderscript.srcDirs = ['src']        
              res.srcDirs = ['res']        
              assets.srcDirs = ['assets']    
        }    
        // Move the tests to tests/java, tests/res, etc...    instrumentTest.setRoot('tests')    
        // Move the build types to build-types/<type>    
        // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...    
        // This moves them out of them default location under src/<type>/... which would    
        // conflict with src/ being used by the main source set.    
        // Adding new build types or product flavors should be accompanied    
        // by a similar customization.    
        debug.setRoot('build-types/debug')    
        release.setRoot('build-types/release')
        androidTest.setRoot('test')
  }

理解以上代碼并不難,請(qǐng)參閱《Android Plugin DSL參考手冊(cè)》 即可蹦漠。

Gradle的生命周期

通過分析Android Studio創(chuàng)建的項(xiàng)目結(jié)構(gòu)或者IDEA創(chuàng)建的Java工程項(xiàng)目結(jié)構(gòu)椭员,不難發(fā)現(xiàn),在每個(gè)Project的根目錄下笛园,一定會(huì)存在 setting.gradle文件隘击。
Gradle有一個(gè)初始化流程,這個(gè)時(shí)候setting.gradle會(huì)執(zhí)行研铆,通過setting.gradle可以獲取當(dāng)前整個(gè)工程的配置獲取一個(gè)Settings對(duì)象(查看Gradle DSL參考手冊(cè) 了解更多詳情)
關(guān)于Gradle的Project相關(guān)的生命周期埋同、任務(wù)、依賴等官方解釋如下:

Gradle Offical.png

可以簡(jiǎn)單的總結(jié)一下蚜印,就是在初始化時(shí)莺禁,讀取setting.gradle中的項(xiàng)目配置留量,來確定編譯的工程窄赋,通過每個(gè)工程中的build.gradle來確定編譯的任務(wù),而這些任務(wù)是由對(duì)應(yīng)的plugin來決定的楼熄,比如 'com.android.application'插件決定編譯成apk忆绰,而'com.android.library'插件決定項(xiàng)目編譯成.aar庫文件等。
在每個(gè)插件中可岂,都有相應(yīng)的語法約定错敢。通過Android DSL 手冊(cè) 可以理解為啥要那么定義。以及每個(gè)定義中的變量所對(duì)應(yīng)的類型和方法缕粹。
在博客《Android中實(shí)用的Gradle配置》 中說明了一個(gè)應(yīng)用在開發(fā)過程中的一些配置問題稚茅,其中對(duì)于每一個(gè)配置都有解釋說明,感興趣的可以參考一下平斩。

Gradle學(xué)習(xí)建議

關(guān)于Gradle的具體語法相關(guān)DSL細(xì)節(jié)亚享,如果在這里講可能要寫很多。授人以魚不如授人以漁绘面,這里結(jié)合自身的學(xué)習(xí)過程給大家一點(diǎn)建議和參考:

  • Gradle 官方文檔 :了解Project對(duì)應(yīng)的章節(jié)欺税,仔細(xì)閱讀LifeCycle、Tasks揭璃、Dependencies晚凿、Multi-project Builds、Plugins瘦馍、Properties歼秽、Extra Properties、Dynamic Methods相關(guān)內(nèi)容情组≡锟辏基本上可以理解為何一個(gè)工程項(xiàng)目的結(jié)構(gòu)以及依賴是如何導(dǎo)入的扛吞。
  • 深入理解Android(一):Gradle詳解 :詳細(xì)的介紹了Groovy相關(guān)語法、Gradle構(gòu)建細(xì)節(jié)等內(nèi)容荆责。其中關(guān)于Groovy的 List滥比、Map、Range做院、閉包等內(nèi)容值得細(xì)看盲泛,因?yàn)樵贕radle的使用中,比如多版本多渠道的APK構(gòu)建會(huì)用到這些內(nèi)容键耕。
  • Android DSL 參考手冊(cè) :可以結(jié)合本片文章開頭的圖來進(jìn)行系統(tǒng)學(xué)習(xí)寺滚,了解Android DSL的語法層級(jí),了解構(gòu)建的一些內(nèi)容屈雄,理解即可村视。
  • Gralde In Action 中文版:看名字就知道,這本書主要講解一些Gradle常用的實(shí)例講解酒奶,可以好好看看

END

由于個(gè)人能力有限蚁孔,在文中如有紕漏還請(qǐng)斧正,關(guān)于Gradle構(gòu)建項(xiàng)目相關(guān)的問題歡迎交流惋嚎,開卷有益~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杠氢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子另伍,更是在濱河造成了極大的恐慌鼻百,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摆尝,死亡現(xiàn)場(chǎng)離奇詭異温艇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)堕汞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門勺爱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臼朗,你說我怎么就攤上這事邻寿。” “怎么了视哑?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵绣否,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我挡毅,道長(zhǎng)蒜撮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮段磨,結(jié)果婚禮上取逾,老公的妹妹穿的比我還像新娘。我一直安慰自己苹支,他們只是感情好砾隅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著债蜜,像睡著了一般晴埂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寻定,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天儒洛,我揣著相機(jī)與錄音,去河邊找鬼狼速。 笑死琅锻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的向胡。 我是一名探鬼主播恼蓬,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捷枯!你這毒婦竟也來了滚秩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤淮捆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后本股,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀痊,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年拄显,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苟径。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡躬审,死狀恐怖棘街,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情承边,我是刑警寧澤遭殉,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站博助,受9級(jí)特大地震影響险污,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一蛔糯、第九天 我趴在偏房一處隱蔽的房頂上張望拯腮。 院中可真熱鬧,春花似錦蚁飒、人聲如沸动壤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狼电。三九已至,卻和暖如春弦蹂,著一層夾襖步出監(jiān)牢的瞬間肩碟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工凸椿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留削祈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓脑漫,卻偏偏與公主長(zhǎng)得像髓抑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子优幸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,101評(píng)論 25 707
  • Gradle對(duì)于很多開發(fā)者來說有一種既熟悉又陌生的感覺吨拍,他是離我們那么近,以至于我每天做項(xiàng)目都需要他网杆,但是他又是離...
    阿_希爸閱讀 9,575評(píng)論 10 199
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理羹饰,服務(wù)發(fā)現(xiàn),斷路器碳却,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 這篇文章講給大家?guī)韌radle打包系列中的高級(jí)用法-自己動(dòng)手編寫gradle插件队秩。我們平常在做安卓開發(fā)時(shí),都會(huì)在...
    呆萌狗和求疵喵閱讀 15,985評(píng)論 22 80
  • 自從看了《我們來了》昼浦,就被這個(gè)簡(jiǎn)單善良馍资、感性的江一燕所感染。我喜歡你書中說我比你想象中簡(jiǎn)單关噪,是你複雜了我的單純鸟蟹。我...
    sonkiujhon閱讀 274評(píng)論 2 2