昨天做项目迁移到studio 3.0的,升级3.0后遇到了好多问题,没成想还是从折腾到了了一下午,不过结果还不错,成功的跑起来了项目. 列出踩过的坑,希望后面需要升级的小伙伴遇到类似的问题可以做个参考;
1.升级安装
升级方法:
直接用自带的更新工具
操作步骤: >菜单栏>Android Studio>Check for Updates..(前提网络要绝对的畅通,你懂的)
注意:这种升级办法都是只能升级到最新的版本手动的下载指定版本
下载地址https://developer.android.google.cn/studio/archive.html#android-studio-3-0?utm_source=androiddevtools.cn&utm_medium=website (国内可以访问)增量更新到指定版本
请参考文章:Android Studio增量更新(Mac)
三种方法看你需求,我选择了第三种办法
升级完成后,打开原有项目,在经过一段时间到indexing后
如果你的项目可以运行,OK,恭喜你,接下来的内容,你可以选择忽略,因为你的项目很完美,啥问题没有;
如果项目存在配置的问题,那么有可能会产生如下问题:
1.一直卡在Refreshing项目
我出现了
这种提示,在正常的流程中,会首先出现这个提示,意思是升级现在项目的编译插件,相信之前升级过AS版本的同学在第一次运行新版本的时候见过这个提示,直接点击update按钮就行了.如果不想接着踩坑那么点击Dont’t reminmd me againg for this project按钮就可以了,它代表你还是用之前版本的插件来运行当前项目,也就不会出现后面一大串的问题;
这里直接点击update按钮;
点击之后如果你网络不畅通的话就会一直的
之所以会这样,是因为
点击该按钮后实际上做了两件事情
-
在主项目的build.gradle文件中的dependencies节点中更改了
//原先的插件版本 classpath 'com.android.tools.build:gradle:2.3.3' //更改后的插件版本 classpath 'com.android.tools.build:gradle:3.0.1'
-
在项目目录中的gradle > gradle-wrapper.properties文件中的distributionUrl字段更改了
//原先的插件版本 distributionUrl=https://services.gradle.org/distributions/gradle-3.3-all.zip //更改后的插件版本 distributionUrl=https://services.gradle.org/distributions/gradle-4.1-all.zip
这两个文件修改后AS就会去下载https://services.gradle.org/distributions/gradle-4.1-all.zip这个文件,不用点什么,就等AS下载完吧(基本完不了)
这里解决方案:
前提条件是先把该文件下载下来,下载地址https://services.gradle.org/distributions/gradle-4.1-all.zip。
找到.gradle文件夹路径:用户/(当前用户目录)/.gradle,解压下载好的文件到该目录中,关闭AS,重新打开(亲测);
2.修改输出apk的文件名导致的异常
第一条问题解决后,出现了
点击Open File定位到应用级别的build.gradle文件中的这个位置
applicationVariants.all { variant ->
variant.outputs.each { output ->
def oldFile = output.outputFile
def releaseApkName = "fn" + "_v" + defaultConfig.versionName + "_${getDate()}"+"_${buildType}.apk"
output.outputFile = new File(oldFile.parent, releaseApkName)
}
这个是自己之前配置的可以控制AS输出的apk文件的名称,新版本不能这样配置了,看官方的引导可以改成
applicationVariants.all { variant ->
variant.outputs.all { output ->
def releaseApkName = "fn" + "_v" + defaultConfig.versionName + "_${getDate()}"+"_${buildType}.apk"
outputFileName = releaseApkName
}
}
效果和之前差不多,直接更改。
3. 之前项目中配置了第三方APT插件导致的异常
Google最终得知和新版本AS3.0中自带了APT处理插件有关,因为自己之前配置的第三方的APT插件,所有它们冲突了~,那么移除则解决
移除步骤
- 在项目级别的build.gradle也就是最外层的build.gradle文件中的dependencies节点中,移除
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
- 在应用级别的build.gradle的顶部移除
apply plugin: 'android-apt'
- 在应用级别的build.gradle的dependencies节点中,替换所有用apt开头的引依赖为annotationProcessor例如
//替换之前
apt "com.jakewharton:butterknife-compiler:$rootProject.ext.butterknifeVersion"
//替换之后
annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.ext.butterknifeVersion"
如果有其他的apt插件,则可按照该方法解决。上面三步操作完成后,同步项目,问题解决
4.BuildTool最低版本异常
这个异常出现就显而易见了,AS3.0最低支持的BuildTools插件是26.0.2版本,别问我BuildTools是啥,我也不知道(顾名思义,AS的编译工具);BuildTools的版本改到26.0.2版本;同步代码就好了,如果你的SDK中没有下载BuildTools26.0.2版本,AS会自动的提示你去下载,下载完同步代码,即可解决问题;
5.BuildTool库项目版本不统一问题*
AS3.0对于库项目的build.gradle的配置也进行了干预,官方说可以加快编译速度,想想也是,库项目都用不同版本的BuildTool,编译起来肯定慢;所以这里点击Open File之后,定位到的build.gradle文件,修改里面的buildToolsVersion节点为26.0.2即可解决问题。
建议:如果项目中的库项目较多,建议将buildToolsVersion版本配置到gradle.properties文件中,然后项目中的库项目都引用该配置,改一处,则整个项目的buildToolsVersion配置都改了。
6.multidex版本异常
这个问题说的是AS3.0解析multidex1.0.2版本失败,为什么失败?
因为现在google自家的依赖,全部都收回到了自家的CDN服务器了,之前在项目级的build.gradle文件中的repositories节点中配置jenter(),就可以获取大部分的依赖(虽然慢了点),但是现在Google官方需要我们在repositories节点中配置上google(),作用就是获取自家的依赖,而原先的jcenter()不需要动;而multidex是Google的依赖所以只用之前的jcenter(),肯定是解析不到它了。
配置如下:
repositories {
google()//新增的
jcenter()
}
注意:项目级的build.gradle文件中的有两个repositories节点,都配置上google(),并且将google()这个放在最前面
同步项目。
7.AAPT2编译异常
这一大串的异常在编译的时候报出,我在第一次导入项目的时候遇到了,第二次导入其它项目的时候,竟然没有遇到,对比之下得出问题是出在配置了高版本的support包的问题,当你把项目所有support包的版本配置到25.2.0的时候什么问题都没有,但是配置成26.0.0或者27.0.0版本的时候就会出现这个问题(亲测);
解决方法
- 使用低版本的support包,把项目所有support包的版本配置到25.2.0或者其它较低的版本
- 配置gradle.properties中关闭AAPT2编译,就是在其中增加android.enableAapt2=false配置,再次编译问题解决(推荐),例如
android.enableAapt2=false
同步代码,问题解决。
8、方法找不到异常或者AndroidManifest.xml中/样式文件某个标签找不到
这异常产生的的原因是因为如果你升级了support包的版本的时候compileSdkVersion的版本没有更改,亲测如果你的support包更改到了26.0.0或以上的话,需要更改项目中所有的compileSdkVersion为26或以上。
compileSdkVersion = 26
更改好,同步代码,问题解决。
9.Could not find com.android.tools.build:gradle:3.0.0.
这方法是因为我使用增量更新的方法升级的Android Studio的,升级的版本在https://dl.google.com/android/studio/patches/updates.xml
这里面看的版本3.0.0.8,而我在项目级别的gradle里面配置的
classpath 'com.android.tools.build:gradle:3.0.0'
定位是这导致的,我就改成了
classpath 'com.android.tools.build:gradle:3.0.1'
10.依赖配置修改
因为plugin 3.0使用了gradle 4.0版本,所以有必要先介绍下,Gradle 3.4 推出了新的Java library plugin 配置:允许控制发布以编译和运行时类路径(用于模块间依赖)
1)绿色方块:使用者可以使用的依赖,比如:app配置library的依赖
2)粉色方块:组件对library:编译时或者运行时
3)蓝色:组件内部使用,注意这里是不用传递的,比如a依赖b, b依赖c, 但是a不能获取c的配置
4)白色:配置集成自java plugin
OK,了解了gradle 3.4的新java plugin library依赖关系,因为android plugin 3.0使用gradle 4.0,所以这些自然也会引入了,下面这张表可以简单说明:
最后将build.gradle下的依赖中的
compile 改为api
provided 改为compileOnly
testCompile 改为testImplementation ;
修改的前后对照如下代码所示:
修改前
compile fileTree(include: ['*.jar'], dir: 'libs')
compile "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion"
compile "com.android.support:cardview-v7:$rootProject.ext.supportLibraryVersion"
// 注解
provided 'javax.annotation:jsr250-api:1.0'
debugCompile 'com.antfortune.freeline:runtime:0.8.8'
testCompile "junit:junit:$rootProject.ext.junitVersion"
androidTestCompile "com.android.support.test:runner:$rootProject.ext.runnerVersion"
修改后
api fileTree(include: ['*.jar'], dir: 'libs')
api "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion"
api "com.android.support:cardview-v7:$rootProject.ext.supportLibraryVersion"
// 注解
compileOnly 'javax.annotation:jsr250-api:1.0'
debugImplementation 'com.antfortune.freeline:runtime:0.8.8'
testImplementation "junit:junit:$rootProject.ext.junitVersion"
androidTestImplementation "com.android.support.test:runner:$rootProject.ext.runnerVersion"
注意:compile,provided,apk 这些过时的依赖现在可以使用,但是在下个版本会移除,所以Google给我们一些时间使用。
改完后,编译运行也通过了。(猜测是3.0.0.8版本要写三个数字为3.0.1)
好了,最后AS3.0终于可以使用了 ,项目也能正常跑起来了。
最后当然希望对大家有帮助啦。
参考文章:
Android Studio 3.0 升级 配置修改详解
迁移到Android Studio 3.0
迁移3.0.0
老项目迁移AndroidStudio3.0带你踩完所有坑~