每次升級Android Studio時,一般情況下Gradle版本的也會相應的升級,我之前Android Studio 3.0.1、Gradle 是4.1升級后為:Android Studio 3.1.0、Gradle 為4.4。
升級完成后先是報一堆錯(每次都升級都是-。-)
第一個錯如下:
The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin. Perhaps you misspelled something?
翻譯過來就是:
“SourceSet” 的'instrumentTest' 沒有被Android Gradle插件識別。也許你拼錯嗎?
猜想可能Gradle移除了'instrumentTest'關鍵字,網上搜了一下,博客地址如下:http://www.it1352.com/139247.html
新版本Gradle對其做了重命名
即:
舊版本 - > 新版本
instrumentTestCompile - > androidTestCompile
instrumentTest - > androidTest
然后查看了自己所有module的Gradle,發現有一個地方用到了 instrumentTest ,將其改為 androidTest ,然后繼續同步Gradle,然后編譯,這個錯誤不報了。
第二個錯誤如下:
Configuration 'compile' is obsolete and has been replaced with 'implementation'.
It will be removed at the end of 2018
翻譯過來就是:
配置“編譯”已經過時,取而代之的是“實現”。它將在2018年底被移除。
我們知道,在Android Studio3.0開始的時候就將 compile 改為 implementation 關鍵字了,當時,項目中大部分的compile改為了implementation,但是還有一部分沒有改過來,但是仍然可以使用,但是現在呢?尼瑪直接給編譯就報錯!這不是強制性的讓使用 implementation 么?報的錯中提示2018年底才移除,這還沒到年底呢,就不能用了?
還是乖乖的改吧,由於是我們的依賴的library中使用了compile,相當於是library依賴了一個第三方庫,直接改為implementation就相當於屏蔽掉了app對library依賴的第三方庫api的訪問權限,而我們的app剛好用到了library依賴的第三方庫的api,所以直接改為implementation是不行的,要想讓app能訪問到就將其改為 api就可以了,其實這不是一個好的解決辦法,最好的解決辦法是,library中封裝一層app訪問library依賴的第三方庫api的方法,這樣的話app是和library依賴的第三方庫是沒有任何關系的,這樣就降低了app與library依賴的第三方庫的耦合性,這樣也體現了“第三方庫隔離”的原則,如果以后依賴的庫變了,你只需要修改library中依賴的庫及app調用的方法即可,不用動app里面的代碼了~
第三個錯誤如下
Duplicate zip entry [com/c/a/a/a/a.class == 69.jar:com/ta/utdid2/b/a/a.class]
翻譯過來如下:
重復的類,即類所在的包名和類名都相等
一般情況下不會寫包名和類名相同的類,我猜測一定是Jar包重了,仔細找了一下,發現兩個library中都使用了
阿里的httpdns的jar包,只不過是Jar包的版本不一樣,舊版本中其中一個library中使用了 provided 編譯,所以沒有報沖突,現在新版本推薦使用 compileOnly 關鍵字,替換為compileOnly關鍵字后還是報一樣的錯,哎呦!這就納悶了,compileOnly的意思不就是編譯時依賴,不打緊包中的意思嗎?怎么還沖突?仔細查找了一下,發現其中一個library中多了一個混淆規則的jar包(utdid4all-1.1.5.3_proguard.jar),而另外一個沒有,但是舊版本是沒有問題的,我猜測可能是編譯混淆后發現兩個類是一樣的所以就報錯了…
解決辦法一:
兩個library中都添加 utdid4all-1.1.5.3_proguard.jar 使用 compileOnly 關鍵字編譯;
解決辦法二:
兩個library中都不添加 utdid4all-1.1.5.3_proguard.jar;
解決辦法三:
在app中添加一個 utdid4all-1.1.5.3_proguard.jar 進行編譯即可;
至此,以上幾個錯誤都解決完了~
總結
我們應該理解implementation、api、compileOnly等幾個關鍵字的區別,具體見下圖:

最后附上幾個參考鏈接:
https://stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration
更多干貨文章請關注我的微信公眾號: