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

AndroidStudio AGP插件和Gradle之间的版本对应关系(官方) Google官方的文档,可以保证实时性和权威性。 阅读详情
AI摘要

本文详细介绍了从AGP7+升级到AGP8+的过程,包括遇到的同步报错问题及其解决方案,以及创建和配置AGP8+插件module的具体步骤。特别强调了在AGP8+中Transform API的移除和插件版本依赖错误的处理,以及如何通过Kotlin重写插件和适配字节码转换。

本次升级是从之前的 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()
    }
}

​Android Gradle 插件(AGP)版本与 ​Gradle 版本需要严格对应 通过合理选择 AGP 和 Gradle 版本,可以避免构建问题并充分利用新特性。如果使用第三方库(如 Dagger、Retrofit),检查其文档是否支持新版 AGP。Android Studio 会提示同步,点击 ​。升级后若出现编译错误,需查阅 官方迁移指南。 阅读详情

相关推荐

Android中 Gradle与 AGP 版本对应关系表

主要展示android Gradle与AGP版本对应

weixin_41733225的博客 7001

Compose - Gradle 7.0+ 升级 8.0+ 问题处理

/ // 设置最大线程数使用,当运行dex-in-process时,默认为4。// // 对依赖的库进行dex 预处理,提升增量构建速度。

AAAndroid的博客 4678

Unity2021.3.15适配升级Android14

旧的com.google.play.core中有PlayCoreDependencies.xml,声明了对com.google.android.play:core:1.10.3的依赖。新的com.google.play.core中Dependencies.xml,声明了对com.google.android.play:core-common:2.0.4的依赖。(一些Google Play的插件依赖于这个库,可以在升级那些的时候顺便升级,比如com.google.play.review)

凝遥的笔记本 1336

【AGC】关于华为AGC android Gradle8.0适配问题

