日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android Gradle的理解以及升級Gradle插件3.0.1遇到的坑

 quasiceo 2018-06-22

Android Gradle的理解以及升級Gradle插件3.0.1遇到的坑

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

以下內(nèi)容均為個人理解,如果有描述不正確的地方,歡迎指正
轉(zhuǎn)載請注明原文鏈接

Gradle簡介

開始填坑之前,先簡單聊聊gradle,Gradle其實就是一個構(gòu)建項目的工具,也就是把那一個個文件、文件夾按照一定的規(guī)則關(guān)聯(lián)起來,形成一個項目的工具,它其實不僅僅是用在AndroidStudio上。

我們在AS中用到的Gradle其實應(yīng)該被叫做 Android Gradle Plugin,也就是安卓項目上的gradle插件;
Gradle插件會有版本號,每個版本號又對應(yīng)有一個或一些 Gradle發(fā)行版本(一般是限定一個最低版本),也就是我們常見的類似gradle-3.1-all.zip這種東西;

如果這兩個版本對應(yīng)不上了,那你的工程構(gòu)建的時候就會報錯。
對應(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 之后自動將插件版本升級到3.0.0,所以我們也需要對應(yīng)地把Gradle升級到4.1才行

另外, Android Gradle Plugin又會跟 Android SDK BuildTool有關(guān)聯(lián),因為它還承接著AndroidStudio里的編譯相關(guān)的功能,這也是我們要在項目的 local.properties 文件里寫明Android SDK路徑、在build.gradle 里注明 buildToolsVersion 的原因。

所以 Android Gradle Plugin 本質(zhì)上就是 一個AS的插件,它一邊調(diào)用 Gradle本身的代碼和批處理工具來構(gòu)建項目,一邊調(diào)用Android SDK的編譯、打包功能,從而讓我們能夠順暢地在AS上進(jìn)行開發(fā)。

升級Android Gradle Plugin到3.0.1的踩坑之旅

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

  2. 點擊同步gradle,報錯。
    提示gradle-wrapper版本過低,gradle-wrapper的作用,就是設(shè)置你的項目工程要對應(yīng)用那個Gradle發(fā)行版本來執(zhí)行構(gòu)建,
    3.0.1的插件版本必須對應(yīng)4.1以上的gradle版本,因此需要在../gradle/wrapper/gradle-wrapper.properties文件中把版本號改為4.1

    然后同步gradle。
    通常情況下你會發(fā)現(xiàn)速度特別慢,因為沒有翻墻,默認(rèn)是從國外服務(wù)器下載gradle;
    這時候就可以強關(guān)AS,直接在網(wǎng)上找資源,把gradle-4.1-all.zip這個包,放在

    C:\Users\你的用戶名.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew

    目錄中(最后那個亂碼文件夾名字每臺機器上不一樣),注意不需要手動解壓,然后重啟AS自動同步gradle即可;

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

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

  5. 同步gradle,此時又會報錯:

    這個提示,說是需要去掉各個module的build.gradle中的 buildToolsVersion 的設(shè)置,因為3.0.1以上的gradle插件會自動用一個默認(rèn)的BuildTool版本,不需要像以前一樣,在每個build.gradle里寫明buildToolsVersion了。
    所以我們把提示到的各個build.gradle中的這行刪掉,再重新同步一下gradle,就不會報這個錯了。

  6. 再次同步gradle,繼續(xù)報錯:

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

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

  8. rebuild項目,仍然報錯

    一時半會兒不知道怎么搞,看看這個開發(fā)者文檔鏈接的說明吧,
    developer.android.com這個域名不翻墻是進(jìn)不去的,不過現(xiàn)在已經(jīng)有了國內(nèi)的域名,把域名替換成developer.android.google.cn,后面保持不變就可以訪問了;其他類似的官方文檔地址也一樣可以用這個方法去訪問。

    看了下官方文檔,大意是在說,工程里的某個module依賴了某個jar包,然后jar里面又用到了注解,在新的gradle版本里,需要寫新的groovy代碼來對每個引用注解的地方單獨配置。在以往的版本中,gradle會默認(rèn)給每個module都依賴一個annotationProcess,導(dǎo)致很多多余的對annotationProcess的依賴,老版本中的默認(rèn)方法,會在將來版本中被刪除。

    按照提示,解決方案大致有兩個:
    要么我們需要在依賴于注解的module中,加上“annotationProcessor”這個配置;
    要么我們可以設(shè)置android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true,但是要注意這玩法以后會被刪除

    按照官方推薦的第一種方法:應(yīng)該是在報錯的build.gradle中修改:

    但是我加上了并沒有什么作用,原因待查..
    為了節(jié)約時間,還是先用includeCompileClasspath=true的辦法湊合下吧,以后真的被刪除了再說...

    直接在app/build.gradle(準(zhǔn)確的說是每個涉及到注解依賴的module的build.gradle)上加一行

    然后再次同步gradle

  9. 同步gradle,不出意外的又報錯了。
    一堆的style屬性未找到的問題,跟第六步里的現(xiàn)象貌似是一樣的

    這才發(fā)現(xiàn)其實clean是沒有用的,真正的問題原因在一堆錯誤的最后幾行

    AAPT2 , 貌似就是aapt的2.0版本?
    aapt.exe 是 Android SDK里的一個工具,詳情出門左轉(zhuǎn)自己查去..
    直接說解決方案:
    在Project/gradle.properties中添加 android.enableAapt2=false
    再次同步...

  10. 嗯,沒錯,又報錯了。

    這個錯跟7號有點類似,又是新版本gradle插件不支持某些方法啦,又要換用新的寫法才行啦...然后最后給你貼一個文檔地址自己看去。。
    大概就是說:現(xiàn)在不支持manifestOutputFile這個方法,要用processManifest.manifestOutputDirectory()來替換,

    也就是你app/build.gradle 打包的這一段代碼要重新寫一下;一般我們都會在build.gradle中編寫這樣的代碼,來實現(xiàn)對Manifest文件的修改、以及自定義apk的輸出文件名等。

  11. 改了之后還是報錯,還是這里,連續(xù)各種錯

    比如

    比如

    比如

    反正就是各種各樣的groovy語法報錯,然而并不懂groovy語法,現(xiàn)學(xué)現(xiàn)賣改一改
    我們工程里是既有動態(tài)修改manifest文件的需求,也有自定義apk名字的功能,
    包括自動修改apk名稱的代碼也有報錯,也要改,最終改成了這樣

  12. 至此再次同步gradle,總算是沒有再報錯了,AS上可以正常運行代碼了。
    我們的全部修改都只涉及到gradle的配置代碼,所以不會對項目里的業(yè)務(wù)邏輯產(chǎn)生任何影響。
    這時候再打個包,驗證下我們的最后一段打包相關(guān)的gradle腳本是否正常運行.打包成功了,也就全部OK了。

參考文獻(xiàn)

谷歌爸爸的文檔:
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html


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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多