Shadow
Shadow copied to clipboard
关于宿主类的父classloader运行时会变更问题
开发中偶然发现如下问题: 正常情况下,宿主中的类classloader的子父关系如下: class -> PathClassLoader -> BootClassLoader 但是加载了一个运行在宿主进程的插件后,宿主中的类classloader的子父关系发生改变: class -> PathClassLoader -> DynamicRuntime$RuntimeClassLoader -> BootClassLoader
请问这种情况是预期设计吗?是否会对宿主中的类产生影响?
这是设计预期的。代码在这里:https://github.com/Tencent/Shadow/blob/master/projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/DynamicRuntime.java
这一步是为了把声明在宿主manifest中的壳子(代理)Activity等代码动态化。但这一步不是非常有必要了。
这部分代码动态化有两个作用:
- 减少对宿主的安装包方法数增量、dex大小增量。
- 补充缺失的代理方法。
目前app对方法数增量已经不敏感了。Activity的代理方法也是通过自动化生成的,一般也不会缺少什么方法,动态更新的需求很小。所以这部分动态化的代码的动态需求几乎和宿主中无法动态更新的manifest一样了。
对宿主中的类影响仅限于多了一层ClassLoader。不过由于PathClassLoader中的类基本上会被OAT优化,其加载类时一般不会遵循ClassLoader的查找类逻辑。所以我认为影响不大。