关于华为AGC android Gradle8.0适配问题。-问题背景:一个cp反馈在安卓开发中android studio最新预览版的gradle为8.0,但是在集成华为AGCsdk时发现不适配问题。集成的服务信息:部分报错信息:com.huawei.agconnect:agcp:1.6.2.300 garadle 8.0 'android.registerTransform' is removed.解决方案:一开始, 按照CP给出的项目中的build.gradle文件中的依赖配置(包括工程根目录和应用根

华为开发者联盟 3514

Android开发必备:AGP与Gradle版本兼容性全解析(官方指南)

本文全面解析Android开发中AGP(Android Gradle Plugin)与Gradle版本的兼容性问题,提供官方最新版本对应关系表(2025年)及历史版本兼容性指南。文章详细介绍了如何正确配置和升级版本,解决常见构建错误,并给出最佳实践建议,帮助开发者避免因版本不匹配导致的构建失败问题。

nice1的博客 654

Proteus课设原理图及报告

1. I/O 口:32 个可编程 I/O 引脚,分成 4 个并行 I/O 端口 (P0, P1, P2, P3),P0 功能段选 a、b、c、d、e、f、g、dp 使其中部分点亮,P2 功能为位选 1、2、4.按键操作分析:P3.0-设置时钟的时间,P3.1-确定更改的时钟时间,P3.2-对。时钟设置标志 0 不设置,1 设置时,2 设置分,3 设置秒。P3.0 按下的次数对应 不设置,设置时,设置分,

2303_76688805的博客 1184

Android问题记录 - 适配Android Studio Ladybug/Java 21/AGP 8.0(持续更新)

Failed to transform core-for-system-modules.jar to match attributes

crasowas的博客 9917

ROS2实战:手把手教你用walking机器人仿真实现医院多楼层自动配送(含实时地图切换)

本文详细介绍了如何利用ROS2和walking机器人仿真平台实现医院多楼层自动配送系统,重点讲解了动态地图切换技术和多楼层导航的实现方法。通过实时加载地图和优化电梯过渡策略,解决了医院复杂环境下的自主配送难题,为医疗物流自动化提供了实用解决方案。

weixin_29090917的博客 365

适配 AGP8.5 版本,字节码转换(二)

今日图片时间:2025.02.14 周五地点:深大地铁站。

Primer5 1080

一口气看完TransformerXL详细解释带代码一:相对位置编码

相对位置编码(Relative Position Encoding)是Transformer模型中用于捕捉序列元素间相对位置关系的一种方法,与绝对位置编码(如BERT中的固定位置嵌入)不同,它直接建模元素之间的相对距离,从而更灵活地处理长序列或不同长度的序列。1. 为什么需要相对位置编码?​。

m0_73426548的博客 1427

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

Android中AGP各个版本都有哪些特性以及升级时需要注意的问题

Android AGP各个版本的特性

liupengcaho的博客 2808

代谢组数据分析(三):代谢组降维分析

本文详细介绍了代谢组学中常用的降维分析方法,包括PCA、PLS-DA和OPLS-DA。PCA通过线性变换降低数据维度,便于数据可视化和异常值检测;PLS-DA是一种有监督的模式识别方法,适用于分类和预测;OPLS-DA通过正交分解避免过拟合,更准确地筛选差异代谢物。降维分析在揭示样本间差异和发现生物标志物方面具有重要意义

专注生信领域 3791

升级Android Gradle 插件(AGP)

是保持项目兼容性、性能优化和新功能支持的重要步骤,但升级过程中可能面临依赖冲突、API 废弃、构建配置失效等问题。通过系统化的升级流程和风险控制,可高效完成 AGP 版本升级,同时确保项目稳定性和可维护性。AGP 每次升级会废弃旧配置,需逐项替换。AGP 版本与 Gradle 版本强绑定,需按。

wy676579037的专栏 3313

外设测试 - ATAES132A 加解密芯片测试

原理 使用芯片官方提供的读写操作库,进行先写后读并校验,确认数据一致。 示例代码 int main(void) { uint8_t ret; aes132p_enable_interface(); ret = write_memory_test(); if (ret != AES132_FUNCTION_RETCODE_SUCCESS) { aes132p_disable_interface(); printf

一个软件工程师的技术笔记 859

【WRF数据准备】土地利用数据-MODIS MCD12Q1数据下载及制备

【WRF数据准备】MODIS静态地理数据下载及制备

WW、forever的博客 3413

适配 AGP8.5 版本,各种问题(三)

地点:深圳、西丽湖环湖碧道时间:2025年2月23日。

Primer5 1256

【OpenClaw从入门到精通】第24篇:OpenClaw Skill商业化实战指南——从0开发付费技能,在ClawHub变现(2026实测版)

本文聚焦OpenClaw Skill商业化的全流程落地,基于2026年生态现状、公开行业报告及开发者指南,拆解付费Skill的市场机会、商业模式、技术实现、发布运营及避坑要点。核心围绕“Freemium API Backend”主流路径,通过虚拟但贴合真实场景的“金融研报复现”案例,提供从需求分析、定价设计到代码开发、ClawHub上架的完整实操方案。文中包含可直接复用的代码片段、执行结果演示及流程图解,既满足新手快速入门的需求,也为进阶开发者提供商业化落地的关键思路,帮助读者抓住AI Agent早期红利。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1086

【Gradle】AGP升级7.0及适配Replugin的多包名工程改造

随着AGP版本以及kotlin的普及,以及compose逐渐被大家接受,为了可以使用更多的新特性以及更好的性能,升级Android Gradle Plugin(AGP)以及Kotlin Gradle Plugin (KGP)已经是必不可少的步骤之一,其中AGP版本7.0、8.0的更新有较大的变化,本文会对自己的玩安卓项目进行AGP7.0的升级并且分享最近遇到的多包名工程化改造以及适配遇到的问题。

weixin_41802023的博客 3311

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

AGP 8.0 适配 ---- jvm target compatibility

这个属性与Gradle JDK的版本设置是不同的。AGP升级的过程,主要是Gradle JDK的版本的修改,所以为了尽量不影响代码功能,我们应该为java和kotlin代码指定具体的jvmTarget,这个Gradle JDK的升级,只需要适配编译脚本的jdk兼容性,而不需要考虑代码的jdk兼容性。Gradle JDK的选择决定了在构建过程中使用的Java版本。大家从上图可以看出,每次Android编译系统AGP的升级,尤其是大版本的变动,都会导致Jdk的升级,而jdk升级,很容易导致编译出错。

zhuzhumouse的专栏 3166

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android studio升级AGP需要注意哪些

deep seek回答:深度思考完成 用时26秒嗯,用户询问的是在Android Studio中升级AGP需要注意哪些事项。这个问题很实用,因为AGP升级确实是个容易踩坑的过程。让我看看搜索结果里有什么关键信息。首先注意到搜索结果里有几个高可信度的资料专门讲AGP升级注意事项12。核心要点包括环境兼容性检查:AGP版本必须和Gradle版本匹配,比如AGP 8.x需要Gradle 8.x1。JDK版本也很关键,AGP 8.x要求JDK 17,而7.x支持JDK 1116。

yzpbright的博客 1945

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

升级适配AGP 7.0

各位大佬,提早祝大家新年快乐。年初了,我们打算升级下apg,这样之后就拥抱下了!!想用comopse有两个必选项agp7.0和kotlin版本1.5.31.

chuyouyinghe的专栏 1416

AGP 8.5.1升级指南:解决Android 16K Page Size适配中的常见问题

本文详细解析了升级AGP 8.5.1以适配Android 16K Page Size的完整实战流程。针对动态库(.so文件)对齐问题,提供了从问题诊断、依赖溯源到分步修复的系统性解决方案,帮助开发者彻底攻克兼容性难题,确保应用在新设备上稳定运行。

resnet7explorer的博客 364

AGP 8.x vs AGP 9.x 稳定性对比, AGP 3.5.4项目迁移到 AGP 8.13

<think>我们根据要求:根据以下内容,生成≤150字的文章摘要。内容是关于AGP 8.x vs 9.x稳定性对比和迁移分析。需要提炼核心要点。注意字数限制。输出摘要。</think>AGP 8.13作为8.x最终版,经过两年迭代极其稳定,社区生态完善;而AGP 9.x虽为最新,但破坏性变更多、强制内置Kotlin,且第三方插件兼容性差。对纯Java项目,建议分步迁移至AGP 8.13(需改namespace、JDK 17、DSL等),暂缓升级9.x,待生态成熟后再考虑。

白高林的专栏 349

Android Studio中AGP 与 Gradle 的区别

在 Android Studio 中,(简称 AGP)与Gradle是两个紧密相关但不同的构建组件,它们之间有。

photoshopjava的博客 1879

从AGP 7.4升级到8.13实战:老项目迁移完整流程与采坑记录

本文详细记录了企业级Android电商项目从AGP 7.4升级至8.13的完整实战流程。文章重点阐述了升级前的战略准备、核心组件(如Gradle、Kotlin)的版本对应关系对齐,并系统总结了迁移过程中遇到的典型问题(如BuildConfig默认关闭、kotlin-android-extensions废弃)及其解决方案,为大型老项目的平稳迁移提供了宝贵经验。

r7s8t的博客 673
上一篇: AGP8 混淆打包,反射实例化启动闪退
下一篇: 适配 AGP8.5 版本,字节码转换(二)
Primer@.com
博客等级 码龄9年 524粉丝 292原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值