介绍
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升级
9、includeCompileClasspath移除
删除红框中的一行