1. 程式人生 > >android studio 3.1 升級gradle4.4時所踩到的坑

android studio 3.1 升級gradle4.4時所踩到的坑

轉載自:https://blog.csdn.net/Public_x/article/details/80224838

 

公司原專案是使用Android studio 2.3編譯的,最近將Android studio升級到3.1後,build apk 時提示:

The project is using an unsupported version of Gradle.
        意思是Gradle版本過低。沒有辦法,只能升級Gradle了。專案使用的Gradle是3.3版本的,而Android studio3.1 所使用的Gradle版本是4.4,點選升級之後,重新編譯,這時候問題來了:

Error:Unable to load class 'org.gradle.api.internal.component.Usage'
        編譯報錯,顯示找不到該類。一開始懷疑是Gradle包的問題,把整個.gradle檔案刪除再下載還是行不通,一番反覆試驗之後,終於明白該類在gradle4.4版本被更改了名字,是因為專案內使用了

'com.novoda:bintray-release:0.4.0'
這個依賴的緣故。將該庫升級到0.5.0的版本後,還是報錯

Error:No such property: FOR_RUNTIME for class: org.gradle.api.attributes.Usage
隨後將該庫升級到0.8.0的版本,終於是編譯通過這個坎。

        但是一個坎後面還有一個坎,緊接著編譯再次報錯,提示:

Configuration 'compile' is obsolete and has been replaced with 'implementation'.
It will be removed at the end of 2018
  意思是“compile”已經過時,需要使用“implementation”關鍵字。

  將依賴全部把“compile”改為“implementation”,編譯可以通過這道坎了,結果後一道坎接踵而來,編譯再次報錯!報錯內容樓主已經找不到了,大意為專案中某個module的依賴被隱藏於內部,獲取不到——這又是為什麼呢?原來,是因為新換的“implementation”的原因!

 android gradle tools 3.X 中依賴,implement、api 指令

這篇文章中提到:

api 指令
完全等同於compile指令,沒區別,你將所有的compile改成api,完全沒有錯。
 
implement指令
這個指令的特點就是,對於使用了該命令編譯的依賴,對該專案有依賴的專案將無法訪問到使用該命令編譯的依賴中的任何程式,也就是將該依賴隱藏在內部,而不對外部公開
原來如此,雖然系統提示應將“compile”替換成“implementation”,但與之等價的應該是“api”才對。

        將“implementation”換成“api”後,編譯通過這道坎,但是這就完了嗎?這就——完了嗎?

        並!沒!有!

        你可以想象樓主當時的心情是多麼崩潰,但是這不是最初的報錯,也並不是最後的——

        

[java] view plain copy
<code class="language-java">All flavors must now belong to a named flavor dimension.Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html </code>  
原來是 Plugin 3.0.0 之後,引入了一個新的依賴機制flavorDimensions ,用於基於多個標準構建多個版本,官方文件用法如下:

// Specifies two flavor dimensions.
flavorDimensions "tier", "minApi"
 
productFlavors {
     free {
      // Assigns this product flavor to the "tier" flavor dimension. Specifying
      // this property is optional if you are using only one dimension.
      dimension "tier"
      ...
    }
 
    paid {
      dimension "tier"
      ...
    }
 
    minApi23 {
        dimension "minApi"
        ...
    }
 
    minApi18 {
        dimension "minApi"
        ...
    }
}
需要為所有的版本都指定dimension。

最後的最後,編譯過了這道坎之後,樓主終於迎來最後一道坎——幸運的是這道坎之前在樓主的某個開發群中也有群友提過這個問題,所以樓主解決的很快,那就是——

Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
這個問題原因是因為android studio3.0 是預設把AApt2開啟的,解決起來也非常簡單,只需要gradle.properties檔案中,添上android.enableAapt2=false,問題得以解決。

折騰了大半天,樓主gradle4.4的升級之旅終於得以結束。
--------------------- 
作者:Public_x 
來源:CSDN 
原文:https://blog.csdn.net/Public_x/article/details/80224838 
版權宣告:本文為博主原創文章,轉載請附上博文連結!