美文网首页
Android Studio 2.2 升级到 Android S

Android Studio 2.2 升级到 Android S

作者: zhongjh | 来源:发表于2017-11-20 14:54 被阅读330次

    花了一个早上的时间从2.2升级到3.0了,其实我以前做习惯了后台会觉得所谓的升级,功能够用就行,主要就是图个稳定。但自从做移动端后……技术迭代太快,不升级的话需要用到的东西往往用不到。下面是我为什么要升级的原因……
    1.是因为2.5以后支持原生java8了,google已经不推荐jackOptions形式使用java8了,而且jackOptions编译非常非常慢!然后第三方java8跟项目一起做的很庞大的时候,也会出现一些奇怪的问题
    2.编译速度加快:详情请看https://developer.android.com/studio/releases/gradle-plugin.html
    3.fragment的优化又有了!google一直都很重视fragment的方面优化
    4.包与包之间引用优化了编译速度!compile换成了别的引用方式,最后会提到

    当然升级的副作用也有,下面请看我升级过程碰到的问题:

    1 apkVariantData

    异常:Error:Could not get unknown property 'apkVariantData' for object of type com.android.build.gradle.internal.api.ApplicationVariantImpl.

    这个是因为在2.x中的getApkVariantData()函数在3.x中被修改成了getVariantData(),所以ApplicationVariantImpl类的apkVariantData属性就不存在了;为了同时兼容2.x和3.x,这里我们使用variant.getProperty('variantData')来替换先前的variant.apkVariantData写法。
    如果你的项目没有用到上面所说的这个东西,那么就可能是第三方gradle 插件使用了一些旧的api,就会导致报错,比如这里就是因为apkVariantData这个指令已经从 gradle 3.0 剔除了。
    解决方法首先是看看你引用的包的最新版本有没有适配3.0的。如果没有,要么你去下载它的插件源码,升级它的 gradle 插件到 3.0 ,再自己把过时的 api 换掉,要不就先暂时在项目中注释掉相关插件代码。

    据说在Android Studio 3.0 beta 5已经解决了这个问题

    2 Android SDK Build Tools

    异常:Error:The specified Android SDK Build Tools version (25.0.3) is ignored, as it is below the minimum supported version (26.0.2) for Android Gradle Plugin 3.0.0.
    Android SDK Build Tools 26.0.2 will be used.
    To suppress this warning, remove "buildToolsVersion '25.0.3'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
    

    一个很普通的问题,将所有项目从25.0.3都升级到26.0.2即可

    3 jackOptions

    异常:Warning:The Jack toolchain is deprecated and will not run. To enable support for Java 8 language features built into the plugin, remove 'jackOptions { ... }' from your build.gradle file, and add
    android.compileOptions.sourceCompatibility 1.8
    android.compileOptions.targetCompatibility 1.8
    Future versions of the plugin will not support usage of 'jackOptions' in build.gradle.
    To learn more, go to https://d.android.com/r/tools/java-8-support-message.html
    

    删掉jackOptions配置即可

    4 flavorDimensions

    异常:Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html
    

    按照google出来的答案这么解决:
    If you don't really need the mechanism, just specify a random flavor dimension:

    android { 
        ...
        flavorDimensions "default"
        ...
    }
    

    For more information, check the

    migration guide

    恕我见识少,我也是第一次使用flavorDimensions,查了一下flavorDimensions可以基于多个标准构建多个版本,反正,添加default即可。

    5 AAPT2

    Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
    

    aapt2是支持增量编译资源开发,目前不支持Robelectric,并且在一些情况下会导致编译失败,此时可以选择关闭aapt2。
    在根项目的gradle.properties文件中添加android.enableAapt2=false

    6 greendao

    Error:Execution failed for task ':library:yaoguang.greendao:greendao'.
    > org.eclipse.jdt.internal.compiler.impl.CompilerOptions.versionToJdkLevel(Ljava/lang/Object;)J
    

    这是用到了greendao库才出现的问题


    image.png

    升到3.0后变的规范了,现在是根目录的build和app的build都需要添加这个配置了

    7

    新配置 对应的过时配置 描述
    implementation compile module编译时可用,module的使用者运行时可用,对于大量使用library的项目,可以显著提高编译时间,因为它可以减少构建系统重新编译一些module.大多数app/test因为使用这种配置
    api compile module编译时可用,module的使用者编译和运行时可用,这个和过时的compile一样的。一般是library模块会使用它,如果app模块一定要使用它,必须是在它想暴露api给test模块使用
    compileOnly provided module 编译时可用,但是module的使用者,在编译和运行时均不可用。跟过时的provided一样的。
    runtimeOnly apk module和它的使用者,运行时可用.它跟过时的apk是一样.

    注意:compile,provided,apk 这些过时的依赖现在可以使用,但是在下个版本会移除,所以Google给我们一些时间使用。

    我引用一下别人的解释,写的非常清楚:
    作者:WeaponZhi
    链接:https://juejin.im/post/59dc85ce51882569277ccdc6

    7.1 api

    api你可以简单的理解为之前的compile。举个例子,你使用api在lib.A下的build.gradle引用一个本地lib包,这里假设名为lib.A,那么当lib.B有改动的时候,重新编译不仅会编译lib.B,还会编译包括lib.A的所有通过api引用它的包。使用api进行引用,相当于把lib.B对外暴露了接口,这时候,假使有一个lib.C引用了lib.A,那么lib.C是可以直接使用lib.B的代码的。简单的画个图来解释下。

    image.png

    7.2 implementation

    如下图所示。implementation 引用的 lib 不会对外暴露自己的接口,也就是说,当lib.A implementation lib.Blib.C implementation lib.A 的时候,如果lib.B发生了改变,那么只有lib.A会重新编译,lib.C将不会编译!这将大大减少编译时间。

    image.png

    总而言之,更好的方式就是尽量使用implementation来进行依赖,这样会大大改善工程的构建时间,除非你明确需要向外暴露当前 lib 依赖的接口时,才需要使用 api 依赖。

    相关文章

      网友评论

          本文标题:Android Studio 2.2 升级到 Android S

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