背景
我们有一个需求:宿主会传递一个 WebView 给插件使用,WebView 有时需要启动 Dialog。Dialog 需要 FragmentActivity 或 AppCompatActivity 作为 Context,而当前 PluginContainerActivity 继承自普通 Activity,导致 Dialog 无法正常弹出。
因此我尝试将 PluginContainerActivity 改为继承 FragmentActivity。
已完成的修改
- 修改
ActivityCodeGenerator.kt,将 GeneratedPluginContainerActivity 的父类从 Activity 改为 FragmentActivity
- 添加
FragmentActivity stub 类用于编译
- 处理
ComponentActivity 的 final 方法(如 onRetainNonConfigurationInstance)
- 解决
KeyEventDispatcher 导致的无限递归问题(覆写 superDispatchKeyEvent)
遇到的问题
在 sample 项目中测试正常,但在实际项目中遇到以下问题:
问题 1:使用 compileOnly 依赖时类找不到
在 plugin-runtime 中使用 compileOnly 'androidx.fragment:fragment:1.4.1',加载插件时报错:
Failed resolution of: Lcom/tencent/shadow/core/runtime/container/PluginContainerActivity;
问题 2:使用 implementation 依赖时方法不可访问
改为 implementation 'androidx.fragment:fragment:1.4.1' 后,启动时崩溃:
Method 'androidx.lifecycle.LifecycleEventObserver androidx.lifecycle.Lifecycling.lifecycleEventObserver(java.lang.Object)' is inaccessible to class 'androidx.lifecycle.LifecycleRegistry$ObserverWithState' (declaration of 'androidx.lifecycle.LifecycleRegistry$ObserverWithState' appears in /data/app/~~ZsI_dEdXQCfBzCzBCwZ9fg==/com.netease.gl-T_n2e4Q6M7HhQCr2S2jokw==/base.apk)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.<init>(LifecycleRegistry.java:353)
at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.java:180)
这个错误看起来是宿主和插件的 androidx.lifecycle 类存在版本冲突或类加载器隔离问题。
问题
- 我的修改方向是否有问题?作者能给一个大概要修改的类的路线吗?
- 如果要让
PluginContainerActivity 继承 FragmentActivity,在 Shadow 框架中还有需要注意哪些地方?
环境信息
- Shadow 版本:基于 2024-12-25 的 master 分支(commit 09e7e0a)
- androidx.fragment 版本:1.4.1
背景
我们有一个需求:宿主会传递一个 WebView 给插件使用,WebView 有时需要启动 Dialog。Dialog 需要
FragmentActivity或AppCompatActivity作为 Context,而当前PluginContainerActivity继承自普通Activity,导致 Dialog 无法正常弹出。因此我尝试将
PluginContainerActivity改为继承FragmentActivity。已完成的修改
ActivityCodeGenerator.kt,将GeneratedPluginContainerActivity的父类从Activity改为FragmentActivityFragmentActivitystub 类用于编译ComponentActivity的 final 方法(如onRetainNonConfigurationInstance)KeyEventDispatcher导致的无限递归问题(覆写superDispatchKeyEvent)遇到的问题
在 sample 项目中测试正常,但在实际项目中遇到以下问题:
问题 1:使用 compileOnly 依赖时类找不到
在
plugin-runtime中使用compileOnly 'androidx.fragment:fragment:1.4.1',加载插件时报错:问题 2:使用 implementation 依赖时方法不可访问
改为
implementation 'androidx.fragment:fragment:1.4.1'后,启动时崩溃:这个错误看起来是宿主和插件的
androidx.lifecycle类存在版本冲突或类加载器隔离问题。问题
PluginContainerActivity继承FragmentActivity,在 Shadow 框架中还有需要注意哪些地方?环境信息