Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(core): 支持AGP 8.0+所需的新版Transform API #1262

Merged
merged 3 commits into from
Dec 5, 2023

Commits on Dec 5, 2023

  1. build: 升级Shadow工程自身依赖AGP版本到7.4.2, Gradle到7.5, JDK到17

    7.4.2是最高的7.4版本。升级到这个版本主要是为升级到AGP 8.0做准备。
    
    同时对应升级Gradle到7.5版本。此版本Gradle可同时兼容JDK 11和17,也是AGP 8.0要求的JDK版本。
    
    升级CI环境到JDK 17.
    
    进一步统一Android模块相关版本定义到统一到versions.properties文件中。
    
    Tencent#1212
    shifujun committed Dec 5, 2023
    Configuration menu
    Copy the full SHA
    3dade11 View commit details
    Browse the repository at this point in the history
  2. refactor(core.transform-kit): 简化代码,并剥离对旧Transform API的依赖到Wrapper类

    ClassTransform是抽象的,它不知道字节码编辑工具是Javassist,也不知道Transform框架是AGP的还是Gradle的。
    它定义了TransformInput,由外部Transform框架的适配器(如DeprecatedTransformWrapper)将外部Transform
    框架的输入适配进来。
    
    TransformInput支持DIR和JAR两种输入,对应ClassTransform.input中通过TransformInput拿到输入的class文件或
    jar文件,然后交给loadDotClassFile和loadClassFromJar两个抽象方法加载类到字节码编辑框架中。
    input同时将加载的类名记录到TransformInput.getInputClassNames中,以便output时知道该输出哪些类。
    注意1个TransformInput对应多个Class。
    
    此次简化去掉了InputClass类。这个类之前主要的作用是记录每个输入的class对应的输出文件。
    这个输出文件其实不需要逐个记录路径或者entryname,可以由类名自己拼接出来。
    所以这次简化改为了在output时再根据classname生成文件路径和entryname。
    
    将ctClassInputMap: Map<CtClass, InputClass>改为allInputCtClass: Set<CtClass>
    ,去掉renameOutput方法,都是因为早在 f1d0f5b 引入新的Fragment支持方案时,
    就不再需要修改输出类名。也就是现在所有Transform操作都不会影响输入的类名,也不会增加或减少类。
    因此不再需要将控制输出文件的InputClass传给TransformManager。
    
    最后将对已经Deprecated,即将在AGP 8中删除的Transform API的依赖代码都移到DeprecatedTransformWrapper中。
    
    Tencent#1212
    shifujun committed Dec 5, 2023
    Configuration menu
    Copy the full SHA
    671592d View commit details
    Browse the repository at this point in the history
  3. feat(core): 支持AGP 8.0+所需的新版Transform API

    GradleTransformWrapper对接新版API实现的是最基本的全量输入和输出功能。
    没有实现增量编辑的能力,也没有对齐旧版API中在getSecondaryFiles中将自身代码加入,
    以便开发中更新transform代码可触发重新执行transform。
    因此使用GradleTransformWrapper开发transform时可能需要手动clean。
    
    ShadowPlugin加入了hasDeprecatedTransformApi检测,
    只在判断出AGP主版本号大于等于8时才会应用GradleTransformWrapper。
    
    增加了projects/test/gradle-plugin-agp-compat-test中对AGP 8.0+已知版本的自动化测试。
    
    resolve Tencent#1212
    shifujun committed Dec 5, 2023
    Configuration menu
    Copy the full SHA
    8ac6b1f View commit details
    Browse the repository at this point in the history