美文网首页
Android Studio 2.x升级到 Android St

Android Studio 2.x升级到 Android St

作者: 元亨利贞o | 来源:发表于2018-01-12 17:44 被阅读426次

    一. 最近将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

    相关文章

      网友评论

          本文标题:Android Studio 2.x升级到 Android St

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