Gradle 7.x 升级

gradle upgrade

Posted by Kinsomy Blog on March 1, 2023

介绍

Gradle 7.0 在2021年4月正式发布,目前最新版本已经更新到v7.6.1,想看Gradle所有版本的release记录可以点击链接

该版本默认启用文件系统监视功能,使你的增量构建速度更快;扩展了对使用Java16构建项目的支持;并增加了对在使用AppleSilicon处理器(如M1)的Mac上构建的支持。

同时,此版本还引入了 centralized dependency versions 的功能预览,启用构建验证错误,使你的构建更加可靠,并使其更容易为设置文件创建 convention plugins。且许多孵化中的功能已经晋升为稳定版。具体更新内容如下:

性能提升

更快的增量构建

增量构建会检查哪些需要重新构建,可以减少构建时间,但是会增加I/O开销。

文件监视系统的启用会在两次构建之间在内存里保持对文件的分析,并且在每次构建时跳过从文件系统读取的操作,从而减少了磁盘I/O量。

Android项目中更快的增量更改

官方用了 Santa Tracker Android project拿Gradle 7.0和Gradle 6.8进行assembleDebug编译对比,相比6.8有了12%的速度提升。

忽略空的buildSrc项目

在早期的Gradle版本中,仅仅是buildSrc空目录的存在就足以触发Gradle执行所有的buildSrc任务,并将产生的buildSrc.jar添加到buildScript类路径中,导致不必要的性能开销或缓存丢失。

Gradle 现在会忽略一个空的 buildSrc 目录,并且只有在检测到构建文件和/或源文件时才会生成 buildSrc.jar。

升级

我们参照官方升级手册进行

Bulid Scans

Build Scans是用于开发和维护Gradle构建的重要工具。它为你提供了构建的详细信息,并为你识别构建环境、依赖或性能上存在的问题,同时可以帮你更全面地理解并提升构建过程,也便于与他人的合作。

在Gradle构建运行时,Build Scans插件会抓取数据,并将数据传送到Build Scans服务端。同时返回一个可被共享的链接,内部包含有用的构建信息。这些信息包含两大类:

  • 环境信息,包括操作系统、Java版本和时区
  • 构建相关信息,包含使用的插件、任务、测试以及依赖信息

Build Scans在Gradle 4.3以上才默认使用,低版本需要额外安装插件,Build Scan Plugin User Manual

我们进入项目更目录执行扫描命令:

bash ./gradlew build --scan

执行完成后会生成一个链接,点进去能看到扫描结果

我们在升级前后都可以执行命令进行扫描,看看编译性能是否有提升,以及升级后存在的问题。

使用7.x版本

版本可以在 Android Studio 的 File > Project Structure > Project菜单中指定

我们使用目前最新的Gradle v7.6.1,同时根据Android Gradle plugin release notes找到对应的Android Gradle Plugin版本。

所以最终我们选择使用如下版本:

  • Grdle Version => v7.6.1
  • Android Gradle Plugin Version => v7.4.2

问题记录

1、http不安全

远程依赖会爆错使用了不安全协议,需要将地址从http改为https

Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven(http://maven.aliyun.com/nexus/content/groups/public/)' to redirect to a secure protocol (like HTTPS) or allow insecure protocols. See https://docs.gradle.org/7.6.1/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol for more details. 

2、deprecated maven plugin

unable to resolve class MavenDeployment 
    beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

旧的maven插件被废弃了,需要使用新的Maven Publish Plugin

    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

替换成


    publishing {
        //发布的 jar 包配置
        publications {
            release(MavenPublication) {

                repository(url: getReleaseRepositoryUrl()) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
                }
                snapshotRepository(url: getSnapshotRepositoryUrl()) {
                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())

替换成


                repositories {
                    maven {
                        def releasesRepoUrl = getReleaseRepositoryUrl()
                        def snapshotsRepoUrl = getSnapshotRepositoryUrl()
                        url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
                        credentials {
                            username = getRepositoryUsername()
                            password = getRepositoryPassword()
                        }
                    }
                 }


3、警告: kotlin-android-extensions 废弃

The 'kotlin-android-extensions' Gradle plugin is deprecated. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the 'kotlin-parcelize' plugin.

4、The option ‘android.enableBuildCache’ is deprecated.

android. enableBuildCache是用来启动gradle缓存的,在Gradle7.0版本中不对外开放,默认值是false,在gradle.properties中直接删除。

5、compileSdkVersion版本老旧

升级到31以上

6、Tinker不支持高版本Gradle

升级tinker到最新版本

7、JDK升级到11

8、阿里云EMAS升级

EMAS Android 统一接入

9、includeCompileClasspath移除

删除红框中的一行

10、Kotlin Gradle plugin版本过时