feat: 保持Fragment类型不变的情况下支持Fragment正常工作 #312
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fragment支持的相关代码是非常早期的代码。当时对字节码编辑还不是很熟练。
由于插件Activity变成了ContainerActivity持有的普通类ShadowActivity,而插件Fragment会被直接添加到ContainerActivity上,造成插件Fragment中取得的Activity都是ContainerActivity,而原本预期应该获得插件原本的Activity对象。为了解决这个问题,当时将Fragment的父类都改成了ShadowFragment普通类,又搞了一个ContainerFragment。又连带着搞出了PluginFragmentManger。由于Fragment的父类是普通类了,所以Fragment上原本的方法都要一个一个实现,Shadow也没能都实现。
总之之前的Fragment实现代码效果不尽如人意。其实Shadow开发到后期,解决了更多问题之后,一直就知道这个Fragment的实现方式应该是可以优化的,应该是可以保持Fragment类型不变的。最近终于挤出了点时间重构这里。
初步实现的代码工作得还比较正常,由于写了自动化测试,所以还比较有信心。
——————
对Fragment中涉及Activity类型的方法进行字节码编辑,在调入调出前后相互转换ContainerActivity和PluginActivity。
现在Fragment不会被改名,所以能正常Debug了。
测试用例考虑了如下情况:
1.Fragment是系统Fragment的直接子类、间接子类;
2.Fragment父类是DialogFragment(父类是系统类);
3.Fragment以代码方式添加和Xml方式添加;
4.Fragment作为其他Fragment的父类;
5.Fragment的父类只Override了Context版本或Activity版本的方法,或者同时Override了。
6.测试了API28和API19两款模拟器;
fix #168
related issues: #307, #285, #242, #243, #165, #151, #115, #24