1. 程式人生 > >Android Studio3.1.0升級問題記錄

Android Studio3.1.0升級問題記錄

port cor 好的 compile 原則 span ron 們的 borde

每次升級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

Android Studio3.1.0升級問題記錄