Gradle8.0中Transform的替代方案

本文详细描述了如何在Gradle8.0环境下开发一个针对程序分析的路由插件,涉及注解、路由管理、ASM插桩和HuiRouterApi的使用,展示了从注解标记到路由跳转的完整流程。

一、路由插件设计思路

Transform在Gradle8.0中被移除了,从官方文档《Android Gradle 插件 API 更新》中可知并没有提供直接的替代Api,而是区分不同场景提供了几种对应的解决方案。在上篇文章《基于Gradle8.0的插件开发》中,基于Gradle8.0最新版本重新梳理了插件的使用方式和自定义流程,最后写了一个模拟页面打点统计的Demo来实现比较简单的基于“转换字节码”场景的插件开发。本文以路由信息收集为例继续阐述如何开发一个针对“基于整个程序分析的转换”场景的插件。该案例专注于插件开发的流程,而不会涉及到登录校验、服务发现、跳转拦截器等方面的内容,有兴趣的同学可以自行实现。

先定义一个注解,用来标记页面的路由信息,在定义一个路由管理类,用来存储路由信息并对外提供跳转功能。在工程中添加hui_aop模块,创建HuiRouterPath注解 和 HuiRouterApi路由管理类。在Gradle插件中对HuiRouterApi进行插桩,添加插入路由信息的字节码指令,在程序运行时,插桩的字节码指令执行,路由信息被注册到HuiRouterApi内部的路由表中,然后外部就可以通过HuiRouterApi进行跳转操作了。

​在工程的hui_plugin模块中,添加HuiRouterPlugin插件 和 HuiRouterTask任务,处理注解扫描、路由表信息收集,通过ASM向 HuiRouterApi类中插入生成路由表的字节码指令。修改后,所有输入的class 和 jar会重新生成中间产物classes.jar(全路径:gradle80-plugin-demo/app/build/intermediates/classes/debug/ALL/debugHuiRouterTask/classes.jar)传递给下个任务继续打包流程,最终打出一个可运行的APK包。

插件工作流程图:

在这里插入图片描述

二、路由插件实现流程

1、新建一个module模块hui_aop
在这里插入图片描述

2、定义注解HuiRouterPath用于标记路由信息

@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class HuiRouterPath(
    val path: String = "" //路由表中的path
)

3、定义路由管理类HuiRouterApi

object HuiRouterApi {
   
   //存储跳转路由表
    private val routerPathMap = mutableMapOf<String, String>()/**
     * 注册跳转路由
     */
    private fun addRouterPath(key: String?, path: String?) {
   
   
        if (key != null && path != null) {
   
   
            routerPathMap[key] = path
        }
    }/**
     * 页面跳转
     */
    fun routerPath(context: Context, routerTargetPath: String) {
   
   
        routerPathMap[routerTargetPath]?.takeIf {
   
   
            it.isNotEmpty()
        }?.run {
   
   
            context.startActivity(Intent(context, Class.forName(this)))
        }
    }/**
     * 打印routerPathMap
     */
    fun printRouterPathMap() {
   
   
        routerPathMap.forEach {
   
    entry ->
            Log.e("HuiRouterApi", "routerPathMap entry -> $entry")
        }
    }
}

​4、定义一个Task任务类HuiRouterTask,将输入的jar文件和class文件进行插桩修改,并输出到output。扫描过程中,收集的路由信息记录到annotationPathMap中

abstract class HuiRouterTask : DefaultTask
Android Studio 中使用 Gradle 8.0 配置 Maven 仓库,主要需要调整 `settings.gradle.kts` 文件中的配置方式。Gradle 8.0 对项目结构和仓库管理进行了部分改进,因此与早期版本的写法有所不同。 ### 在 `settings.gradle.kts` 中配置 Maven 仓库 对于使用 Kotlin DSL 的项目(即 `settings.gradle.kts`),应通过 `dependencyResolutionManagement.repositories` 块来定义全局的依赖仓库: ```kotlin dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() maven { url = uri("https://maven.aliyun.com/repository/public") } maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") } maven { url = uri("https://maven.aliyun.com/repository/google") } } } ``` 该配置将确保整个项目及其子模块都能访问这些 Maven 仓库[^1]。 ### 在 `build.gradle.kts` 中配置插件仓库(可选) 如果希望为特定模块或构建脚本单独指定仓库,可以在 `build.gradle.kts` 文件中添加: ```kotlin buildscript { repositories { google() mavenCentral() maven { url = uri("https://maven.aliyun.com/repository/public") } } } ``` 此方法适用于某些插件或库仅需局部生效的情况[^2]。 ### 注意事项 - 如果遇到网络问题导致 Gradle 插件下载失败(如 Read Timed Out),可以优先尝试使用国内镜像源,例如阿里云提供的 Maven 仓库地址。 - 确保 `repositoriesMode.set(...)` 设置为合适的模式,避免因仓库冲突而导致依赖解析失败。 - 使用 `uri()` 函数设置 URL 是 Gradle 8.0 推荐的方式,以保证更好的兼容性和类型安全。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值