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

Conversation

shifujun
Copy link
Collaborator

@shifujun shifujun commented Dec 4, 2023

分3个提交来支持AGP 8.0+。

  1. 升级自身构建环境到支持新版API的AGP 4.7.2。这个AGP版本同时可以使用新旧两套API。
  2. 重构简化原有代码,给支持新API提供便利。
  3. 支持新版API,加上自动化测试。

resolve #1212

@shifujun shifujun marked this pull request as draft December 4, 2023 10:24
@shifujun shifujun force-pushed the new_transform_api branch 5 times, most recently from 87260ff to b22c3e8 Compare December 4, 2023 14:35
@shifujun shifujun self-assigned this Dec 4, 2023
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
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
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 shifujun changed the title WIP: 支持AGP 8 feat(core): 支持AGP 8.0+所需的新版Transform API Dec 5, 2023
@shifujun shifujun marked this pull request as ready for review December 5, 2023 11:27
@shifujun shifujun merged commit 8bac299 into Tencent:master Dec 5, 2023
9 checks passed
@shifujun shifujun deleted the new_transform_api branch December 5, 2023 12:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

什么时候支持 agp 8.0
1 participant