目錄:
1、Gradle及Groovy簡介
2、Groovy基礎(chǔ)到進階
3、Gradle入門
4、Gradle構(gòu)建
5、Gradle任務(wù)
6、Gradle插件
7、自定義Android Gradle工程
8、Android Gradle多項目構(gòu)建
9、Android Gradle多渠道構(gòu)建
10、Android Gradle測試
11、Android Gradle持續(xù)集成
一、Gradle及Groovy簡介
1、Gradle及自動化構(gòu)建
(1)Gradle介紹
????Gradle是一款基于Apache的Ant和Maven概念的
項目自動化開元構(gòu)建工具。Gradle的核心是基于Java來實現(xiàn)的,可以把Gradle看成就是一個輕量級的Java應(yīng)用程序
???? Gradle使用Groovy、Kotlin等語言編寫自定義腳本,取代了Ant和Maven使用xml配置文件的方式,很大程度簡化了開發(fā)時對項目構(gòu)建要做的配置,使用更加靈活和強大。
(2)為什么要學(xué)習(xí)Gradle
???? Gradle不僅是目前Android最主流的構(gòu)建工具。而且不少技術(shù)領(lǐng)域如組件化、插件化、熱修復(fù),及構(gòu)建系統(tǒng)(很多優(yōu)秀的框架都是在編譯時或者打包之前做一些特殊的處理),都需要通過Gradle來實現(xiàn),不懂Gradle將無法完成上述事情,所以學(xué)習(xí)Gradle非常必要
???? 很多人都了解過這個APT,就是注解處理器,就是在編譯時去生成一些代碼,這就是一個Gradle和APT的一個使用了。有一些框架還打包成Gradle插件,通過插件在編譯之后去修改class字節(jié)碼的。目的是在應(yīng)用運行前就把代碼執(zhí)行好,提升應(yīng)用使用時的運行速度,所以它不僅僅是一個項目依賴管理的工具
(3)關(guān)于項目構(gòu)建
???? 對于Java應(yīng)用程序,編寫好的Java代碼需要編譯成.class文件才能夠執(zhí)行。所以任何的Java應(yīng)用開發(fā),最終都需要經(jīng)過這一步。
????編譯好了這些class文件,還需要對其進行打包。打包不僅針對這些class文件,還有所有的資源文件等。比如web工程打包成jar包或者war包就包含了自己的資源文件,然后放到服務(wù)器上運行。(就是對資源進行整理,然后放到某一個路徑下方便我們?nèi)ナ褂茫?br> ???? Android工程編譯好的class文件還要被打包到dex包中,并且所有的資源文件進行合并處理,甚至還需要對最終打爆出來的文件進行加密和簽名處理等等,如下圖所示
在這里插入圖片描述
???? 后面的是簽名和apk加固的過程,早在13年14年,那時候沒有apk加固,所以那些搞逆向開發(fā)的只要拿到apk,就可以輕松破解然后看到里面的目錄結(jié)構(gòu),可以進行修改里面的代碼,現(xiàn)在搞逆向的就比較困難了。
(4)安卓自動化構(gòu)建發(fā)展史
"石器時代": 自己編寫命令腳本,進行編譯和打包
“蒸汽時代”: Make(.mk)、Ant(.xml)工具的出現(xiàn)
“電氣時代”: Maven
“信息時代”: Gradle,更高級的自動構(gòu)建工具出現(xiàn)。。。
你們的Gradle可能用了兩年 還是沒有變,可能還在怪Android Studio,Android Studio沒有辦法了,出了一個策略,就是那個最低支持幾點幾版本的Gradle。 其實Gradle配置文件就是一個 閉包,就是一個方法的調(diào)用ext{ // AA }rootProject.ext{ // ... }
(5)Gradle提供了什么
- ???? 對多工程的構(gòu)建支持非常出色,尤其是工程依賴問題,并支持局部構(gòu)建
- ???? 多種方式的依賴管理:如遠程Maven倉庫,nexus私服,ivy倉庫活著本地文件系統(tǒng)等。
- ???? 支持傳遞性依賴管理
- ???? 輕松遷移項目工程
- ???? 基于Groovy等語言構(gòu)建腳本,簡便且靈活
- ???? 免費開源,并且
整體設(shè)計是以作為一種語言為導(dǎo)向的,而非成為一個嚴格死板的框架。
????比如maven 的寫法,xml都是需要被解析的,解析成能夠執(zhí)行的代碼,而且不夠靈活
????
而Gradle,這就是一個可以執(zhí)行的腳本文件2、Groovy介紹
(1)Groovy簡介
???? Groovy是一種基于JVM的
敏捷開發(fā)語言,它結(jié)合了python、Ruby和Smalltalk的許多強大的特性,Groovy代碼能夠與Java代碼很好的結(jié)合,也能用于擴展現(xiàn)有代碼。由于其運行在JVM上的特性,Groovy也可以使用其他非Java語言編寫的庫
(2)Groovy&Java&Kotlin
???? Groovy、Java及Kotlin都是基于JVM的開發(fā)語言
???? Groovy基于Java,在語法上基本相似,但也做了很多自己的擴展。Groovy除了可以面向?qū)ο缶幊?,還可以用作純粹的腳本語言,這一點和Kotlin是一樣的。
???? Groovy和 Kotlin都有自己支持的DSL(領(lǐng)域?qū)S谜Z言),兩者有許多共通之處
(3)Groovy特性
- ???? 同時支持靜態(tài)類型和動態(tài)類型
- ???? 支持運算符重載
- ???? 支持DSL語法特性
- ???? 本地語法列表和關(guān)聯(lián)數(shù)組
- ???? 各種標記語言,如XML 和 HTML原生支持
- ???? 對正則表達式的本地支持
- ???? Groovy和Java語法非常相似,可以無縫銜接使用Java
- ???? 支持使用現(xiàn)有的Java庫,并做了一定的擴展
Groovy:閉包、MOP編程(元編程)
(4)Hello Groovy
Groovy 與 Java寫法上的一些差異:
分號可選,除非會導(dǎo)致語法歧議時才使用分號
return 語句可選
方法,屬性默認都是public的
Groovy不強迫捕獲異常,看使用者需求
?, 安全導(dǎo)航操作符的使用
閉包的使用結(jié)合DSL語法特性等等
實戰(zhàn)建一個Groovy項目:
如果你用idea新建一個項目遇到報錯問題,這里給你答案:
intellij 編譯groovy報錯問題解決
編譯結(jié)果:
二、Groovy基礎(chǔ)到進階
1、Groovy基礎(chǔ)
(1)數(shù)據(jù)類型
基本數(shù)據(jù)類型:
- byte、short、int、long 、float、 double、 char、boolean
包裝類(裝箱拆箱):
- String、Byte、Short、Integer、Long、Float、Double、Char、Boolean
自動裝箱:因為Groovy具有動態(tài)類型特性,所以它從一開始就支持自動裝箱。實際上,必要時Groovy會自動將基本類型視作對象。
(2)字符串
- 單引號字符串是java.lang.String類型,同時不支持插值
- 雙引號字符串在沒有使用插值表達式情況下是java.lang.String類型,但如果有插值表達式使用的話,就是groovy.lang.CString類型
- 三引號字符串表示多行的字符串,不必將字符串分割成幾塊,也不必用連接符或換行轉(zhuǎn)譯字符來將字符串跨行
- 字符串的使用:
- 單引號單個字符表示char類型,需要使用as轉(zhuǎn)換
- ${...}表達式進行插值,去掉花括號不引起歧義的話,可以去掉
- 可以通過+=,-=操作符添加/減少字符(會自動匹配)
(3)范圍
范圍是一種特殊的列表,由序列中的第一個和最后一個值表示,Range可以是包含或排除。包含范圍包括從第一個到最后一個的所有值,而獨占范圍包括除最后一個之外的所有值。也可以使用表達式來表示范圍,例如:
- 1..10 包括范圍的示例;
- 1..<10 獨占范圍的示例(開區(qū)間)
- 'a' .. 'x' 范圍也可以由字符串組成;
- 10..1 范圍也可以按降序排列
- 'x'..'a' 范圍也可以由字符組成并按降序排列。同步/異步請求實現(xiàn) 。
(4)映射
映射(也稱為關(guān)聯(lián)數(shù)組,字典,表和散列)是對象引用的無序集合。Map集合中的元素由鍵值訪問。Map中使用的鍵可以是任何類,如果不能推斷具體key類型,默認就是字符串。
在Groovy中可以使用特定的表述方式來指定映射:
- [k1:v1,k2:v2] 具有鍵值對的集合
[:] 空映射
(5)運算符及控制語句
Groovy支持運算符重載
循環(huán)語句:
- 除了和Java保持差不多的用法外,還支持結(jié)合范圍的用來進行循環(huán)。
- 組合閉包來實現(xiàn)更簡化的循環(huán)操作
條件語句:
- 除了和Java保持差不多的用法外,還多了Groovy的一些擴展
- 可以組合閉包實現(xiàn)更靈活的條件語句
2、Groovy進階
(1)Groovy動態(tài)特性
動態(tài)/靜態(tài)類型語言
動態(tài)類型語言:動態(tài)類型語言是指
在運行期間才去做數(shù)據(jù)類型檢查的語言,也就是說,在用動態(tài)類型的語言編程時,可以不用給變量指定數(shù)據(jù)類型,該語言會在你第一次賦值給變量時,在內(nèi)部將數(shù)據(jù)類型記錄下來。Python和Ruby這些就是一種典型的動態(tài)類型語言。
靜態(tài)類型語言:靜態(tài)類型語言與動態(tài)類型語言剛好相反,它的數(shù)據(jù)類型是在編譯期間檢查的,也就是說在寫程序時要聲明所有變量的數(shù)據(jù)類型,C/C++是靜態(tài)類型語言的代表,其他的靜態(tài)類型語言還有C#、Java等
Groovy的動態(tài)特性
使用def定義變量,類型由運行時對其賦值的類型類確定。
Java中要使用繼承才能實現(xiàn)多態(tài),而Groovy輕而易舉
- 優(yōu)勢:使用時非常靈活
- 缺點:編譯時不會檢查類型,運行時報錯,需要更加注重細節(jié)
可以使用MOP進行元編程
(2)Groovy元編程
- Java中可以通過反射,在運行時動態(tài)的獲取類的屬性,方法等信息,然后反射調(diào)用。但是沒法直接做到往類中添加屬性、方法和行為。(需要通過動態(tài)字節(jié)碼技術(shù)如ASM、javassist等技術(shù)來實現(xiàn)動態(tài)的修改class)
- MOP(元對象協(xié)議): Meta Object Protocol
- Groovy直接可以使用MOP進行元編程,我們可以基于應(yīng)用當前的狀態(tài),動態(tài)的添加或者改變類的方法和行為。比如在某個Groovy類中并沒有實現(xiàn)某個方法,這個方法的具體操作由服務(wù)器來控制,使用元編程,為這個類動態(tài)添加方法,或者替換原來的實現(xiàn),然后可以進行調(diào)用。
(3)MOP方法攔截
實現(xiàn)GroovyInterceptable接口,重寫invokeMethod來進行攔截。
使用MetaClass攔截方法,覆蓋invokeMethod方法。
- 使用類的MetaClass,針對的是class對象,所有實例都會被影響。
- 使用具體實例的MetaClass,只影響當前對象實例
(4)MOP方法注入
方法注入:編寫代碼時知道想要添加到一個或多個類中的方法的名字。利用方法注入,可以動態(tài)地向類中添加行為。也可以向任意數(shù)目的類中注入一組實現(xiàn)某一特定功能的可復(fù)用方法,就像工具函數(shù)。有以下幾種方式:
- 使用分類注入方法。
- 使用ExpandoMetaClass注入方法。
直接使用類或?qū)嵗腗etaClass注入方法,實際上最終操作的類型是ExpandoMetaClass。
手動創(chuàng)建ExpandoMetaClass來進行注入- 使用Mixin注入方法。(在類中可以使用多個Mixin)
(5)MOP方法合成
方法合成:想在調(diào)用時動態(tài)地確定方法的行為。Groovy的invokeMethod()、methodMissing()和Groovy Interceptable對于方法合成非常有用
- 使用methodMissing()合成方法。
- 使用ExpandMetaClass合成方法。
(6)MOP方法委托
使用Expando動態(tài)生成動態(tài)類。
使用methodMissing實現(xiàn)方法委托。