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 
版权声明:本文为博主原创文章,转载请附上博文链接!

没有更多推荐了,返回首页