AGP 升级,适配 8.5 版本(一)

本次升级是从之前的 AGP7+ 升级到 AGP8+

在这里插入图片描述

1. 升级 AGP

  • Android gradle plugin version:7.4.2 ——> 8.3.2
  • Gradle version:7.5 ——> 8.5

在这里插入图片描述

2. 同步报错

2.1 未指定命名空间

在这里插入图片描述

根据给出的文档链接设置命名空间:设置命名空间

命名空间是需要再 application 模块设置的,我们的插件是 groovy 库模块不需要在 build.gradle 配置

在这里插入图片描述

2.2 不支持 Transform

TransformManager 被移除

但这不是主要的

在这里插入图片描述

不妨把它抽出来,如下所示,编译通过了

在这里插入图片描述

迁移 Transform

重要的是:API 'android.registerTransform' is removed.

在这里插入图片描述

  • Transform 类弃用:计划在 Android Gradle plugin 9.0 中删除
  • Extension registerTransform:Transform API 计划在 Android Gradle 插件 8.0 中移除

在 AGP 8.0 中已经删除了 Transform API的支持,所以要迁移 Transform

在这里插入图片描述
在这里插入图片描述

跟进官方文档:移除了 Transform API 进行迁移适配

当前我需要适配的功能部分是 支持转换字节码,也就是我们以前用来处理字节码部分的 Transform,很多时候是我们使用的 ASM + Transform 处理 class 文件

官方:ASM 转换例子

如何开始适配呢?

我的插件之前都是用 java 写的,但是 AGP8+ 上 AsmTransformApi 是完全基于 Kotlin 实现的

所以你不得不把你的插件也使用 Kotlin 实现,麻烦点在这,你要重写插件,谁愿意挖一坨屎山呢?

3. AGP8+ Plugin Demo

3.1 创建插件 module

字节码转换 AGP8+ 只有 Kotlin 实现,一定要选择 Kotlin + Kotlin DSL

在这里插入图片描述

3.2 配置 build.gradle

  • 引入 groovy-gradle-plugin(Gradle API)
  • 引入 maven-publish 发布版本
  • 配置 gradlePlugin 指定插件 ID + 实现类

版本一:后面适配插件引入,调整 Maven 发布有版本二

plugins {
    alias(libs.plugins.jetbrains.kotlin.jvm)
    //一定要配置这个,否则找不到 org.gradle.api.Plugin 等
    id("groovy-gradle-plugin")
    //发布版本
    id("maven-publish")
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

kotlin {
    compilerOptions {
        jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
    }
}

dependencies {
    //一定要引入这个,否则找不到一些 build-api
    //com.android.build.api.variant.AndroidComponentsExtension
    //com.android.build.api.instrumentation.AsmClassVisitorFactory
    compileOnly(libs.build.gradle.api)
}

//指定插件 ID 和入口
gradlePlugin {
    plugins {
        create("Check") {
            id = "com.vimedia.plugin"
            implementationClass = "com.vimedia.plugin.Check"
        }
    }
}

publishing {
    publications {
        //发布到本地仓库
        create<MavenPublication>("release") {
            from(components["kotlin"])
            groupId = "com.vimedia.plugin"
            artifactId = "check"
            version = "1.0.0.2.1"
        }
    }
}

3.3 插件版本依赖错误

我是这样声明的

[versions]
check = "1.0.0.4"

[plugins]
check = { id = "com.vimedia.plugin", version.ref = "check" }

项目 build.gradle.kts 下这样应用

plugins {
    alias(libs.plugins.check) apply false
}

当我同步时却找不到插件

报错 Plugin Repositories (could not resolve plugin artifact ‘com.vimedia.plugin:com.vimedia.plugin.gradle.plugin:1.0.0.4’)

我的插件明明是 com.vimedia.plugin:check1.0.0.4,怎么就变成com.vimedia.plugin:com.vimedia.plugin.gradle.plugin:1.0.0.4

多了 com.vimedia.plugin.gradle.plugin,artifactId check 哪去了

在这里插入图片描述

我本地发布的版本似乎也没有问题啊

在这里插入图片描述

打印日志

输出插件依赖是这样:com.vimedia.plugin:1.0.0.5

肯定不对,预期是 com.vimedia.plugin:check:1.0.0.5

check-plugin = { id = "com.vimedia.plugin", version.ref = "check" }

alias(libs.plugins.check.plugin) apply false

输出:
模块依赖=== com.vimedia.plugin:1.0.0.5

报错:
- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Included Builds (No included builds contain this plugin)
- Plugin Repositories (could not resolve plugin artifact 
- 'com.vimedia.plugin:com.vimedia.plugin.gradle.plugin:1.0.0.5')

尝试添加 check,也不对,不允许特殊字符

check-plugin = { id = "com.vimedia.plugin:check", version.ref = "check" }

alias(libs.plugins.check.plugin) apply false

输出:
模块依赖=== com.vimedia.plugin:check:1.0.0.5

报错:
plugin id 'com.vimedia.plugin:check' is invalid: Plugin id contains invalid char ':' 
(only ASCII alphanumeric characters, '.', '_' and '-' characters are valid)

3.4. 向困难妥协

既然这样写:check-plugin = { id = "com.vimedia.plugin", version.ref = "check" }

它依赖的是:com.vimedia.plugin:com.vimedia.plugin.gradle.plugin:1.0.0.4

那我发布版本便满足他

publishing {
    publications {
        create<MavenPublication>("release") {
            from(components["kotlin"])
            groupId = "com.vimedia.plugin"
            //临时处理,后续回头再看如何解决
            //因为暂时搞不明白拼接的这个 .gradle.plugin 是什么
            artifactId = "com.vimedia.plugin.gradle.plugin"
            version = "1.0.0.6"
        }
    }

    repositories {
        mavenLocal()
    }
}

3.4 应用插件

app/build.gradle.kts 下配置

方式一:

import com.vimedia.plugin.Check

//在 agp7+ 等低版本是这样的: apply plugin: 'com.vimedia.plugin'
//现在看起来跟以前比别扭多了
apply<Check>()

方式二:

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.jetbrains.kotlin.android)
    //插件创建时填写的 ID
    id("com.vimedia.plugin")
}

