Gradle 8.11.1的升级之旅

如果大家的gradle版本之前是4.0.1或者4.2.0这种低版本,大家不要一下子就升到8.0版本,一定要一步步升级

第一步:gradle 4.0.1升级到7.4.2

build.gradle

javascript 复制代码
classpath('com.android.tools.build:gradle:7.4.2') {
    exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
}

gradle-wrapper.properties

ini 复制代码
#Fri Jun 04 10:47:21 CST 2021
#Mon Dec 23 09:50:17 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-7.5-bin.zip

maven插件修改为maven-publish

arduino 复制代码
apply plugin: 'maven-publish'

uploadArchives移除替换

ini 复制代码
uploadArchives {
    repositories.mavenDeployer {
        //本地仓库路径,以放到项目根目录下的 repo 的文件夹为例
        repository(url: uri('../repo'))

        //groupId
        pom.groupId = 'com.peakmain'

        //artifactId
        pom.artifactId = 'android.plugin'

        //插件版本号
        pom.version = '1.0.0'
    }
ini 复制代码
afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId = 'com.peakmain'
                artifactId = 'android.plugin'
                version = '1.0.0'
                from components.java  // 只在 Java 项目中使用
                // 自动生成 POM 依赖配置
                pom.withXml {
                    def dependenciesNode = asNode().appendNode('dependencies')
                    configurations.implementation.allDependencies.each {
                        if (it.group != null && it.name != null) {
                            def dependencyNode = dependenciesNode.appendNode('dependency')
                            dependencyNode.appendNode('groupId', it.group)
                            dependencyNode.appendNode('artifactId', it.name)
                            dependencyNode.appendNode('version', it.version)
                        }
                    }
                }
            }
        }

        repositories {
            maven {
                url = uri('../repo')
            }
        }
    }
}

更推荐使用升级助手,可以节约大量时间

第二步:gradle 7.4.2 升级到 8.11.1

先说下我们公司的目前kotlin和gradle版本

kotlin版本 gradle插件版本 gradle版本 minSdkVersion targetSdkVersion java版本
1.6.10 4.1.1 6.7.1 21 33 11

我们升级后的目标是

kotlin版本 gradle插件版本 gradle版本 minSdkVersion targetSdkVersion java版本
2.1.0 8.10.1 8.11.1 21 33 17

build.gradle

javascript 复制代码
buildscript {
    ext.kotlin_version = '1.9.20'
    dependencies {
        classpath('com.android.tools.build:gradle:8.10.1') {
            exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-jdk8'
        }
    }
}

gradle-wrapper.properties

ini 复制代码
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-8.11.1-bin.zip

TheRouter升级

  • 官网的版本文档暴露的是1.2.4,但是这个不支持AGP 8,在官网的Issues中找到了相关解决办法
  • agp8.8.0 not support #247
arduino 复制代码
// root build.gradle 
classpath 'cn.therouter:plugin:1.3.0-rc4'

// app module 
apply plugin: 'therouter'

// dependencies
kapt "cn.therouter:apt:1.3.0-rc4"
implementation "cn.therouter:router:1.3.0-rc4"

com.huawei.agconnect升级

错误:

python 复制代码
What went wrong:
An exception occurred applying plugin request [id: 'com.huawei.agconnect']
> Failed to apply plugin 'com.huawei.agconnect'.
   > API 'android.registerTransform' is removed.

升级版本即可

arduino 复制代码
classpath 'com.huawei.agconnect:agcp:1.9.1.301'

火山埋点升级

arduino 复制代码
classpath 'com.bytedance.applog:RangersAppLog-All-plugin-agp8:6.17.1'

错误:Compose Compiler

Starting in Kotlin 2.0, the Compose Compiler Gradle plugin is required when compose is enabled. See the following link for more information: d.android.com/r/studio-ui...

从 Kotlin 2.0 开始,Jetpack Compose 不再自动使用默认的编译器插件,你必须手动声明 Compose Compiler 插件版本。

build.gradle

bash 复制代码
plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'org.jetbrains.kotlin.plugin.compose' version '2.1.0'
}

gradle.properties

  • 需要添加以下配置,否则会不生产BuildConfig类
ini 复制代码
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false

Namespace not specified

Namespace not specified. Specify a namespace in the module's build file:

模块缺少 namespace 配置项 ,而从 Android Gradle Plugin (AGP) 8.0 开始,namespace 是强制要求的,否则会构建失败

arduino 复制代码
android {
    namespace 'com.yourcompany.common' // ← 替换为该模块实际的包名
    ...
}

通常 namespace 对应你这个模块的 AndroidManifest.xml 中的 package 值。

比如,basic/common/src/main/AndroidManifest.xml 里有

ini 复制代码
<manifest package="com.yourcompany.common">

那么就配置成

arduino 复制代码
android {
    namespace 'com.yourcompany.common'
}

tasks 'compileDebugJavaWithJavac' (1.8) and 'kaptGenerateStubsDebugKotlin' (17).

Execution failed for task ':basic:library:kaptGenerateStubsDebugKotlin'. > Inconsistent JVM-target compatibility detected for tasks 'compileDebugJavaWithJavac' (1.8) and 'kaptGenerateStubsDebugKotlin' (17).

两者 JVM 版本不一致,导致构建失败

build.gradle(所有对应模块的 build.gradle)里,设置统一的 Java 和 Kotlin 编译目标版本:

ini 复制代码
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = "17"
    }
}

补充

我在构建项目的时候莫名有个文件找不到了

arduino 复制代码
Unresolved reference 'ZuoYunMeetRoomCouponLookListAdapter'

但是我点击进入源码之后,源码能找到对应的代码,并且也能链接过去,但是构建就是报错,后面仔细发现是包名多了个空格

复制代码
com.peakmain. ui.ZuoYunMeetRoomCouponLookListAdapter

删除对应空格就好了

最后

大家最好还是用「升级助手」来升级,可以避免很多无谓的坑,因为它会给你自动添加一些配置。 也不要试图一下子从Gradle 4 升级到Gradle 8,先升级到7,再升级到8,可以避免很多莫名的坑

相关推荐
533_24 分钟前
[vue] dayjs 显示实时时间
前端·javascript·vue.js
故事与他6451 小时前
XSS_and_Mysql_file靶场攻略
前端·学习方法·xss
莫的感情1 小时前
下载按钮点击一次却下载两个文件问题
前端
一个很帅的帅哥1 小时前
JavaScript事件循环
开发语言·前端·javascript
小宁爱Python2 小时前
Django Web 开发系列(二):视图进阶、快捷函数与请求响应处理
前端·django·sqlite
fox_2 小时前
深入理解React中的不可变性:原理、价值与实践
前端·react.js
Github项目推荐2 小时前
你的错误处理一团糟-是时候修复它了-🛠️
前端·后端
Code小翊2 小时前
C语言bsearch的使用
java·c语言·前端
云枫晖2 小时前
Webapck系列-初识Webpack
前端·javascript
慧一居士2 小时前
HTML5 功能介绍,使用场景,对应功能点完整使用示例
前端