美文网首页
Android Gradle Kotlin DSL 迁移

Android Gradle Kotlin DSL 迁移

作者: 子非鱼的那个鱼 | 来源:发表于2019-01-29 15:19 被阅读85次

    前言

    18年做了大概半年的 java 开发,在年底的时候把 springboot 的构建脚本按照官方指导迁移到了 Kotlin DSL,这几天抽空把 Android 的项目也做了迁移,中间遇到的问题做个纪录,本文不含有太多深层次的研究,只是结合自己使用中的问题做一些备忘.

    工具环境

    1. Android Studio 3.3
    2. Gradle-5.1-all
    3. 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.gradlebuild.gradle 以及 App Module 下面的 build.gradle

    1. 将三个文件
      7AB726E4-C26D-4351-B6F8-B9A3DFA0365E.png
      中的所有单引号改为 双引号 (因为在 kotlin 中,不管是字符串还是字符串模板,都是用的双引号)
    2. 将三个文件重命名,各自添加 .kts 变为下面三个文件
      BF7ACB4B-27C1-42EF-87B0-6E8FA4A0E6F6.png
    3. 接下来,就是重点各个文件的改写了,主要是涉及到原来 gradle 中的函数,成员设置,变为 kotlin 的标准语法(groovy 实在是太自由了,自由的有点混淆概念),由于分开讲的话,篇幅长且不一定有图直观,所以就直接上图了(其实也没必要从这里拷贝,因为自己改写的时候基本上都是报错的地方改一下就行了)
      • 项目的 settings.gradle.kts ,改为如下 WX20190129-142004.png
      • 项目的 build.gradle.kts ,改为如下 WX20190129-141619.png
      • Module 的 build.gradle.kts,改为如下三图 WX20190129-142345.png WX20190129-142701.png WX20190129-142755.png
        里面有多种写法的,我都尽可能的用到了多种写法(注释掉的地方).以上就是一个新建的项目中需要改动的一般配置的地方,改完之后就可以使用了.

    踩过的坑

    注意,上面只是一般的写法,现在是划重点的时候.

    1. android 配置中的 signingConfigs 配置,自带的 debug 配置,就是这一块 WX20190129-143659.png debug 是通过 getByName 来获取然后配置的 WX20190129-143936.png 但是 release 不是, release 其实是自己创建的(上图有), 其原因是因为 debugandroid 构建插件自带的配置,而 release 不是,它其实属于我们自定义的,所以我们之前那种纯 groovy 的语法写的时候因为太过于自由,没有认真读过插件文档的同学(比如我),改的时候就会一头包.同理可得 buildTypes 块,中间的配置也是通过 getByName 或者 create 来获取覆盖配置或者创建自己的配置
    2. 项目中我在实际编码中用到了 org.jetbrains.kotlin.android.extensions 中的一些功能, 比如 kotlinx.android.parcel.Parcelize 中的 @Parcelize 自动序列化注解,这里面会涉及到的就是该库中的这个实验性开关配置 androidExtensions { experimental = true } ,如果直接改成 androidExtensions { isExperimental = true } 是不行的,会报注解找不到的错误.正确的改法是下面这样 WX20190129-145419.png
    3. 现在大工程一般都是不仅仅只用官方标配构建插件了,涉及到编译时注解,打包干预功能的都或多或少会用到其他的构建插件,这里也贴出使用 fabric 插件的编写方法,其他插件同理
      • 在工程的 build.gradle.kts 脚本中引用插件仓库链接和 classpath 配置 WX20190129-150019.png
      • 在 module 的 build.gradle.ktsplugins 块,声明插件即可 WX20190129-150135.png

    依赖统一管理

    很多超大型项目的依赖配置都不是分散的,而是统一管理的.之前的做法都是单独声明文件再引用或者在项目的 build.gradle 中的 buildscript 中定义,然后引用,改为 kotlin 之后,这种办法识别不了了(至少我在 buildscript 中声明 ext {} 不再可用了,单独文件还没有尝试),那么在 kotlin 中应该怎么做,其实在 kotlin 中引入了一个 buildSrc 的配置功能,该配置启用方法如下(以统一管理上图中的 "com.android.tools.build:gradle:3.3.0" 的版本号为例)

    1. 在工程的根目录下建立如下文件夹和文件 WX20190129-150936.png 注意只有这个 buildSrc 目录
    2. 里面的两个文件 build.gradle.ktsVers 内容如下
      • build.gradle.kts WX20190129-151209.png
      • Vers WX20190129-151240.png
    3. 同步或者编译运行一次之后,修改 "com.android.tools.build:gradle:3.3.0""com.android.tools.build:gradle:${Vers.Plugins.android}" 即可,其他依赖管理同理

    以上就是在迁移 android 构建脚本中遇到的坑,如果有人遇到同样的问题,可以参考一下这个配置.最后附上成功图


    WX20190129-151832.png

    相关文章

      网友评论

          本文标题:Android Gradle Kotlin DSL 迁移

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