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

处理androidx.core.graphics.TypefaceCompatApi29Impl时出错 #411

Closed
yiwanganjing opened this issue Sep 21, 2020 · 5 comments · Fixed by #412
Closed

处理androidx.core.graphics.TypefaceCompatApi29Impl时出错 #411

yiwanganjing opened this issue Sep 21, 2020 · 5 comments · Fixed by #412
Labels
bug Something isn't working

Comments

@yiwanganjing
Copy link

处理androidx.core.graphics.TypefaceCompatApi29Impl时出错:javassist.CannotCompileException: createFromFontFamilyFilesResourceEntry (Landroid/content/ConLandroidx/core/content/res/FontResourcesParserCompat$FontFamilyFilesResourceEntry;Landroid/content/res/Resources;I)Landroid/graphics/Typeface; in androidx.core.graphics.TypefaceCompatApi29Impl: failed to resolve types
Task :app:transformClassesWithShadowTransformForDebug in app Finished

Caused by: javassist.CannotCompileException: createFromFontFamilyFilesResourceEntry (Landroid/content/Context;Landroidx/core/content/res/FontResourcesParserCompat$FontFamilyFilesResourceEntry;Landroid/content/res/Resources;I)Landroid/graphics/Typeface; in androidx.core.graphics.TypefaceCompatApi29Impl: failed to resolve types
at javassist.CodeConverter.doit(CodeConverter.java:542)
at javassist.CtClassType.instrument(CtClassType.java:1481)
at com.tencent.shadow.core.transform.specific.InstrumentationTransform$setup$2.transform(InstrumentationTransform.kt:57)
at com.tencent.shadow.core.transform_kit.AbstractTransformManager.fireAll(AbstractTransformManager.kt:41)
at com.tencent.shadow.core.transform_kit.AbstractTransform.onTransform(AbstractTransform.kt:61)
at com.tencent.shadow.core.transform_kit.ClassTransform.transform(ClassTransform.kt:173)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:284)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:247)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:106)
... 92 more

@shifujun
Copy link
Collaborator

你用的这个androidx的版本需要compileSDK的版本至少29才行。

你要么降低点androidx的版本,要么把compileSDK升到29。

第三方库里存在一些设计上就不需要使用的类,没法重新编译,我需要考虑下怎么在Transform里自动兼容这种情况。

@shifujun shifujun added the bug Something isn't working label Sep 21, 2020
shifujun added a commit to shifujun/Shadow that referenced this issue Sep 21, 2020
之前有些Transform的filter没有调用allCanRecompileAppClass方法,直接传入了allInputClass。
这不但使Transform的速度有些慢,还导致一个本来不需要处理的类,当它不可编译时(引用了不存在的类)导致Transform失败。

fix Tencent#411
@shifujun
Copy link
Collaborator

#412 合入的话,你的业务构建应该就不用任何修改了。我测试在28版本sdk下编译androidx的1.3.1版本能复现问题。修复后不会复现问题了。

@shifujun
Copy link
Collaborator

额,修复失败了。单元测试是真好用,测出来了我的修复问题。。。我再想想吧。

需要一个高效的办法确定一个类是否能重新编译。

失败的case是调用了Fragment.startActivity的类,可能根本没引用Fragment类型,而是引用了Fragment的子类。

@yiwanganjing
Copy link
Author

我现在确实改了版本就没问题了,等你改好了我更新下试试

shifujun added a commit to shifujun/Shadow that referenced this issue Sep 22, 2020
CodeConverter在重写Method实现时需要rebuildStackMap。在这个过程中,只有涉及泛型具有多个下界时,
Javassist试图帮我们找出多个下界的共同父类型作为新的下界。这时才会需要加载CtClass。
所以,并不是所有找不到的类型都会引起rebuildStackMap失败。

由于我们的逻辑不会涉及修改找不到的类型的行为、甚至修改它们的父类型,
所以在这种场景下直接将找不到的类型构造出来,即假设它们的父类是Object类型。

fix Tencent#411
shifujun added a commit that referenced this issue Sep 22, 2020
CodeConverter在重写Method实现时需要rebuildStackMap。在这个过程中,只有涉及泛型具有多个下界时,
Javassist试图帮我们找出多个下界的共同父类型作为新的下界。这时才会需要加载CtClass。
所以,并不是所有找不到的类型都会引起rebuildStackMap失败。

由于我们的逻辑不会涉及修改找不到的类型的行为、甚至修改它们的父类型,
所以在这种场景下直接将找不到的类型构造出来,即假设它们的父类是Object类型。

fix #411
@shifujun
Copy link
Collaborator

已经合入了。再试试吧。我认为我这次是修复了一个一直存在的兼容性问题。

shifujun added a commit to shifujun/Shadow that referenced this issue Oct 25, 2021
这里很久不需要改动了。并且引入这个测试需要多依赖一个低版本的SDK(API 28),使IDE索引变麻烦。

Tencent#411
shifujun added a commit to shifujun/Shadow that referenced this issue Oct 25, 2021
这里很久不需要改动了。并且引入这个测试需要多依赖一个低版本的SDK(API 28),使IDE索引变麻烦。

Tencent#411
shifujun added a commit that referenced this issue Oct 25, 2021
这里很久不需要改动了。并且引入这个测试需要多依赖一个低版本的SDK(API 28),使IDE索引变麻烦。

#411
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants