Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

关于宿主类的父classloader运行时会变更问题

Open zhuqichao opened this issue 2 years ago • 2 comments

开发中偶然发现如下问题: 正常情况下,宿主中的类classloader的子父关系如下: class -> PathClassLoader -> BootClassLoader 但是加载了一个运行在宿主进程的插件后,宿主中的类classloader的子父关系发生改变: class -> PathClassLoader -> DynamicRuntime$RuntimeClassLoader -> BootClassLoader

请问这种情况是预期设计吗?是否会对宿主中的类产生影响?

zhuqichao avatar May 09 '22 07:05 zhuqichao

这是设计预期的。代码在这里:https://github.com/Tencent/Shadow/blob/master/projects/sdk/dynamic/dynamic-host/src/main/java/com/tencent/shadow/dynamic/host/DynamicRuntime.java

这一步是为了把声明在宿主manifest中的壳子(代理)Activity等代码动态化。但这一步不是非常有必要了。

这部分代码动态化有两个作用:

  1. 减少对宿主的安装包方法数增量、dex大小增量。
  2. 补充缺失的代理方法。

目前app对方法数增量已经不敏感了。Activity的代理方法也是通过自动化生成的,一般也不会缺少什么方法,动态更新的需求很小。所以这部分动态化的代码的动态需求几乎和宿主中无法动态更新的manifest一样了。

shifujun avatar May 09 '22 09:05 shifujun

对宿主中的类影响仅限于多了一层ClassLoader。不过由于PathClassLoader中的类基本上会被OAT优化,其加载类时一般不会遵循ClassLoader的查找类逻辑。所以我认为影响不大。

shifujun avatar May 09 '22 09:05 shifujun