小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Android Gradle的理解以及升級(jí)Gradle插件3.0.1遇到的坑

 quasiceo 2018-06-22

Android Gradle的理解以及升級(jí)Gradle插件3.0.1遇到的坑

96 
大魚魚小仙人 
2017.12.13 10:46* 字?jǐn)?shù) 2931 閱讀 14805評(píng)論 6

以下內(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.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.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的踩坑之旅

  1. 把工程目錄下的build.gradle中,將gradle插件版本升級(jí)到3.0.1

  2. 點(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即可;

  3. 重啟自動(dòng)同步之后,又報(bào)錯(cuò)。
    提示有一些依賴庫無法正常引用,需要添加google maven 倉庫的依賴
    在工程目錄下的build.gradle 文件加上maven依賴即可,

  4. 再同步gradle,又報(bào)錯(cuò)。
    這次是提示沒有26.0.2版本的 SDK buildTool ,然后直接在AS報(bào)錯(cuò)彈框里點(diǎn)擊下載就可以了。現(xiàn)在SDK可以不用翻墻直接下載,速度還蠻快的。下載確認(rèn)解壓之后再次同步gradle。

  5. 同步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ò)了。

  6. 再次同步gradle,繼續(xù)報(bào)錯(cuò):

    需要在app/build.gradle加上默認(rèn)的dimension;大概就是為了保證各個(gè)渠道包要保持某些屬性的一致;總之按照官網(wǎng)上的說法,只要給每個(gè)渠道都設(shè)置一個(gè)“flavorDimensions”就可以了,代碼如下(app/build.gradle)

  7. 繼續(xù)同步,繼續(xù)報(bào)錯(cuò)...
    這次的錯(cuò)誤提示比較接地氣了,說是build/intermediates/xxxx.xml 里的某個(gè)值沒有找到,這個(gè)簡(jiǎn)單,build目錄下的都是編譯期生成的文件,clean下再來一發(fā);或者直接rebuild項(xiàng)目(rebuild = clean + build)

  8. 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

  9. 同步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
    再次同步...

  10. 嗯,沒錯(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的輸出文件名等。

  11. 改了之后還是報(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ò),也要改,最終改成了這樣

  12. 至此再次同步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


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多