Android Studio3.1.0升级问题记录

Stella981
• 阅读 690

每次升级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等几个关键字的区别,具体见下图:

Android Studio3.1.0升级问题记录 这里写图片描述

最后附上几个参考链接:

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Service starting has been prevented by iaware or trustsbase sInfo ServiceInfo 解决方法
问题:ActivityManager:ServicestartinghasbeenpreventedbyiawareortrustsbasesInfoServiceInfo{c50ea35xxx.xxx.xxx.ServiceName}问题描述,该问题再华为部分手机升级到Android10.1之后,启动服务会
Stella981 Stella981
2年前
Android Studio 3.0 下 Cordova 打包时 Gradle 兼容性问题解决
升级到AndroidStudio3.0,Gradle升级为4.3.1版本,使用cordovabuildandroid出错.解决方案:windows系统以下命令行在MINGW的bash窗口中执行1.下载文件https://downloads.gradle.org/distributions/gradle4.3.1
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这