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

昨天做项目迁移到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带你踩完所有坑~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容