//创建插件名称、指定插件ID、版本等
gradlePlugin {
    plugins {
        create("Check") {
            //1、同 agp7+ 应用插件的 ID,apply plugin: 'com.vimedia.plugin'
            //2、会再发布一个 id + gradle.plugin 的 pom
            id = GROUP_ID
            group = GROUP_ID
            version = VERSION
            implementationClass = "Check"
        }
    }
}

在这里插入图片描述

官方文档(插件部分): Understanding Plugins

3.5 不再妥协

3.4. 向困难妥协 我们使用了临时方案

经过不断地调试,多次给插件创建 plugins create 赋予不同的值:

  • id:插件 ID
  • group:插件 pom group
  • version:插件版本

对比 publishing create 赋予不同的值:

  • groupId:插件 pom group
  • version:插件版本

发现:

1. 如果这两个配置的group、version 不一样,那么会生成两个路径的 pom
2. plugins create id 是会拼接 .gradle.plugin生成新的路径作为 pom

大概能猜到,这个带.gradle.plugin生成新的 pom 可能是高 AGP 版本为了更好的版本管理

在这里插入图片描述

为了能够使插件引入check-plugin = { id = "com.vimedia.plugin", version.ref = "checkVersion" } 正常使用和 Maven 发布简化

我们统一插件创建和 Maven 发布的 pom 信息 groupId 和 version

在这里插入图片描述

plugins {
    alias(libs.plugins.jetbrains.kotlin.jvm)
    //一定要配置这个,否则找不到 org.gradle.api.Plugin 等
    id("groovy-gradle-plugin")
    id("java-gradle-plugin")
    //发布版本
    id("maven-publish")
}

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

kotlin {
    compilerOptions {
        jvmTarget = org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17
    }
}

dependencies {
    //一定要引入这个,否则找不到一些 build-api
    //com.android.build.api.variant.AndroidComponentsExtension
    //com.android.build.api.instrumentation.AsmClassVisitorFactory
    compileOnly(libs.build.gradle.api)
}


val ARTIFACT_ID = "check"
val GROUP_ID = "com.vimedia.plugin"
val VERSION = "1.0.0.9"
//指定插件 ID 和入口
gradlePlugin {
    plugins {
        create("Check") {
            //1、同 agp7+ 应用插件的 ID,apply plugin: 'com.vimedia.plugin'
            //2、会再发布一个 id + gradle.plugin 的 pom
            id = GROUP_ID
            group = GROUP_ID
            version = VERSION
            implementationClass = "com.vimedia.plugin.Check"
        }
    }
}

//插件发布
publishing {
    publications {
        //发布到本地仓库
        create<MavenPublication>("release") {
            from(components["kotlin"])
            groupId = GROUP_ID
            version = VERSION
            artifactId = ARTIFACT_ID
        }
    }

    repositories {
        mavenLocal()
    }
}

