從這章開始我們就開始介紹Android Gradle插件了,會(huì)通過幾章由淺入深的詳細(xì)的介紹Android Gradle唆迁,本章會(huì)簡(jiǎn)單的介紹下Android Gradle插件,然后通過一個(gè)例子對(duì)其有大概的了解,最后講下如果從原來基于Eclipse進(jìn)行Android開發(fā)的方式,轉(zhuǎn)到基于Android Studio描孟,使用Android Gradle插件開發(fā)的新方式
7.1 Android Gradle插件簡(jiǎn)介
從Gradle的角度看,我們知道Android其實(shí)就是Gradle的一個(gè)第三方插件砰左,他是由Google 的Android團(tuán)隊(duì)開發(fā)的匿醒,但是從Android的角度看,Android插件是基于Gradle構(gòu)建的缠导,和Android Studio完美無縫搭配的新一代構(gòu)建系統(tǒng)廉羔,它不同于Eclipse+Ant的搭配,相比于舊的構(gòu)建系統(tǒng)僻造,它更靈活憋他,更容易配置,還能很方便的創(chuàng)建衍生的版本--也就是我們常用的多渠道包嫡意。讓我們看看Android官方對(duì)它的推崇程度:
- 可以很容易的重用代碼和資源
- 可以很容易的創(chuàng)建應(yīng)用的衍生版本举瑰,所以不管你是創(chuàng)建多個(gè)apk,還是不同功能的應(yīng)用都很方便
- 可以很容易的配置蔬螟、擴(kuò)展以及自定義構(gòu)建過程
- 和IDE無縫整合
上面說的IDE就是Android Studio,真是Android Gradle+Android Studio搭配汽畴,工作不累旧巾。
7.2 Android Gradle插件分類
Android Gradle插件的分類其實(shí)是根據(jù)Android工程的屬性分類的耸序,在Android中有三類工程,一類是App應(yīng)用工程鲁猩,它可以生成一個(gè)可運(yùn)行的APK應(yīng)用坎怪;一類是Library庫(kù)工程,它可以生成AAR包給其他的App工程公用廓握,就和我們的Jar一樣搅窿,但是它包含了Android的資源等信息,是一個(gè)特殊的Jar包隙券;最后一類是Test測(cè)試工程男应,用于對(duì)App工程或者Library庫(kù)工程進(jìn)行單元測(cè)試。
- App插件id:com.android.application
- Library插件id:com.android.library
- Test插件id:com.android.test
通過應(yīng)用以上三種不同的插件娱仔,就可以配置我們的工程是一個(gè)Android App工程沐飘,還是一個(gè)Android Library工程,或者是一個(gè)Android Test測(cè)試工程牲迫,然后配合著Android Studio耐朴,就可以分別對(duì)他們進(jìn)行編譯、測(cè)試盹憎、發(fā)布等操作筛峭。
7.3 應(yīng)用Android Gradle插件
在講Gradle插件的時(shí)候,我們講了要應(yīng)用一個(gè)插件陪每,必須要知道他們的插件id影晓,除此之外,如果是第三方的插件奶稠,還要配置他們的依賴classpath俯艰。Android Gradle插件就是屬于第三方插件,它托管在Jcenter上锌订,所以在應(yīng)用他們之前竹握,我們要先配置依賴classpath,這樣當(dāng)我們應(yīng)用插件的時(shí)候辆飘,Gradle系統(tǒng)才能找到他們啦辐。
我們配置里倉(cāng)庫(kù)為jcenter,這樣當(dāng)我們配置依賴的時(shí)候蜈项,gradle就會(huì)去這個(gè)倉(cāng)庫(kù)里尋找我們的依賴芹关。
然后我們?cè)赿ependencies{}配置里我們需要的是Android Gradle1.5.0版本的插件。
buildscript{}這部分配置可以寫到根工程的build.gradle腳本文件中紧卒,這樣所有的子工程就不用重復(fù)配置了侥衬。
以上配置好之后,我們就可以應(yīng)用我們的Android Gradle插件了。
android{}是Android插件提供的一個(gè)擴(kuò)展類型轴总,可以讓我們自定義Android Gradle工程直颅。compileSdkVersion是編譯所依賴的Android SDK的版本,這里是API Level怀樟;buildToolsVersion是構(gòu)建該Android工程所以的構(gòu)建工具的版本功偿。
以前應(yīng)用的是一個(gè)App工程插件,應(yīng)用Android Library插件和Android Test插件也類似的往堡,只需要換成相應(yīng)的id即可械荷。
7.4 Android Gradle工程示例
Android Gradle插件繼承于Java插件,具有所有Java插件的特性虑灰,它也需要在Setting文件里通過include配置包含的子工程吨瞎,也需要應(yīng)用Android插件等等。
下面我們就通過一個(gè)App工程的示例瘩缆,來演示下App的工程目錄結(jié)構(gòu)以及相關(guān)的Android Gradle配置关拒。
我們可以通過Android Studio創(chuàng)建一個(gè)App工程,創(chuàng)建后我們可以看到其大概工程目錄結(jié)構(gòu)如下:
其目錄結(jié)構(gòu)和Java工程相比沒有太大的變化庸娱,proguard-rules.pro是一個(gè)混淆配置文件着绊;src目錄下的androidTest、main熟尉、test分別是三個(gè)SourceSet归露,分別對(duì)應(yīng)Android單元測(cè)試代碼、Android App主代碼和資源斤儿、普通的單元測(cè)試代碼剧包。我們注意到main文件夾,相比Java的往果,多了AndroidManifest.xml疆液,res這兩個(gè)屬于Android特有的文件目錄,用于描述Android App的配置和資源文件陕贮。
下面我們來看看Android Gradle的build.gradle配置文件
Android Gradle工程的配置堕油,都是在android{}中,這是唯一的一個(gè)入口肮之,通過它掉缺,可以對(duì)Android Gradle工程進(jìn)行自定義的配置,其具體實(shí)現(xiàn)是com.android.build.gradle.AppExtension戈擒,是Project的一個(gè)擴(kuò)展眶明,創(chuàng)建原型如下:
在com.android.application插件中,getExtensionClass()返回的就是com.android.build.gradle.AppExtension筐高,所以關(guān)于android的很多配置可以從這個(gè)類里去找搜囱,參考我們前面講的Gradle知識(shí)丑瞧,可以找到很多試用的配置或者可以利用的對(duì)象、方法或者屬性等等犬辰,而這些并沒有在Android文檔里介紹的嗦篱,這就是可以看源代碼的好處冰单。
7.4.1 compileSdkVersion
compileSdkVersion 23幌缝,是配置我們編譯Android工程的SDK,這里的23是Android SDK的API Level诫欠,對(duì)應(yīng)的是Android6.0的SDK涵卵,這個(gè)大家都清楚的。該配置的原型是一個(gè)compileSdkVersion方法
除此之外荒叼,他還有一個(gè)set方法轿偎,所以我們可以把它當(dāng)成android的一個(gè)屬性使用。
使用方式是:
這就是Gradle的靈活支出被廓,通過不同的方法坏晦,就可以達(dá)到不同的配置方式。
7.4.2 buildToolsVersion
buildToolsVersion "23.0.1"表示我們使用的Android 構(gòu)建工具的版本嫁乘,我們可以在Android SDK目錄里看到昆婿,它是一個(gè)工具包,包括appt蜓斧,dex等工具仓蛆。它的原型也是一個(gè)方法。
從以上的方法原型中可以看到挎春,我們可以通過buildToolsVersion方法賦值看疙,也可以通過android.buildToolsVersion這個(gè)屬性讀寫它的值。
7.4.3 defaultConfig
defaultConfig是默認(rèn)的配置直奋,它是一個(gè)ProductFlavor能庆,ProductFlavor允許我們根據(jù)不同的情況同時(shí)生成多個(gè)不同的APK包,比如我們后面介紹的多渠道打包脚线。如果不針對(duì)我們自定義的ProductFlavor單獨(dú)配置的話搁胆,會(huì)為這個(gè)ProductFlavor使用默認(rèn)的defaultConfig的配置。
例子中applicationId是配置我們的包名殉挽,這里是org.flysnow.app.example74
minSdkVersion 是最低支持的Android系統(tǒng)的API Level丰涉,這里是14
targetSdkVersion 表明我們是基于哪個(gè)Android版本開發(fā)的,這里是23
versionCode 我們的App應(yīng)用內(nèi)部版本號(hào)斯碌,一般用于控制App升級(jí)
versionName 我們的App應(yīng)用的版本名稱一死,用戶可以看到,就是我們發(fā)布的版本傻唾,這里是1.0
以上所有配置對(duì)應(yīng)的都是ProductFlavor類里的方法或者屬性投慈。
7.4.4 buildTypes
buildTypes是一個(gè)NamedDomainObjectContainer類型承耿,是一個(gè)域?qū)ο螅€記得我們講的SourceSet嗎伪煤?這個(gè)和那個(gè)一樣加袋。SourceSet里有main、test等抱既,同樣的buildTypes里有release职烧,debug等,我們可以在buildTypes{}里新增任意多個(gè)我們需要構(gòu)建的類型防泵,比如debug蚀之,Gradle會(huì)幫我們自動(dòng)創(chuàng)建一個(gè)對(duì)應(yīng)的BuildType,名字就是我們定義的名字捷泞。
release就是一個(gè)BuildType足删,后面章節(jié)我們會(huì)詳細(xì)介紹BuildType,例子中我們用到了兩個(gè)配置
minifyEnabled 是否為該構(gòu)建類型啟用混淆锁右,我們這里是false表示不啟用失受,如果想要啟用可以設(shè)置為true
proguardFiles,當(dāng)我們啟用混淆時(shí)咏瑟,所使用的proguard的配置文件,我們可以通過它配置我們?nèi)绾芜M(jìn)行proguard混淆谆焊,比如混淆的級(jí)別浦夷,哪些類或者方法不進(jìn)行混淆等等辖试。它對(duì)應(yīng)BuildType的proguardFiles方法,可以接受一個(gè)可變參數(shù)劈狐,所以我們同時(shí)可以配置多個(gè)配置文件,比如我們例子中的
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
getDefaultProguardFile是android擴(kuò)展的一個(gè)方法莲兢,它可以獲取你的Android SDK目錄下的默認(rèn)的proguard配置文件,在android-sdk/tools/proguard/目錄下续膳,文件名就是我們傳入的參數(shù)的名字proguard-android.txt改艇。
其他還有很多有用的配置,我們后面的章節(jié)都會(huì)一一介紹谒兄,這里只簡(jiǎn)單的介紹入門示例社付,讓大家對(duì)Android Gradle有一個(gè)大概的了解
7.5 Android Gradle任務(wù)
我們說過Android插件是基于Java插件邻耕,所以Android插件基本上包含里所有Java插件的功能燕鸽,包括繼承的任務(wù),比如assemble啊研、check悲伶、build等等,除此之外麸锉,Android在大類上還添加了connectedCheck花沉、deviceCheck媳握、lint、install蛾找、uninstall等任務(wù)打毛,這些是屬于Android特有的功能。
connectedCheck 在所有鏈接的設(shè)備或者模擬器上運(yùn)行check檢查
deviceCheck 通過API連接遠(yuǎn)程設(shè)備運(yùn)行checks幻枉。它被用于CI(譯者注:持續(xù)集成)服務(wù)器上。
lint 在所有的ProductFlavor上運(yùn)行l(wèi)int檢查胰挑。
install和uninstall類的任務(wù)可以直接在我們已鏈接的設(shè)備上安裝或者卸載你的App椿肩。
除此之外,還有一些不太常用的任務(wù)贡这,比如signingReport 可以打印App的簽名扣唱;androidDependencies 可以打印android的依賴团南,還有其他一些類似的任務(wù)炼彪,大家可以通過./gradlew tasks來查看辐马。
一般我們常用的任務(wù)是build、assemble 喜爷、clean檩帐、lint、以及check等诅挑,通過這些任務(wù)我們可以打包生成我們的Apk泛源,對(duì)現(xiàn)有的Android工程進(jìn)行l(wèi)int檢查等等。
7.6 從Eclipse遷移到Android Gradle工程
最開始的時(shí)候還沒有Android Studio没龙,也沒有Android Gradle這個(gè)插件缎玫,我們都是使用Eclipse+ADT+Ant進(jìn)行Android開發(fā),用過Ant的咬摇,再和我們的Gradle對(duì)比一下煞躬,就會(huì)發(fā)現(xiàn)Gradle的靈活,還有Android Studio這個(gè)強(qiáng)大的IDE和Android Gradle完美配合在扰,會(huì)使得我們開發(fā)效率大大提高雷客,所以很多人都迫不及待的想從原來基于Eclipse+ADT+Ant,遷移到我們的Android Studio+Gradle皱卓,這一小結(jié)我們就簡(jiǎn)單的講下如何遷移。
從Eclipse遷移到Android Studio有兩種方式嫂易,一種是使用Android Studio直接導(dǎo)入Eclipse工程掐禁,另外一種使用Eclipse導(dǎo)出Android Gradle配置文件,轉(zhuǎn)換為一個(gè)Gradle工程缕允,然后再使用Android Studio把它作為一個(gè)Gradle工程導(dǎo)入蹭越。
7.6.1 使用Android Studio導(dǎo)入
這種方式比較簡(jiǎn)單般又,要導(dǎo)入到Android Studio,我們打開Android Studio茴迁,選擇File->Import Project,然后會(huì)彈出一個(gè)對(duì)話框堕义,選擇我們的Eclipse ADT工程的目錄脆栋,然后就會(huì)打開一個(gè)向?qū)В聪驅(qū)б徊讲讲僮髋绿牛詈笸瓿傻臅r(shí)候秦踪,會(huì)打開一個(gè) "import-summary.txt" 文件,里面描述的我們這次導(dǎo)入涉及到的文件遷移和改變等等柠逞,我們?cè)俑鶕?jù)我們上面講的Android Gradle工程結(jié)構(gòu)做調(diào)整即可景馁。
以上是我導(dǎo)入的一個(gè)例子生成的import-summary.txt合住,我們可以看到有一段Moved Files撒璧,也就是說笨使,這種導(dǎo)入方式,會(huì)把我們?cè)瓉鞥clipse+ADT項(xiàng)目的目錄結(jié)構(gòu)轉(zhuǎn)換成了Android Studio的目錄結(jié)構(gòu)殿如,破壞了原來的目錄結(jié)構(gòu)最爬,如果對(duì)于目錄結(jié)構(gòu)有嚴(yán)格要求的爱致,就不要使用這種方式了,可以使用我們下面講的第二種方式糠悯,如果沒有嚴(yán)格要求的互艾,建議采用這種方式,因?yàn)檫@是Android Studio默認(rèn)推薦的目錄結(jié)構(gòu)阅悍,也可以熟悉下昨稼,為以后的新的功能,甚至團(tuán)隊(duì)間的協(xié)作也方便寻行,因?yàn)樗吘故茿ndroid Studio的一種默認(rèn)的約定匾荆,大家都熟悉,溝通交流簡(jiǎn)單拦坠。
7.6.2 從Eclipse+ADT中導(dǎo)出
從Eclipse導(dǎo)出剩岳,也非常簡(jiǎn)單,我們首先打開Eclipse晓铆,然后在其中找到我們要導(dǎo)出的工程骄噪,右擊->Export,導(dǎo)出之前確保你的ADT越新越好链蕊,因?yàn)榭赡苡行〣UG會(huì)在新版里修復(fù)滔韵。
選擇導(dǎo)出之后,會(huì)看到一個(gè)對(duì)話框邦马,我們?cè)谄渲姓归_Android宴卖,然后會(huì)看到Generate Gradle Build Files選項(xiàng),選擇它即可随闽,然后就會(huì)打開一個(gè)向?qū)Ц翁罚覀儼凑蚁驅(qū)Р僮鞣治蜁?huì)生成Gradle Android工程需要的Setting和build腳本文件屁桑。
最后我們?cè)俅蜷_Android Studio蘑斧,然后選擇File->Import Project,選擇我們剛剛導(dǎo)出的Android工程目錄沟突,然后Next捕传,一步步即可導(dǎo)入到Android Studio中。
下面我們看下這種方式生成的build.gradle腳本示例
這種方式保留了原來項(xiàng)目的目錄結(jié)構(gòu)职辅,為了達(dá)到這個(gè)目的域携,又讓Android Studio可以識(shí)別該項(xiàng)目,所以Eclipse Export功能對(duì)生成的build.gradle腳本文件做了處理趋观,從上面的例子中我們可以看到锋边,重寫了main這個(gè)SourceSet,為Android Studio指明我們的java文件麸恍、res資源文件搀矫、assets文件、aidl文件以及manifest文件在項(xiàng)目中的位置融欧,這中Android Studio才能識(shí)別他們卦羡,進(jìn)而作為一個(gè)Android工程進(jìn)行編譯構(gòu)建绿饵。
以前的Eclipse+ADT的工程結(jié)構(gòu),單元測(cè)試是放在tests目錄下的刺桃,所以在這里對(duì)其單元測(cè)試目錄進(jìn)行了重新設(shè)置吸祟,指定我們?cè)瓉淼膖ests目錄為其單元測(cè)試根目錄。debug葛碧、和release這兩個(gè)Build Type也類似过吻。
以上兩種遷移方式,大家根據(jù)自己的情況選擇缘琅,不過還是建議大家選擇第一種刷袍,遷移后就用Android Studio的目錄結(jié)構(gòu)來開發(fā),不然會(huì)有很多兼容性的build腳本代碼堆生,以后Android Gradle插件升級(jí)也不容易雷酪,因?yàn)橛袝r(shí)候會(huì)有一些兼容,導(dǎo)致以后的任何變動(dòng)都要小心翼翼蔗怠。
7.7 小結(jié)
這一章介紹了Android Gradle插件吩跋,讓大家對(duì)Android Gradle以及Android Studio工程有一個(gè)簡(jiǎn)單而全面的了解锌钮,也可以基于這些知識(shí)新建自己的Android Gradle工程,并進(jìn)行開發(fā)侵浸,是一個(gè)整體的認(rèn)識(shí)氛谜,了解其中的一些基本的概念值漫。
下幾章會(huì)從一些現(xiàn)實(shí)中的項(xiàng)目使用到的情況來介紹Android Gradle,比如多工程打包,比如發(fā)布庫(kù)工程悔政,比如多渠道打包等等谋国,等這些介紹完之后,相信大家已經(jīng)非常熟悉和使用Android Gradle了捌蚊,然后會(huì)用一章對(duì)Android Gradle做一個(gè)全面的介紹,到時(shí)候會(huì)有很多你沒有見過的配置和功能等等挺智。
本文屬自學(xué)歷程, 僅供參考
詳情請(qǐng)支持原書 Android Gradle權(quán)威指南