Android Gradle學(xué)習(xí)(一)

目錄:
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)方法委托。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容