Android Studio3.1.0升級問題記錄

 

每次升級Android Studio時,通常狀況下Gradle版本的也會相應的升級,我以前Android Studio 3.0.一、Gradle 是4.1升級後爲:Android Studio 3.1.0、Gradle 爲4.4。html

升級完成後先是報一堆錯(每次都升級都是-。-)java

第一個錯以下:

The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin. Perhaps you misspelled something?

翻譯過來就是:python

「SourceSet」 的'instrumentTest' 沒有被Android Gradle插件識別。也許你拼錯嗎?

猜測可能Gradle移除了'instrumentTest'關鍵字,網上搜了一下,博客地址以下:http://www.it1352.com/139247.htmlandroid

新版本Gradle對其作了重命名api

即:bash

舊版本 - > 新版本

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

翻譯過來就是:app

配置「編譯」已通過時,取而代之的是「實現」。它將在2018年末被移除。

咱們知道,在Android Studio3.0開始的時候就將 compile 改成 implementation 關鍵字了,當時,項目中大部分的compile改成了implementation,可是還有一部分沒有改過來,可是仍然可使用,可是如今呢?尼瑪直接給編譯就報錯!這不是強制性的讓使用 implementation 麼?報的錯中提示2018年末才移除,這還沒到年末呢,就不能用了?ide

仍是乖乖的改吧,因爲是咱們的依賴的library中使用了compile,至關因而library依賴了一個第三方庫,直接改成implementation就至關於屏蔽掉了app對library依賴的第三方庫api的訪問權限,而咱們的app恰好用到了library依賴的第三方庫的api,因此直接改成implementation是不行的,要想讓app能訪問到就將其改成 api就能夠了,其實這不是一個好的解決辦法,最好的解決辦法是,library中封裝一層app訪問library依賴的第三方庫api的方法,這樣的話app是和library依賴的第三方庫是沒有任何關係的,這樣就下降了app與library依賴的第三方庫的耦合性,這樣也體現了「第三方庫隔離」的原則,若是之後依賴的庫變了,你只須要修改library中依賴的庫及app調用的方法便可,不用動app裏面的代碼了~gradle

第三個錯誤以下

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

更多幹貨文章請關注個人微信公衆號:

相關文章
相關標籤/搜索