前言
18年做了大概半年的 java 开发,在年底的时候把 springboot 的构建脚本按照官方指导迁移到了 Kotlin DSL,这几天抽空把 Android 的项目也做了迁移,中间遇到的问题做个纪录,本文不含有太多深层次的研究,只是结合自己使用中的问题做一些备忘.
工具环境
- Android Studio 3.3
- Gradle-5.1-all
-
java version "1.8.0_101",AndroidStudio使用内嵌的 jdk如果是用的 IDEA 需要关注这个版本,因为有的老一点的 java 版本, https 连不上 Gradle 插件仓库 而导致无法识别一些构建插件,遇到此类问题的请检查一下自己的 jdk 版本
一点点的说明
因为老的Groovy编写的gradle脚本(后面简称gradle)和新的Kotlin编写的kts脚本(下文简称kts)可以一起用,所以对于多Module的工程不进行进一步的说明.另外,在改动脚本的过程中,IDE 会进行多次的 index 索引工作,所以需要多一点耐心,还有在改动的过程中会出现大面积的爆红,不要惊慌,要灵活运用命令 assembleDebug --info
来查找问题
步骤
改动过程中,只是用一个新建的模板工程来进行说明,所以只针对三个文件: 工程根目录下的 settings.gradle
和 build.gradle
以及 App Module 下面的 build.gradle
- 将三个文件
中的所有单引号改为 双引号 (因为在 kotlin 中,不管是字符串还是字符串模板,都是用的双引号) - 将三个文件重命名,各自添加
.kts
变为下面三个文件
- 接下来,就是重点各个文件的改写了,主要是涉及到原来 gradle 中的函数,成员设置,变为 kotlin 的标准语法(groovy 实在是太自由了,自由的有点混淆概念),由于分开讲的话,篇幅长且不一定有图直观,所以就直接上图了(其实也没必要从这里拷贝,因为自己改写的时候基本上都是报错的地方改一下就行了)
- 项目的
settings.gradle.kts
,改为如下 - 项目的
build.gradle.kts
,改为如下 - Module 的
build.gradle.kts
,改为如下三图
里面有多种写法的,我都尽可能的用到了多种写法(注释掉的地方).以上就是一个新建的项目中需要改动的一般配置的地方,改完之后就可以使用了.
- 项目的
踩过的坑
注意,上面只是一般的写法,现在是划重点的时候.
-
android
配置中的signingConfigs
配置,自带的debug
配置,就是这一块debug
是通过getByName
来获取然后配置的release
不是,release
其实是自己创建的(上图有), 其原因是因为debug
是android
构建插件自带的配置,而release
不是,它其实属于我们自定义的,所以我们之前那种纯 groovy 的语法写的时候因为太过于自由,没有认真读过插件文档的同学(比如我),改的时候就会一头包.同理可得buildTypes
块,中间的配置也是通过getByName
或者create
来获取覆盖配置或者创建自己的配置 - 项目中我在实际编码中用到了
org.jetbrains.kotlin.android.extensions
中的一些功能, 比如kotlinx.android.parcel.Parcelize
中的@Parcelize
自动序列化注解,这里面会涉及到的就是该库中的这个实验性开关配置androidExtensions { experimental = true }
,如果直接改成androidExtensions { isExperimental = true }
是不行的,会报注解找不到的错误.正确的改法是下面这样 - 现在大工程一般都是不仅仅只用官方标配构建插件了,涉及到编译时注解,打包干预功能的都或多或少会用到其他的构建插件,这里也贴出使用
fabric
插件的编写方法,其他插件同理- 在工程的
build.gradle.kts
脚本中引用插件仓库链接和classpath
配置 - 在 module 的
build.gradle.kts
的plugins
块,声明插件即可
- 在工程的
依赖统一管理
很多超大型项目的依赖配置都不是分散的,而是统一管理的.之前的做法都是单独声明文件再引用或者在项目的 build.gradle
中的 buildscript
中定义,然后引用,改为 kotlin 之后,这种办法识别不了了(至少我在 buildscript
中声明 ext {}
不再可用了,单独文件还没有尝试),那么在 kotlin 中应该怎么做,其实在 kotlin 中引入了一个 buildSrc 的配置功能,该配置启用方法如下(以统一管理上图中的 "com.android.tools.build:gradle:3.3.0"
的版本号为例)
- 在工程的根目录下建立如下文件夹和文件
buildSrc
目录 - 里面的两个文件
build.gradle.kts
和Vers
内容如下-
build.gradle.kts
-
Vers
-
- 同步或者编译运行一次之后,修改
"com.android.tools.build:gradle:3.3.0"
为"com.android.tools.build:gradle:${Vers.Plugins.android}"
即可,其他依赖管理同理
以上就是在迁移 android 构建脚本中遇到的坑,如果有人遇到同样的问题,可以参考一下这个配置.最后附上成功图