Android Studio 2.x升级到 Android Studio 3.x遇到的问题

一. 最近将AndroidStudio2.x升级到了Android Studio3.x遇到了一系列的问题.

as 3.0开始支持lambda表达式了, 因此为了优化项目删除额外的retrolambda库, 需要从as2.x升级到as3.x

二. 先说下升级的步骤, 然后在说遇到的问题.

升级步骤:

  1. 更新gradle插件
  • rootProject目录下的build.gradle文件中将gradle插件升级为3.x

    buildscript {
        dependencies {
            //升级gradle插件: 2.x => 3.x
            classpath 'com.android.tools.build:gradle:3.x'
            ...
        }
    
        ...
    }
    
  • 更新gradle分发包:
    <rootProject>/gradle/wrapper/gradle-wrapper.properties文件中的gradle版本升级为4.1, 如下:

    9BFC9E33-D3E4-4179-A86D-02D1F83D9E32.png

  1. 升级输出文件(*.apk)名称相关配置
    AS2.x时配置如下:

     //设置apk文件的名称 (as2.x)
     applicationVariants.all { variant ->
         variant.outputs.each { output ->
             def apk = output.outputFile
             def newName = "VRVideo_" + variant.buildType.name + "_" + defaultConfig.versionName + "_" + defaultConfig.versionCode + ".apk";
             output.outputFile = new File(apk.parentFile, newName)
    
         }
     }
    

    AS3.x时配置如下:

     //设置apk文件的名称 (as3.x)
     applicationVariants.all { variant ->
         variant.outputs.all {
             outputFileName = "VRVideo_" + variant.buildType.name + "_" + defaultConfig.versionName + "_" + defaultConfig.versionCode + ".apk"
         }
     }
    
  2. 将build.gradle文件中的compile更新为api / implementation (下面会讲compile/api/implementation的区别)

  3. 更新android-apt插件

  • 删除android-apt相关配置

    //root project中的build.gradle相关配置
    buildscript {
        dependencies {
            classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        }
        ...
    }
    
    
    
    //library-module 或 main-module的build.gradle中的配置
    apply plugin: 'com.neenbedankt.android-apt'
    
    dependencies {
        apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
        ...
    }
    
    apt {
        arguments {
            eventBusIndex "xxx.xxx.XxxIndex"
        }
    }
    
  1. EventBus配置升级
    使用gradle插件内置的annotationProcessor替代android-apt的apt配置, 如下:
  • 注解解析器配置:
    apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'
    换成
    annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'

  • EventBus的特殊配置:

      apt {
          arguments {
              eventBusIndex "xxx.xxx.XxxIndex"
          }
      }
    

    换成:

      android {
          ...
    
          javaCompileOptions {
              annotationProcessorOptions {
                  arguments = [eventBusIndex: 'xxx.xxx.XxxIndex']
              }
          }
      }
    
  1. ButterKnife配置升级 (7.0.1 => 8.8.1)
  • 配置文件更改, 参考=>ButterKnife
  • 更新API调用:
    @Bind => @BindView;
    @Bind({}} => @BindViews({});
    ButterKnife.unbind() => Unbinder.unbind() --- ButterKnife.bind()会返回Unbinder对象
  • 更新proguard文件 (其他配置一样, 更新下面这句)
#-keep class **$$ViewInjector { *; }  #butterknife6.x-生成的类
#-keep class **$$ViewBinder { *; }  #butterknife7.x生成的类
-keep class **_ViewBinding { *; } #butterknife8.x生成的类

三. 升级过程中遇到的问题

  1. apk文件名称相关配置升级 (如二所示)
  2. 注解解析器升级, 即将android-apt插件换成gradle插件中的annotationProccessor (gradle插件自2.2+开始支持内置的annotationProcessor配置)
  3. EventBus配置升级 (如二所示)
  4. ButterKnife配置升级 (如二所示)
  5. 安卓构建工具升级


    BC1D97FE-B8E5-4827-B7A7-4427273462F4.png

    从上图可获得两条信息:

  • Android Gradle Plugin 3.0.1支持的最低Android SDK Build Tools的版本为26.0.2
  • as3.xbuildToolsVersion 'x.x.x' 这个配置可以省略掉, 因为每个版本的Android Gradle Plugin都有一个默认版本的Build Tools

因此, 你可以删掉buildToolsVersion 'x.x.x'这句配置 或 Build Tools的版本升级到26.0.2或更高版本

  1. compile => api, implementation, api和implementation的区别就如其词义所示: api即用于对外(当前module之外)提供接口, implementation就是用来实现当前module(定义的api)的. 这样解释有点抽象, 可能你并没听懂. 举个例子:
    你在你的Library Module中引用了一个第三方库(如fastjson), 你想其他人使用你的这个Library Module的时候也能直接使用这个第三方库, 这时你应该用 api 'com.xxx.xxx' (即将关键词api之后引用的library的api对外公开, 不仅可以在当前module中使用, 其他引用当前module的调用者也可以使用第三方库); 否则, 则用 implementation 'com.xxx.xxx'
    总结一下:
  • 之前版本的compile和现今的api等价, 即之前用compile的地方都可以换成api

  • compile和api都是引用传递的, 即: 如果B引用了C, A引用了B; 那么A也引用了C

  • implementation不是引用传递的, 即: 如果B引用了C, A引用了B; 那么A并没有引用到C (如果A要引用C, 你必须在A的build.gradle中添加引用配置)

  • 一般原则: Library Module中用api, 而Main Module中用implementation (当然, 如果Library Module中引用的模块只在当前Library Module中使用, 那就应该用implementation)

  •   debugCompile project(path: ':xxx', configuration: 'debug')
      releaseCompile project(path: ':xxx', configuration: 'release)
    

    改成

      debugImplementation project(':xxx')
      releaseImplementation project(':xxx')
    

    前面那个写法主要是为了在library module中正确的使用BuildConfig.DEBUG的值 (参考: https://www.jianshu.com/p/1907bffef0a3).
    在as3.x中, 已经BuildConfig.DEBUG值错误问题已经修复了所以直接用debugImplementation或releaseImplementation就可以了, 不再需要指定configuration.
    debugImplementation project(path: 'xxx', configuration: 'debug') 这样配置是不能正常工作的, 会导致下面错误:
    Error:Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve project :library.

  1. Library Module中不能使用shrinker配置, 错误如下:

    EDAF6B81-4060-4532-B548-FB96869D89D0.png

    根据错误信息, 直接把Library Module中的build.gradle配置中的shrinkResources true删掉即可恢复正常

  2. ../res/values/styles_dialog.xml:5:5-15:13: AAPT: error: style attribute '@android:attr/windowFrame' not found.
    as3.x 使用aapt2来处理资源文件, 编译时会抛出上面错误. 暂时先禁用aapt2, 即在rootProject/gradle.properties文件中添加下列语句:
    android.enableAapt2=false

    如果要用aapt2呢?? ......

References:

http://blog.csdn.net/xx326664162/article/details/68490059
https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html

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