<think>好的,我现在需要帮助用户解决Gradle版本不匹配的问题,将项目中的Gradle版本8.3-rc-3升级8.7,并正确配置Gradle Wrapper以避免最低支持版本错误。让我先理清楚解决这个问题的步骤。 首先,根据用户提供的引用信息,特别是引用[4]和[5],Gradle插件版本AGP)和Gradle版本之间有对应关系,必须匹配才能避免错误。用户提到当前遇到的问题是Minimum supported Gradle version is 8.2,而当前版本8.0,但用户想升级8.7。不过用户当前的项目使用的是8.3-rc-3,需要升级8.7。这里可能存在混淆,我需要确认用户的具体情况,但按照用户要求,目标是升级8.7。 首先,用户需要修改Gradle Wrapper的配置。Gradle Wrapper的配置文件通常在项目根目录下的gradle/wrapper/gradle-wrapper.properties。用户需要将distributionUrl中的版本号改为8.7。例如,原来的可能是distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-rc-3-bin.zip,需要改为gradle-8.7-bin.zip。这步是直接修改文件,应该可以解决Gradle版本的问题。 接下来,用户需要检查Gradle插件版本是否与Gradle 8.7兼容。根据引用[4]中的附件1,Gradle插件版本和Gradle版本有对应关系。例如,AGP 8.2.0需要Gradle 8.0及以上。但用户要升级到Gradle 8.7,可能需要对应更高版本AGP。比如,如果当前项目的AGP版本过低,可能需要升级到支持Gradle 8.7的AGP版本。例如,AGP 8.3.0可能对应Gradle 8.7,但需要查阅最新的兼容性表格。用户需要修改项目根目录下的build.gradle中的dependencies部分,将classpath中的AGP版本升级到与Gradle 8.7兼容的版本。 然后,用户需要同步项目,可能通过Android Studio的Sync Now按钮,或者命令行执行./gradlew wrapper来更新Wrapper。同时,需要确保环境变量中的GRADLE_HOME设置正确,或者直接使用Wrapper,这样会下载指定的Gradle版本到项目中,避免系统环境变量的问题,如引用[3]提到的。 另外,用户可能会遇到下载失败的情况,这时候可以检查网络,或者手动下载Gradle 8.7的发行包,放到对应的缓存目录中,避免重复下载,如引用[4]中提到的解决gradle下载失败的方法。 最后,用户重新导入项目后,需要确认是否还有版本错误,如果有可能需要进步调整AGP版本,或者清理旧版本的缓存,确保使用的是正确的Gradle版本。 可能的问题点在于用户是否正确修改了Gradle Wrapper的distributionUrl,以及是否同步更新了AGP版本到兼容的版本。如果这两步都正确,应该可以解决问题。此外,用户需要注意Android Studio版本是否支持新的AGP版本,如引用[4]中的附件3提到的AS版本AGP版本的兼容性,可能需要升级Android Studio到最新版本以确保兼容性。</think>### 逐步解决方案:升级Gradle版本8.7并避免兼容性问题 #### **步骤1:修改Gradle Wrapper配置** 1. 打开项目根目录下的`gradle/wrapper/gradle-wrapper.properties`文件 2. 将`distributionUrl`中的版本号改为`8.7`: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip ``` 这确保Gradle Wrapper自动下载并使用8.7版本[^4]。 #### **步骤2:升级Android Gradle插件(AGP版本** 1. 检查项目根目录的`build.gradle`文件(注意是项目级,非模块级) 2. 修改`dependencies`中的AGP版本为与Gradle 8.7兼容的版本。例如: ```groovy dependencies { classpath "com.android.tools.build:gradle:8.3.0" // 需确认AGP 8.3.0支持Gradle 8.7[^4] } ``` **注意**:需通过官方文档确认AGP与Gradle版本的对应关系(例如AGP 8.3.0要求Gradle ≥8.4[^1])。 #### **步骤3:同步项目并清理缓存** 1.Android Studio中点击**Sync Now**按钮,或命令行执行: ```bash ./gradlew wrapper --gradle-version 8.7 ``` 2. 清理旧版本残留文件: - 删除项目目录下的`.gradle`文件夹 - 删除`~/.gradle/caches`(全局Gradle缓存) #### **步骤4:验证环境变量(可选)** - 如果使用本地Gradle安装(非Wrapper),需确保`GRADLE_HOME`指向8.7版本,并将`$GRADLE_HOME/bin`添加到`PATH`[^3]。 #### **步骤5:处理常见问题** - **下载失败**:手动下载[Gradle 8.7发行包](https://gradle.org/releases/),解压后替换`gradle/wrapper`目录内容。 - **版本冲突**:检查所有子模块的`build.gradle`是否强制指定旧版本,需统调整为适配AGP 8.3.0+。 --- ### 版本兼容性参考 1. **Gradle与AGP版本对应**(示例): - AGP 8.3.0 → Gradle 8.4+ - AGP 8.4.0 → Gradle 8.5+ (需根据[官方文档](https://developer.android.com/build/releases/gradle-plugin)确认) 2. **Android Studio兼容性**: - Android Studio Flamingo (2022.3.1) 支持AGP 8.3.0+[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值