0%

AndroidStudio 3.0 中对Gradle的一些研究总结

Google在5月中旬发布了AndroidStudio的第三个大版本的预览版 Android Studio 3.0 Canary 1 ,AndroidStudio3的版本里面最让人期待的有两点,一个是对于Kotlin语言的支持,另一个是结合Gradle 4.x的编译支持.后者可以大大缩短项目编译时间.

本人在收到AndroidStudio推送后第一时间下载并且体验了一把,在Canary 1和Canary 2由于莫名其妙的故障太多也就没有深入研究,直到6月初发布了Canary 3,才决定正式切入项目.

在升级Gradle和 com.android.tools.build 编译插件之后,发现原来的输出文件名自动配置,输出版本号自动配置一个报错一个没有用了,大写的尴尬.

于是想到用2.x的编译插件和3.0的IDE结合使用,可是理想很丰满,现实却很骨感,2.x的编译插件不支持Gradle4.+版本,无奈放弃.

在折腾一点时间后,输出文件名是搞定了,动态版本号确实无能为力.故而把其中的差异总结以便日后查阅.

替换文件名

在 com.android.tools.build:gradle:2.x.x版本里,配置输出文件名通常是这样的

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each  { output ->
            // 这里的file就是最终输出的文件
            def file = output.outputFile
        }
    }
}

其中的outputFile就是最终文件,我们可以对其重新赋值以实现动态控制文件名

而在 com.android.tools.build:gradle:3.x.x版本里,继续使用上面的代码Gradle插件便会报错,提示getMainOutputFile()已经弃用,需要使用getOutputFileName()方法,问题是正常情况下,可以点击该方法查看到改方法涉及的字段内容,以致于最后硬着头皮写了这个方法死马当活马医发现竟然编译成功了...于是上面的代码就是这样的了

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each  { output ->
            // 这里的name就是最终输出的文件名
            def name = output.outputFileName
        }
    }
}

里面的字段属性也可以用get/set获取和使用,例如

android {
    ...
    applicationVariants.all { variant ->
        variant.outputs.each  { output ->
            // gradle:3.0.0-alpha1 以前是替换文件
            def file = output.getOutputFile()
            output.setOutputFile(file)

            // gradle:3.0.0-alpha1 以后是替换文件名
            def name = output.getOutputFileName()
            output.setOutputFileName(name)
        }
    }
}

版本号

在 com.android.tools.build:gradle:2.x.x版本里,配置版本号一般是这样写:

android {
    ...
    applicationVariants.all { variant ->
        // 方法一
        defaultConfig.versionName += "(测试版)"

        // 方法二
        variant.mergedFlavor.versionName += "(测试版)"
    }
}

上面只是举例子,编译后Apk的versionName就会加上 "(测试版)" 的字样妥妥的

但是在com.android.tools.build:gradle:3.x.x版本里,目前无论我怎样写,都没有成功,最后查看编译插件源代码发现

public interface ProductFlavor extends BaseConfig, DimensionAware {
    ...

    Integer getVersionCode();

    String getVersionName();

    ...
}

吖只提供了get方法,没有set方法...没办法,只能先放弃了

好了,这是截至 Android Studio 3.0 Canary 3 我的一些心得,如果大家找到了解决方案,还请能够交流学习一下~~~

  • 本文作者: 6x
  • 本文链接: https://6xyun.cn/article/25
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!