以下內(nèi)容均為個(gè)人理解,如果有描述不正確的地方,歡迎指正
轉(zhuǎn)載請(qǐng)注明原文鏈接
Gradle簡(jiǎn)介
開始填坑之前,先簡(jiǎn)單聊聊gradle,Gradle其實(shí)就是一個(gè)構(gòu)建項(xiàng)目的工具,也就是把那一個(gè)個(gè)文件、文件夾按照一定的規(guī)則關(guān)聯(lián)起來,形成一個(gè)項(xiàng)目的工具,它其實(shí)不僅僅是用在AndroidStudio上。
我們?cè)贏S中用到的Gradle其實(shí)應(yīng)該被叫做 Android Gradle Plugin,也就是安卓項(xiàng)目上的gradle插件;
Gradle插件會(huì)有版本號(hào),每個(gè)版本號(hào)又對(duì)應(yīng)有一個(gè)或一些 Gradle發(fā)行版本(一般是限定一個(gè)最低版本),也就是我們常見的類似gradle-3.1-all.zip這種東西;
如果這兩個(gè)版本對(duì)應(yīng)不上了,那你的工程構(gòu)建的時(shí)候就會(huì)報(bào)錯(cuò)。
對(duì)應(yīng)關(guān)系如下(參考自 https://developer.android.google.cn):
| 插件版本 | Gradle版本 |
|---|
| 1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
| 1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
| 1.5.0 | 2.2.1 - 2.13 |
| 2.0.0 - 2.1.2 | 2.10 - 2.13 |
| 2.1.3 - 2.2.3 | 2.14.1+ |
| 2.3.0+ | 3.3+ |
| 3.0.0+ | 4.1+ |
Android Studio 3.0 之后自動(dòng)將插件版本升級(jí)到3.0.0,所以我們也需要對(duì)應(yīng)地把Gradle升級(jí)到4.1才行
另外, Android Gradle Plugin又會(huì)跟 Android SDK BuildTool有關(guān)聯(lián),因?yàn)樗€承接著AndroidStudio里的編譯相關(guān)的功能,這也是我們要在項(xiàng)目的 local.properties 文件里寫明Android SDK路徑、在build.gradle 里注明 buildToolsVersion 的原因。
所以 Android Gradle Plugin 本質(zhì)上就是 一個(gè)AS的插件,它一邊調(diào)用 Gradle本身的代碼和批處理工具來構(gòu)建項(xiàng)目,一邊調(diào)用Android SDK的編譯、打包功能,從而讓我們能夠順暢地在AS上進(jìn)行開發(fā)。
升級(jí)Android Gradle Plugin到3.0.1的踩坑之旅
把工程目錄下的build.gradle中,將gradle插件版本升級(jí)到3.0.1
點(diǎn)擊同步gradle,報(bào)錯(cuò)。
提示gradle-wrapper版本過低,gradle-wrapper的作用,就是設(shè)置你的項(xiàng)目工程要對(duì)應(yīng)用那個(gè)Gradle發(fā)行版本來執(zhí)行構(gòu)建,
3.0.1的插件版本必須對(duì)應(yīng)4.1以上的gradle版本,因此需要在../gradle/wrapper/gradle-wrapper.properties文件中把版本號(hào)改為4.1
然后同步gradle。
通常情況下你會(huì)發(fā)現(xiàn)速度特別慢,因?yàn)闆]有翻墻,默認(rèn)是從國外服務(wù)器下載gradle;
這時(shí)候就可以強(qiáng)關(guān)AS,直接在網(wǎng)上找資源,把gradle-4.1-all.zip這個(gè)包,放在
C:\Users\你的用戶名.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew
目錄中(最后那個(gè)亂碼文件夾名字每臺(tái)機(jī)器上不一樣),注意不需要手動(dòng)解壓,然后重啟AS自動(dòng)同步gradle即可;
重啟自動(dòng)同步之后,又報(bào)錯(cuò)。
提示有一些依賴庫無法正常引用,需要添加google maven 倉庫的依賴;
在工程目錄下的build.gradle 文件加上maven依賴即可,
再同步gradle,又報(bào)錯(cuò)。
這次是提示沒有26.0.2版本的 SDK buildTool ,然后直接在AS報(bào)錯(cuò)彈框里點(diǎn)擊下載就可以了。現(xiàn)在SDK可以不用翻墻直接下載,速度還蠻快的。下載確認(rèn)解壓之后再次同步gradle。
同步gradle,此時(shí)又會(huì)報(bào)錯(cuò):
這個(gè)提示,說是需要去掉各個(gè)module的build.gradle中的 buildToolsVersion 的設(shè)置,因?yàn)?.0.1以上的gradle插件會(huì)自動(dòng)用一個(gè)默認(rèn)的BuildTool版本,不需要像以前一樣,在每個(gè)build.gradle里寫明buildToolsVersion了。
所以我們把提示到的各個(gè)build.gradle中的這行刪掉,再重新同步一下gradle,就不會(huì)報(bào)這個(gè)錯(cuò)了。
再次同步gradle,繼續(xù)報(bào)錯(cuò):
需要在app/build.gradle加上默認(rèn)的dimension;大概就是為了保證各個(gè)渠道包要保持某些屬性的一致;總之按照官網(wǎng)上的說法,只要給每個(gè)渠道都設(shè)置一個(gè)“flavorDimensions”就可以了,代碼如下(app/build.gradle)
繼續(xù)同步,繼續(xù)報(bào)錯(cuò)...
這次的錯(cuò)誤提示比較接地氣了,說是build/intermediates/xxxx.xml 里的某個(gè)值沒有找到,這個(gè)簡(jiǎn)單,build目錄下的都是編譯期生成的文件,clean下再來一發(fā);或者直接rebuild項(xiàng)目(rebuild = clean + build)
rebuild項(xiàng)目,仍然報(bào)錯(cuò)
一時(shí)半會(huì)兒不知道怎么搞,看看這個(gè)開發(fā)者文檔鏈接的說明吧,
developer.android.com這個(gè)域名不翻墻是進(jìn)不去的,不過現(xiàn)在已經(jīng)有了國內(nèi)的域名,把域名替換成developer.android.google.cn,后面保持不變就可以訪問了;其他類似的官方文檔地址也一樣可以用這個(gè)方法去訪問。
看了下官方文檔,大意是在說,工程里的某個(gè)module依賴了某個(gè)jar包,然后jar里面又用到了注解,在新的gradle版本里,需要寫新的groovy代碼來對(duì)每個(gè)引用注解的地方單獨(dú)配置。在以往的版本中,gradle會(huì)默認(rèn)給每個(gè)module都依賴一個(gè)annotationProcess,導(dǎo)致很多多余的對(duì)annotationProcess的依賴,老版本中的默認(rèn)方法,會(huì)在將來版本中被刪除。
按照提示,解決方案大致有兩個(gè):
要么我們需要在依賴于注解的module中,加上“annotationProcessor”這個(gè)配置;
要么我們可以設(shè)置android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true,但是要注意這玩法以后會(huì)被刪除
按照官方推薦的第一種方法:應(yīng)該是在報(bào)錯(cuò)的build.gradle中修改:
但是我加上了并沒有什么作用,原因待查..
為了節(jié)約時(shí)間,還是先用includeCompileClasspath=true的辦法湊合下吧,以后真的被刪除了再說...
直接在app/build.gradle(準(zhǔn)確的說是每個(gè)涉及到注解依賴的module的build.gradle)上加一行
然后再次同步gradle
同步gradle,不出意外的又報(bào)錯(cuò)了。
一堆的style屬性未找到的問題,跟第六步里的現(xiàn)象貌似是一樣的
這才發(fā)現(xiàn)其實(shí)clean是沒有用的,真正的問題原因在一堆錯(cuò)誤的最后幾行
AAPT2 , 貌似就是aapt的2.0版本?
aapt.exe 是 Android SDK里的一個(gè)工具,詳情出門左轉(zhuǎn)自己查去..
直接說解決方案:
在Project/gradle.properties中添加 android.enableAapt2=false
再次同步...
嗯,沒錯(cuò),又報(bào)錯(cuò)了。
這個(gè)錯(cuò)跟7號(hào)有點(diǎn)類似,又是新版本gradle插件不支持某些方法啦,又要換用新的寫法才行啦...然后最后給你貼一個(gè)文檔地址自己看去。。
大概就是說:現(xiàn)在不支持manifestOutputFile這個(gè)方法,要用processManifest.manifestOutputDirectory()來替換,
也就是你app/build.gradle 打包的這一段代碼要重新寫一下;一般我們都會(huì)在build.gradle中編寫這樣的代碼,來實(shí)現(xiàn)對(duì)Manifest文件的修改、以及自定義apk的輸出文件名等。
改了之后還是報(bào)錯(cuò),還是這里,連續(xù)各種錯(cuò)
比如
比如
比如
反正就是各種各樣的groovy語法報(bào)錯(cuò),然而并不懂groovy語法,現(xiàn)學(xué)現(xiàn)賣改一改
我們工程里是既有動(dòng)態(tài)修改manifest文件的需求,也有自定義apk名字的功能,
包括自動(dòng)修改apk名稱的代碼也有報(bào)錯(cuò),也要改,最終改成了這樣
至此再次同步gradle,總算是沒有再報(bào)錯(cuò)了,AS上可以正常運(yùn)行代碼了。
我們的全部修改都只涉及到gradle的配置代碼,所以不會(huì)對(duì)項(xiàng)目里的業(yè)務(wù)邏輯產(chǎn)生任何影響。
這時(shí)候再打個(gè)包,驗(yàn)證下我們的最后一段打包相關(guān)的gradle腳本是否正常運(yùn)行.打包成功了,也就全部OK了。
參考文獻(xiàn)
谷歌爸爸的文檔:
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html