美文网首页
老项目迁移至Android Studio 3.0遇到的坑

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

作者: wfunny | 来源:发表于2018-07-03 16:07 被阅读56次

    昨天做项目迁移到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

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

    • 在主项目的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的文件名导致的异常

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


    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带你踩完所有坑~

    相关文章

      网友评论

          本文标题:老项目迁移至Android Studio 3.0遇到的坑

          本文链接:https://www.haomeiwen.com/subject/bboduftx.html