转载请注明链接: https://blog.csdn.net/feather_wch/article/details/88148286
Replugin插件化框架原理简介
版本号:2019-03-11(23:05)
简介
为什么需要插件化?
1、为什么需要插件化?
- 发布不够灵活
- 安装包过大
- 模块不够独立,耦合度高。
导致插件化不稳定的根源在哪?
2、导致插件化框架不稳定的根源在哪?
- Hook太多—
修改了太多的系统API
- 市面上可以hook的内容:
- AMS
- Instrumentation
- System-Services
- PackageManager
- ContextImpl
- Resources
3、哪些情况可能会导致Hook引起稳定性问题?
- Android升级
- ROM修改
- Hook的使用不当,Hook点选择不正确
4、Hook要越少越好!
5、总结插件化稳定的方法
- Hook一处:宿主的ClassLoader
- DexClassLoader原生
- Resources原生
- PluginContext非Hook,new出来的
- 坚持
真正、长久的稳定
,大量适配过、非长久的稳定是伪稳定
如何解决不灵活的问题?
1、灵活的目标
- 插件组件随意增改
- 新插件直接用
- 主程序长期不发版本
- 自由设置进程
大项目才使用插件化?
1、大项目才使用插件化?
- 插件 = 免安装应用
- 基础放在主程序中,放心
- 迁移成本高
2、全面插件化
- 自由、独立发布
- 应用“积木化”
- 宿主/插件交互简单
Hook技术
PathClassLoader的Hook
1、RePlugin如何通过Hook实现插件化?
- 仅仅Hook ClassLoader
- 最终使用本身的
RepluginClassLoader
Application.mBase.mPackageInfo.mClassLoader
= new RepluginClassLoader();
2、RePlugin Hook的ClassLoader仅仅更改了loadClass,其他的都直接透传。
- 系统原生的四大组件等内容,通过
Hook的RepluginClassLoader
的loadClass()
方法转换成插件所需要的内容,并交给系统。loadClass()
里面有PitManager、HookingClassManager
进行处理
3、ClassLoader一定要继承自PathClassLoader
- 防止 Android 7.x 因使用 addDexPath 而有问题。
- 除此之外,此 ClassLoader 所在位置也非常稳定。目前来看,从 Android 2.1 至今都没有发生过位置、名称上的变化,可以长期使用。
Dex的Hook
3、RePlugin中不对Dex进行Hook
- 使用原生的
DexClassLoader
- 为了支持使用宿主类