Android Studio3.1.0升級問題記錄


 

每次升級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://docs.gradle.org/current/userguide/java_library_plugin.html#sec:java_library_configurations_graph

https://stackoverflow.com/questions/44413952/gradle-implementation-vs-api-configuration

更多干貨文章請關注我的微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM