標籤:pos pac ora httpdns family neu dup miss 移除
每次升級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升級問題記錄