老项目迁移至Android Studio 3.0遇到的坑

2018-07-03  本文已影响56人  wfunny

昨天做项目迁移到studio 3.0的,升级3.0后遇到了好多问题,没成想还是从折腾到了了一下午,不过结果还不错,成功的跑起来了项目. 列出踩过的坑,希望后面需要升级的小伙伴遇到类似的问题可以做个参考;

1.升级安装

升级方法:

  1. 直接用自带的更新工具
    操作步骤: >菜单栏>Android Studio>Check for Updates..(前提网络要绝对的畅通,你懂的)
    注意:这种升级办法都是只能升级到最新的版本

  2. 手动的下载指定版本
    下载地址https://developer.android.google.cn/studio/archive.html#android-studio-3-0?utm_source=androiddevtools.cn&utm_medium=website (国内可以访问)

  3. 增量更新到指定版本
    请参考文章:Android Studio增量更新(Mac)

三种方法看你需求,我选择了第三种办法

升级完成后,打开原有项目,在经过一段时间到indexing后
如果你的项目可以运行,OK,恭喜你,接下来的内容,你可以选择忽略,因为你的项目很完美,啥问题没有;
如果项目存在配置的问题,那么有可能会产生如下问题:

1.一直卡在Refreshing项目

我出现了


gradle插件不匹配

这种提示,在正常的流程中,会首先出现这个提示,意思是升级现在项目的编译插件,相信之前升级过AS版本的同学在第一次运行新版本的时候见过这个提示,直接点击update按钮就行了.如果不想接着踩坑那么点击Dont’t reminmd me againg for this project按钮就可以了,它代表你还是用之前版本的插件来运行当前项目,也就不会出现后面一大串的问题;

这里直接点击update按钮;
点击之后如果你网络不畅通的话就会一直的


Refreshing项目.png

之所以会这样,是因为
点击该按钮后实际上做了两件事情

这里解决方案:
前提条件是先把该文件下载下来,下载地址https://services.gradle.org/distributions/gradle-4.1-all.zip

找到.gradle文件夹路径:用户/(当前用户目录)/.gradle,解压下载好的文件到该目录中,关闭AS,重新打开(亲测);

2.修改输出apk的文件名导致的异常

第一条问题解决后,出现了


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插件导致的异常
apt插件问题

Google最终得知和新版本AS3.0中自带了APT处理插件有关,因为自己之前配置的第三方的APT插件,所有它们冲突了~,那么移除则解决
移除步骤

  1. 在项目级别的build.gradle也就是最外层的build.gradle文件中的dependencies节点中,移除
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
  1. 在应用级别的build.gradle的顶部移除
    apply plugin: 'android-apt'
  1. 在应用级别的build.gradle的dependencies节点中,替换所有用apt开头的引依赖为annotationProcessor例如
    //替换之前
    apt  "com.jakewharton:butterknife-compiler:$rootProject.ext.butterknifeVersion"
    //替换之后
    annotationProcessor  "com.jakewharton:butterknife-compiler:$rootProject.ext.butterknifeVersion"

如果有其他的apt插件,则可按照该方法解决。上面三步操作完成后,同步项目,问题解决

4.BuildTool最低版本异常
buildTool最低版本异常

这个异常出现就显而易见了,AS3.0最低支持的BuildTools插件是26.0.2版本,别问我BuildTools是啥,我也不知道(顾名思义,AS的编译工具);BuildTools的版本改到26.0.2版本;同步代码就好了,如果你的SDK中没有下载BuildTools26.0.2版本,AS会自动的提示你去下载,下载完同步代码,即可解决问题;

5.BuildTool库项目版本不统一问题*
BuildTool库项目版本不统一问题.png

AS3.0对于库项目的build.gradle的配置也进行了干预,官方说可以加快编译速度,想想也是,库项目都用不同版本的BuildTool,编译起来肯定慢;所以这里点击Open File之后,定位到的build.gradle文件,修改里面的buildToolsVersion节点为26.0.2即可解决问题。

建议:如果项目中的库项目较多,建议将buildToolsVersion版本配置到gradle.properties文件中,然后项目中的库项目都引用该配置,改一处,则整个项目的buildToolsVersion配置都改了。

6.multidex版本异常
imultidex版本异常

这个问题说的是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编译异常
AAPT2异常

这一大串的异常在编译的时候报出,我在第一次导入项目的时候遇到了,第二次导入其它项目的时候,竟然没有遇到,对比之下得出问题是出在配置了高版本的support包的问题,当你把项目所有support包的版本配置到25.2.0的时候什么问题都没有,但是配置成26.0.0或者27.0.0版本的时候就会出现这个问题(亲测);
解决方法

  1. 使用低版本的support包,把项目所有support包的版本配置到25.2.0或者其它较低的版本
  2. 配置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带你踩完所有坑~

上一篇下一篇

猜你喜欢

热点阅读