每次升级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升级问题记录的更多相关文章

  1. 【Android Studio安装部署系列】三十六、从Android Studio3.1.4升级到Android studio3.2【以及创建android p模拟器(未成功)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 因为想要使用Android P模拟器,所以需要将Android Studio升级到3.2版本以上. 按照官网的说法:参考<ht ...

  2. Android Studio3.1.2升级问题:Configuration 'compile' is obsolete and has been replaced with 'implementation'.

    每次升级Android Studio时,一般情况下Gradle版本的也会相应的升级,我之前Android Studio 3.0.1.Gradle 是4.1升级后为:Android Studio 3.1 ...

  3. 【Android】Android6.0读取通话记录

    需求:读取通话记录,然后列表显示,每条记录的数据包括姓名.号码.类型(来电.去电.未接,字体颜色分别为绿.蓝.红),然后长按条目弹出一个列表弹窗,显示[复制号码到拨号盘].[发短信].[打电话]. 先 ...

  4. 【Android Studio安装部署系列】三十、从Android studio2.2.2升级到Android studio3.0之路

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 Android Studio 3.0的新功能 https://mp.weixin.qq.com/s/2XmVG4mKEDX6-bvZ ...

  5. 【Android Studio安装部署系列】三十五、从Android studio3.0.1升级到Android studio3.1.4【以及创建android p模拟器的尝试(未成功)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 因为想要使用Android P模拟器,所以需要将Android Studio升级到3.1版本以上. Android P模拟器的最低版 ...

  6. 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...

  7. Android studio3.0打开Device File Explore(文件管理器)的方法(图文教程)

    Android studio3.0打开Device File Explore(文件管理器)的方法(图文教程) 看到网上AS3.0新增加的查看手机文件的新功能,全部都是转载的,没有几个人心细的把如何打开 ...

  8. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  9. Android Studio3.0 新特性 ~ New Features in Android Studio Preview (译文)

    原文地址:https://developer.android.google.cn/studio/preview/features/index.html 最新Android Studio版本是Andro ...

随机推荐

  1. Java学习关于集合框架的基础接口--Collection接口

     集合框架(Collection  Framework)是Java最强大的子系统之一,位于java.util 包中.集合框架是一个复杂的接口与和类层次,提供了管理对象组的最新技术.Java集合框架标准 ...

  2. 解决Can’t finish GitHub sharing process Successfully created project ‘GitHubDemo’ on GitHub

    Can't finish GitHub sharing process        Successfully created project 'KeyWordsFrameWork' on GitHu ...

  3. loadrunner 场景设计-手工场景设计

    概述 通过选择需要运行的脚本,分配运行脚本的负载生成器,在脚本中分配Vuser来建立手工场景 手工场景就是自行设置虚拟用户的变化,主页是通过设计用户的添加和减少过程,来模拟真实的用户请求模型,完成负载 ...

  4. zoj 2201 No Brainer

    No Brainer Time Limit: 2 Seconds      Memory Limit: 65536 KB Zombies love to eat brains. Yum. Input ...

  5. Relocation(状压DP)

    Description Emma and Eric are moving to their new house they bought after returning from their honey ...

  6. Swift--错误集:Class controller has not initializers

    bug错误图 解决方法: 如下图所示,visitor这个属性并没有拆包处理,及将UIViewController的子类中的变量全部进行拆包处理,就是在变量声明的时候加一个?号,在使用的时候拆包处理,加 ...

  7. Es首页

    https://www.elastic.co/guide/en/elasticsearch/reference/index.html

  8. THUPC2018看题总结

    THUPC2018看题总结 #6387. 「THUPC2018」绿绿与串串 / String 据说是签到题啊. 首先根据题目的意思,我们发现如果能找到那个最后一次选择的对称轴岂不是美滋滋. 自然地,我 ...

  9. Win7中你所应该知道的强制计划关机操作

    有时候更新系统补丁时,需要很长时间,为了能让电脑在你晚上睡觉后,扔然能做些枯燥费时类的这种工作,你可以用到强制计划关机.cmd命令是: shutdown -f -s -t 3600 上面的意思是,强制 ...

  10. Meteor核心API

    在本教程中,我们将介绍学习Meteor核心API. 如果你想限制代码只在服务器或客户端可以使用下面的代码运行 - meteorApp.js if (Meteor.isClient) { // Code ...