一、replugin 是360 第2代插件库(上一代是droidplugin) ,兼容性、稳定性及侵入性方面都做了很大改良和优化,当然DroidPlugin 也是一个优秀的插件库(作者张勇也是技术大牛,在Android插件化领域,很影响力)
先说一下RePlugin的主要优势哈
1.十分灵活:主程序无须在Android市场升级,支持四大组件
2.及其稳定:hook点仅有一处(classLoader),崩溃率低于万分之一
3.兼容性比第1代库大幅度提示,几乎覆盖所有4.4及其以上Android系统
二、套话说到这,聊点核心技术哈
1.关于classLoader打破双亲委派 (classLoader加载class 先查看父classloader是否加载过,递归,如果直到根classLoader也没加载过,就自己加载咯),宿主用的classloader 实际是pathclassloader,插件用的是dexclassLoader 加载外部apk或dex。看了部分源码我的理解是宿主加载依然用系统的pathclassload 把宿主占坑的四大组件 加载进来,从这个PluginContainer对应集合里找出要调用的插件中的四大组件,因为插件的东西相对于宿主apk 而言是外部的,只能扩展dexclassLoader去加载插件里对应的四大组件。宿主和插件,是平行的关系。宿主给自己找了一些兄弟,这些兄弟帮自己加载不属于宿主中的四大组件。Hook点仅有一处(ClassLoader)。
2.、拿startActivity For example
启动插件Activity可以从RePlugin.startActivity开始,startActivity经历了Factory、PmLocalImpl,其实大部分启动的逻辑其实主要在PmInternalImpl中。关键在于loadPluginActivity。这里获取了插件对应的坑位,然后保存了目标Activity的信息,通过系统启动坑位。因为已经Hook住了ClassLoader,在loadClass时再加载出目标Activity,这样坑位中承载的,便是绕过系统打开的目标Activity(插件里的activity)。如下或许帮助理解:
RepluginActivity-->Factory.startActivity-->PmlLocalImp.startActivity-->PmlInternalImpl.startActivity
-->PmlLocalImpl.loadPluginActivity-->宿主系统startactivity--》pluginActiivty等--》回到宿主PmBase的PmlInternalImpl